По вашему запросу Оригинальный пост здесь Как скрыть строки на основе значения ячейки
Я получил VBA ниже от Теда D, после вопроса, который я разместил здесь. К сожалению, это не работает полностью:
• После того, как я вставил первое число (но не 0) в ячейку столбца B, все строки, которые имеют ноль в этом столбце, скрыты - и это здорово.
• Проблема в том, и, пожалуйста, извините, что я не упомянул об этом с самого начала, что каждый раз, когда я использую этот лист, несколько ячеек в столбце B должны быть заполнены числами больше 0. Таким образом, было бы очень полезно скрыть строки, которые содержат 0 в столбце B, после того, как я заполнил все остальные ячейки, которые мне нужны.
• Я думал, что, может быть, если есть условие - строки с 0 в столбце B будут скрыты только после заполнения определенной объединенной ячейки текстом? Я не знаю, возможно ли это, но у меня нет другой идеи.
Это 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 - объединенные ячейки в каждом ряду.
• Говоря о прикрепленном примере: мне нужно, чтобы строки с Text2, Text 4 и Text 5 были скрыты автоматически, потому что в столбце B значение этих строк равно нулю.
ВАЖНЫЙ! - при каждом использовании рабочего листа строки, имеющие 0 в столбце B, различаются. Не всегда одно и то же. Кроме того, эта автоматизация должна применяться только к определенному выделению в документе (скажем, от 45 до 135 строк).