vba - Excel VBA 将数据转移到下一个可用行
问题描述
我目前正在研究收入/支出监控excel。我有一个表来监视用户和其他人之间的待处理或未完成的事务。
我的电子表格中的实际表格是静态的,仅从 B52:H66 开始,无论那里输入了多少数据。
为简单起见,假设该表只有三列:NAME、AMOUNT 和 REMARKS。REMARKS 列的每个单元格中都有两个选项按钮:() Pending 和 () Paid。这些按钮链接到它所在的单元格。单击 () Paid 将返回值“1”,而 () Pending 将返回值“2”。
我制作了一个宏按钮,单击该按钮将删除所有带有 () 注释的行。单击该按钮也会将选项按钮更改回 () Pending。但是,我还想在删除 () 付费数据后,将剩余的任何数据向上移动到表中的第一个可用单元格/行。
例如:(为简单起见,仅说 4 个条目)
第 1 行:Ben --- $50 --- () 待定
第 2 行:丹尼 --- 100 美元 --- () 已支付
第 3 行:Fay --- $280 --- () 已支付
第 4 行:黛安 --- 80 美元 --- () 待定
单击宏按钮--->删除所有()付费条目--->结果如下
第 1 行:Ben --- $50 --- () 待定
第 2 行:黛安 --- 80 美元 --- () 待定
从结果来看,Diane 从第 4 行转移到第 2 行,因为第 2 行和第 3 行现在是空白,第 2 行是下一个可用行。
我不知道如何实现这一目标。我尝试进行研究,但似乎找不到合适的代码。一些网站建议删除该行并将单元格向上移动。但我不能这样做,因为该行中的其他数据也将被删除。我只需要删除输入数据而不是行本身。
请参阅表格截图以供参考。
如果您遇到此问题,有什么建议或参考吗?非常感谢!
Sub OUTSTANDING()
If Response = vbNo Then Exit Sub
If Range("H52").Value = 1 Then
Range("B52:G52").Select
Selection.ClearContents
Range("H52").Value = 2
End If
If Range("H53").Value = 1 Then
Range("B53:G53").Select
Selection.ClearContents
Range("H53").Value = 2
End If
If Range("H54").Value = 1 Then
Range("B54:G54").Select
Selection.ClearContents
Range("H54").Value = 2
End If
End Sub
真挚地,
弗里茨
解决方案
使用数组
Sub test()
Dim myRng As Range, i As Variant, j As Variant, n As Variant, ary As Variant
Set myRng = Range("B25:H66")
For i = 1 To myRng.Rows.Count
If myRng.Cells(i, myRng.Columns.Count) <> 1 Then
If Not IsArray(ary) Then
ReDim ary(1 To myRng.Columns.Count, 1 To 1) As Variant
Else
ReDim Preserve ary(1 To UBound(ary, 1), 1 To UBound(ary, 2) + 1) As Variant
End If
For j = 1 To myRng.Columns.Count
ary(j, UBound(ary, 2)) = myRng.Cells(i, j).Value
Next j
End If
Next i
If Not IsArray(ary) Then
With myRng
.Resize(, myRng.Columns.Count - 1).Value = ""
.Resize(, 1).Offset(, .Columns.Count - 1).Value = 2
Exit Sub
End With
Else
If UBound(ary, 2) < myRng.Rows.Count Then
n = UBound(ary, 2)
ReDim Preserve ary(1 To UBound(ary, 1), 1 To myRng.Rows.Count) As Variant
For j = n + 1 To myRng.Rows.Count
ReDim Preserve ary(1 To UBound(ary, 1), 1 To j) As Variant
For i = LBound(ary, 1) To UBound(ary, 1) - 1
ary(i, j) = ""
Next i
ary(UBound(ary, 1), j) = 2
Next j
End If
End If
myRng.Value = Application.Transpose(ary)
End Sub
推荐阅读
- sql-server - SQL Join with an OR Clause
- reactjs - React-route-dom updates url but doesn't render component
- python - 带有 pipenv 的 Pyinstaller
- python - Loading val_acc and val_loss from a saved .h5 cnn saved model
- php - Having variables in a function that I can't echo in HTML
- sql - 查询站点文本字段数据库中的多个字符串
- python - 为什么必须安装 graphviz msi 才能在 Python 上使用 graphviz?
- angular - 使用 RouterTestingModule 和 getCurrentNavigation() 进行 Angular 7 组件测试的问题
- python - 这个函数的真名是什么,它将带有计数器的开始和结束标记添加到列表列表中?
- javascript - Bad request on user signup using passport.js