我有一张包含许多公式的工作表,我需要以下操作:当使用此工作表时,如果不同行上的某些单元格填充了除 之外的数字0
,则包含 单元格的行将0
自动隐藏。每次使用该工作表时,都应该使用不同的值执行此操作。
关于所附示例:
- 改变的值在列中
B
D
,E
并且F
是每行上的合并单元格讨论所附的例子:我需要带有 和 的行
Text2
自动Text 4
隐藏Text 5
,因为在B
列中这些行的值为零。
重要提示!- 每次使用工作表时,
0
列中的行B
都是不同的。并非总是相同。此外,此自动化必须仅适用于文档中的特定选择(例如从行45
到135
)。
答案1
这与另一个答案类似,但测试表明,通过在两个事务中完成所有属性更改,性能几乎提高了 1.5 个数量级(70 倍);hideRange.EntireRow.Hidden = True
和各一个unhideRange.EntireRow.Hidden = False
。
文件开头有三个常量,用于指定要隐藏的列、起始行、结束行和值。OP 值已插入。
将以下代码复制到特定的 vba WorkSheet 模块中。此代码将不是从常规模块工作。按Alt-F11打开 Visual Basic 编辑器。按Ctrl-R聚焦/打开项目资源管理器窗格。导航到VBAProject(<file name>)
,Microsoft Excel Objects
然后打开Sheet#(<sheet name>)
隐藏行所在的 。
Private Sub Worksheet_Calculate()
' Hide Rows if row value in watch_Column is hide_On_Value.
' watch_Column must include start_on row number (e.g. A1 or C3)
' Hidden rows, beyond the range of cells with values, may not
' unhide. For speed, only process rows being used <= end_of_watch.
Const watchColumn = "B45" ' Beginning Cell (row and column) to watch.
Const endOfWatch = "135" ' Last row. if "", rest of rows in use.
Const hideOnValue = 0
Dim hideRange As Range
Dim unhideRange As Range
Dim r As Range
Dim seeRow As Boolean
Dim watchStart() As String
Dim lastRow As String
Dim tmpEnableEvents As Boolean
Set r = Me.UsedRange ' call and discard to reset LastCell
With Me.UsedRange
lastRow = .Row + .Rows.Count - 1
End With
If endOfWatch <> "" Then
If Val(lastRow) > Val(endOfWatch) Then lastRow = endOfWatch
End If
watchStart = Split(Me.Range(watchColumn).Address(True, False), "$")
If Val(watchStart(1)) > Val(lastRow) Then Exit Sub
tmpEnableEvents = Application.EnableEvents
Application.EnableEvents = False
For Each r In Me.Range(watchColumn & ":" & watchStart(0) & lastRow)
seeRow = True
If IsEmpty(r) Then
ElseIf CStr(r.Value2) = vbNullString Then
ElseIf r = hideOnValue Then
seeRow = False
If Not r.EntireRow.Hidden Then
If hideRange Is Nothing Then
Set hideRange = r
Else
Set hideRange = Union(hideRange, r)
End If
End If
End If
If seeRow And r.EntireRow.Hidden Then
If unhideRange Is Nothing Then
Set unhideRange = r
Else
Set unhideRange = Union(unhideRange, r)
End If
End If
Next r
If Not unhideRange Is Nothing Then
unhideRange.EntireRow.Hidden = False
End If
If Not hideRange Is Nothing Then
hideRange.EntireRow.Hidden = True
End If
Application.EnableEvents = tmpEnableEvents
End Sub
常规模块变更
- 更改子名称。
- 将所有
Me
对象更改为特定工作表引用。Worksheets("Worksheet Name")
一张工作表的标准。
答案2
我建议最快的方法之一是 VBA(宏)。
笔记,将此代码复制并粘贴到工作表作为标准模块。
Private Sub Worksheet_calculate()
Application.EnableEvents = False
Set Rng = Intersect(UsedRange, Range("D:F"))
If Rng Is Nothing Then GoTo ExitHere
For Each i In Rng
If i.Value = 0 Then
Rows(i.Row).EntireRow.Hidden = True
Else
Rows(i.Row).EntireRow.Hidden = False
End If
Next i
ExitHere:
Application.EnableEvents = True
Exit Sub
End Sub
注意: Range("D:F")
是可编辑的,您可以根据需要调整列引用。