VBA: скрыть и показать код не работает - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в VBA и пытаюсь написать код, который скрывает и отображает строки на основе входного значения определенного адреса ячейки.Однако это не работает, и я не знаю почему.Я разместил свой код ниже:

Sub Hide()

If Worksheets("IS").Range("B8").Value = "Show All" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
End If

If Worksheets("IS").Range("B8").Value = "Just Revenue" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("28:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Expenses" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
   Worksheets("IS").Rows("160:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Cogs" Then
   Worksheets("IS").Rows("12:165").EntireRow.Hidden = False
   Worksheets("IS").Rows("12:27").EntireRow.Hidden = True
   Worksheets("IS").Rows("64:165").EntireRow.Hidden = True
End If

If Worksheets("IS").Range("B8").Value = "Just Totals" Then
   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 If

End Sub

Любая помощь по поводу того, почему мой код не работает или какие-либо советы по его улучшению, была бы очень благодарна.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Перезапись для 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.

0 голосов
/ 07 июня 2018

Этот код нужно вставить на лист, где вы хотите выполнить код.Вам не нужно будет квалифицировать свои диапазоны с листами, как только код будет там.

Вы можете просто обратиться непосредственно к своему диапазону без Worksheets("IS"). следующим образом:
Rows("so and so").EntireRow.Hidden = True

Вы также можете просто ссылаться на свою TargetRange по переменной теперь так:
If MyTarget = "Just Revenue" Then

Я вставил одно из ваших условий в код в качестве примера

Option Explicit

Private Sub worksheet_change(ByVal target As Range)

Dim MyTarget As Range
Set MyTarget = Range("B8")

If Not Intersect(target, MyTarget) Is Nothing Then
Application.EnableEvents = False

'Your CODE HERE
If MyTarget = "Show All" Then
Rows("12:165").EntireRow.Hidden = False
End If

Application.EnableEvents = True
End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...