根据您的要求,原始帖子在此处如何根据单元格值隐藏行
我收到了 Ted D 提供的以下 VBA,这是我在此处发布的问题。不幸的是,它不能完全正常工作:
• 在我在 B 列的单元格中插入第一个数字(但不是 0)后,该列中所有包含零的行都被隐藏 - 这很好。
• 问题是 - 请原谅我从一开始就没有提到它 - 每次我使用该工作表时,B 列中的几个单元格都必须填充大于 0 的数字。因此,在我填充了所有其他需要的单元格后,隐藏 B 列中包含 0 的行将会很有帮助。
• 我在想,也许,如果有一个条件 - 仅在某个合并单元格填充了文本后,B 列中为 0 的行才会被隐藏?我不知道这是否可行,但我没有其他想法。
这是 VBA:
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 watchRange = Me.UsedRange ' call and discard to reset LastCell
lastRow = Me.Range(watchColumn).SpecialCells(xlCellTypeLastCell).Row
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
非常感谢您的帮助!
最初的情况是:
我有一张包含许多公式的工作表,我需要实现以下功能:当使用此工作表时,如果不同行上的某些单元格填充了非 0 的数字,则包含 0 单元格的行将自动隐藏。每次使用该工作表时,都应该使用不同的值来实现这一点。关于所附示例:
• 发生变化的值位于 B 列
• D、E 和 F 是每行上的合并单元格
•谈论所附的例子:我需要自动隐藏包含文本2、文本4和文本5的行,因为在B列中这些行的值为零。
重要提示!- 每次使用工作表时,B 列中含有 0 的行都是不同的。并非总是相同。此外,此自动化必须仅适用于文档中的特定选择(例如从第 45 行到第 135 行)。
答案1
我认为最好只是要求 Ted 通过评论他的答案来做出更改。
有多种方法可以实现此目的,您只需决定希望它如何工作。
您可以让文档在0
输入数字时隐藏行:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ProcError
If Not Application.Intersect(Range(Target.Address), Range("B:B")) Is Nothing Then
If Target.Value = "0" Then
Target.EntireRow.Hidden = True
End If
End If
ProcError:
End Sub
您可以使用一个按钮,手动运行隐藏所有行的宏。
(通用循环上的示例代码,比原始宏慢)
Sub hideZero()
Dim searchMe As Range, zero As Range
Set searchMe = ActiveSheet.Range(Range("B2"), Range("B1048576").End(xlUp))
Application.ScreenUpdating = False
For Each zero In searchMe
If zero.Value2 = 0 Then
zero.EntireRow.Hidden = True
End If
Next zero
Application.ScreenUpdating = True
End Sub
这是一个很慢的代码,如果你有很多行,Excel 将会冻结一段时间。
如果你想接受你的建议“仅当某个合并单元格填充了文本后,B 列中值为 0 的行才会被隐藏?”您可以使用第一种方法Worksheet_Change
,但监视该单元格,并让事件运行宏而不是按钮:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim checkMe As Range
Set checkMe = Range("A1") 'Change to Wherever the cell is
On Error GoTo ProcError
If Not Application.Intersect(Range(Target.Address), checkMe) Is Nothing Then
If Not Target.Value2 = "" Then
Call hideZero
End If
End If
ProcError:
End Sub
虽然这可能会让最终用户感到很惊讶,但宏却在没有任何警告的情况下启动了。所以你应该在那里放一个警告。你可以通过将If
调用子程序更改为:
If Not Target.Value2 = "" Then
msgboxResult = MsgBox("Are you sure you want to continue?", vbExclamation + vbYesNo, "Warning!")
If msgboxResult = vbYes Then Call hideZero
End If
答案2
通过这些一次性编辑可以获得所需的行为:
- 将子名称从 更改
Worksheet_Calculate
为Hide_Rows
。 - 将子范围从 更改
Private
为Public
。 - 保存更改。
要更新隐藏的行:
- 对工作表进行编辑。
- 留在隐藏行表上。
- Alt使用-打开宏对话框来隐藏行F8。
- 双击 (跑步)
<sheetName>!Hide_Rows
。
注意:原始答案使用了特定于具有隐藏行的工作表的工作表模块。为了在非活动工作表时运行宏,需要将 Sub(宏)移至通用模块。在这种情况下,应对 Sub 进行额外编辑,Hide_Rows
以便不对活动工作表进行操作,而是过滤具有隐藏行的特定工作表。