Самый простой способ сделать это - использовать петлю. То, что вы хотите сделать, это скрыть каждую строку в цикле, например, этот цикл будет скрывать строки 1-3
For i=1 to 3
Rows(i).EntireRow.Hidden = True
Next
Если я understnad ваши настройки правильно столбец 8 содержит «да/нет». Столбец 11 содержит смещение строки для запуска (un) сокрытия строк. В столбце 12 указано, где остановить (un) скрытие строк.
Я буду использовать следующие обозначения для указания адреса ячейки (строка, столбец)
Назад к вашему примеру, если (15,8) говорит «да», то вы UNHIDE строки 16,17, 18,19, . Это означает, что (15,11) будет содержать , поскольку смещение, чтобы получить к строке 16 является CURRENT_ROW + 1, где текущая строка клеток (15,12) содержит , так как это последней строке для перехода к. Просто используйте значение из ячейки (15,11) в начале вашего цикла и значение в ячейке (15,12) в качестве значения стоп
Private Sub Worksheet_Change(ByVal Target As Range)
'defines some constants
Const iYES_NO_COL = 8
Const iOFFSET_COL = 11
Const iSKIP_TO_COL = 12
If Target.Count > 1 Then
For Each cel In Target
Call Worksheet_Change(cel)
Next cel
End If
ElseIf Target.Count = 1 Then
'im not sure what this does so i left it
If Target.Column = 8 Then
If LCase(Target.Value) = LCase(Target.Offset(, 3)) Then
Cells(Target.Offset(, 4), 1).EntireRow.Hidden = False
Else
Cells(Target.Offset(, 4), 1).EntireRow.Hidden = True
End If
If (Target.Column = iYES_NO_COL) Then
' takes the current row + the value in the offset cell
my_start = Target.Row + Cells(Target.Row, iOFFSET_COL).Value
' takes the value from the SKIP_TO_COL
my_stop = Cells(Target.Row, iSKIP_TO_COL).Value
'target should be only one cell at this point, see if it
'contains the word no
If (StrComp(Trim(LCase(Target.Value)), "no") = 0) Then
'hides all the rows between the start and stop value
For i = my_start To mystop
Rows(i).EntireRow.Hidden = True
Next
ElseIf (StrComp(Trim(LCase(Target.Value)), "yes") = 0) Then
'unhides all the rows between the start and stop value
For i = my_start To mystop
Rows(i).EntireRow.Hidden = False
Next
End If
End If
End Sub