Я пытаюсь скрыть все строки, содержащие значение "xx" в столбце A и не скрывать строки, содержащие "a" в столбце A. Диапазон от A8:A556. Этот макрос должен запускаться изменением в ячейке C4.
Есть идеи, почему это не работает? Вот текущая попытка:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(True, True) = "$C$4" Then
If Range("A8:A555").Value = "xx" Then
Rows("8:555").EntireRow.Hidden = True
ElseIf Range("A8:A555").Value = "a" Then
Rows("8:555").EntireRow.Hidden = False
End If
End If
End Sub
Спасибо!
РЕДАКТИРОВАТЬ:
Привет, Fixer1234, вот подробности:
- «xx» и «a» могут не существовать вместе, если макрос работает правильно.
- Только строки "xx" должны быть скрыты.
- Значения «xx» не комбинируются со значениями, которые нельзя скрыть.
- Значения «a» не находятся в сочетании со значениями, которые должны быть скрыты.
- есть и другие строки, не содержащие «xx» или «a», которые не нужно скрывать (должен ли я добавить «a» к этим столбцам или полностью удалить IfElse?).
- Строка «xx» содержит другие формулы, пустой результат формулы означает, что строку необходимо скрыть.
- В строках «a» используется та же формула, но она выдает результат и не должна быть скрыта.
Ошибка выполнения «13»: несоответствие типов, после чего отладка переходит к первому
If Range("A8:A555").Value = "xx" Then
решение1
Вы не можете проверить все значения в диапазоне с помощью Range("A8:A555").Value = "xx"
. Это выдаст ошибку несоответствия типов.
Вам необходимо пройтись по каждой ячейке в диапазоне и проверить по отдельности, Value
равна ли она «xx».
Чтобы код работал быстрее, не скрывайте строки по мере их обнаружения, а создавайте список Range
скрытых Ranges
строк, а затем скрывайте их все сразу.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
Dim RangeToHide As Range
'Test if Target is C4
If Not Intersect(Target, [C4]) Is Nothing Then
'Loop through each cell in range and test if it's "xx"
For Each cel In Range("A8:A555")
If cel = "xx" Then
If RangeToHide Is Nothing Then
'Initialise RangeToHide because Union requires at least 2 ranges
Set RangeToHide = cel
Else
'Add cel to RangeToHide
Set RangeToHide = Union(RangeToHide, cel)
End If
End If
Next
RangeToHide.EntireRow.Hidden = True
End If
End Sub
решение2
Используйте этот код VBA в качестве стандартного модуля, он поможет вам скрыть все строки, содержащие в столбце XX
или .xx
A
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(True, True) = "$C$4" Then
Dim i As Integer
Application.ScreenUpdating = False
For i = 8 To 255
If Sheets("Sheet1").Range("A" & i).Value = "XX" Or Sheets("Sheet1").Range("A" & i).Value = "xx" Then
Rows(i & ":" & i).EntireRow.Hidden = True
End If
Next i
End If
Application.ScreenUpdating = True
End Sub
Примечание.
Нет необходимости использовать какой-либо код для Отображения строк, имеющих a
или A
, поскольку они уже Видимы. И, прежде всего, используемый код скрывает определенные строки в столбце A
.
решение3
Как скрыть отдельные строки!?
Вот как я думаю:
Private Sub CheckBox1_Click()
If CheckBox1 = False Then
[15:15].EntireRow.Hidden = True
[3:3].EntireRow.Hidden = True
Else
[15:15].EntireRow.Hidden = False
[3:3].EntireRow.Hidden = False
End If
С наилучшими пожеланиями,
Маттиас