Перезапись для Worksheet_Change:
Вставьте этот код в VBE в таблицу кодов для листа "IS" (дважды щелкните его на панели Project - VBAProject
. Если панель Project - VBAProject
не отображаетсяв вашем VBE перейдите на View
>> Project Explorer
):
Private Sub Worksheet_Change(ByVal Target As Range)
'Ensure that we don't trigger another change event while this code is running
Application.EnableEvents = False
'Check if cell B8 triggered this change:
If Not Intersect(Target, Range("B8")) Is Nothing Then
'B8 changed... which means B8 is "Target" variable
Select Case Target.Value
Case "Show All"
Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
Case "Just Revenue"
Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
Worksheets("IS").Rows("28:165").EntireRow.Hidden = True
Case "Just Expenses"
Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
Worksheets("IS").Rows("160:165").EntireRow.Hidden = True
Case "Just Cogs"
Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
Worksheets("IS").Rows("64:165").EntireRow.Hidden = True
Case "Just Totals"
Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
Worksheets("IS").Rows("12:25").EntireRow.Hidden = True
Worksheets("IS").Rows("28:61").EntireRow.Hidden = True
Worksheets("IS").Rows("64:91").EntireRow.Hidden = True
Worksheets("IS").Rows("93:155").EntireRow.Hidden = True
End Select
End If
'Turn events back on so this code triggers again
Application.EnableEvents = True
End Sub
Существует довольно много событий, к которым мы можем подключить VBA (SelectionChange, DoubleClick, Workbook_Close и т. д.).В этом случае мы подключаемся к Worksheet_Change()
.
Этот код срабатывает каждый раз, когда на этом листе вносятся изменения.Переменная Target
будет содержать диапазон, вызвавший событие.Таким образом, мы проверяем, пересекается ли Target
с Range("B8")
, что означает, что B8
был изменен.Затем мы выполняем код внутри блока If
.
Я переключил ваш If/ElseIf
на Select/Case
только потому, что он делает код чище, поскольку мы проверяем одно условие (значение B8) снова и снова.
В этом коде мы также отключаем функцию приложений Excel EnableEvents
.Эта особенность - то, что позволило этому Worksheet_Change()
быть вызванным во-первых.Часто в коде мы вносим в таблицу больше изменений (например, скрытие строк или столбцов), что заставляет приложение снова запускать Worksheet_Change()
... пока оно уже работает Worksheet_Change()
.Это может привести к избыточному выполнению кода и, часто, к бесконечному циклу, который приводит к аварийному завершению Excel.