我是VBA的新手,我正在尝试优化电子表格以便工作。
最终,我正在尝试编写一个查找隐藏行的脚本。如果隐藏了一行,则该行中“O”列中的单元格应为空白。这就是我所拥有的(这不起作用,可能完全错误):
Dim rng As Range
Dim c As Range
Set rng = Range("A1:A1500")
For Each c In rng
If c.EntireRow.Hidden = True Then
ActiveCell.Offset(0, 14).Activate
ActiveCell.Value = ""
End If
Next c
感谢您的帮助! 金
答案 0 :(得分:2)
我总是喜欢用长整数循环并避免使用ActiveCells。如果它会很长,也会关闭屏幕更新。
Dim c As Long
For c = 1 To 1500
If Rows(c).Hidden = True Then
Cells(c, "O") = ""
End If
Next c
答案 1 :(得分:1)
更新:我刚刚对此进行了测试并且有效:
Dim rng As Range
Dim c As Range
Set rng = Range("A1:A1500")
For Each c In rng
If c.EntireRow.Hidden = True Then
Range("O" & c.Row).Value = ""
End If
Next
答案 2 :(得分:0)
如果没有公式并且你想要一个非循环解决方案,你只需运行这个1-liner:
Range("O1:O1500") = Evaluate("INDEX(IF(SUBTOTAL(103,OFFSET(O1,ROW(O1:O1500)-1,)),O1:O1500,""""),)")
OFFSET
只会返回很多#VALUE!
,但仍有单格参考。这是让SUBTOTAL
输出数组(而不是单个值)的关键,其中选项3
只返回数组内所有项目的1,而option + 100
将排除隐藏的行。在IF
中使用此内容对于可见行只有true
,对于隐藏行只有false
。现在true
返回单元格值,而false
只返回一个简单的空字符串。 INDEX
仅用于强制Evaluate
返回一个数组,然后只为该范围设置数组。一次计算中的所有内容都没有任何循环:D