1

У меня есть следующий VBA, и он прекрасно работает. Это Авто / Скрывает или Авто / Показывает отлично.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("'Client Info'!D20")) Is Nothing Then
    If Range("'Client Info'!D20").Value > 0 And Not IsEmpty(Range("'Client Info'!D20")) Then
        Sheets("PLSHEET1").Visible = xlSheetVisible
    Else
        Sheets("PLSHEET1").Visible = xlSheetHidden
    End If End If End Sub

То, что я пытаюсь сделать сейчас, это иметь значение ячейки в D20 Авто / Скрыть или Показать два других дополнительных листа одновременно.

Вот что я пытаюсь и сталкиваюсь с неприятностями.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("'Client Info'!D20")) Is Nothing Then
    If Range("'Client Info'!D20").Value > 0 And Not IsEmpty(Range("'Client Info'!D20")) Then
        Sheets(Array("PULLSHEET1", "PULLSHEET2", "PULLSHEET3")).Visible = xlSheetVisible
    Else
        Sheets(Array("PULLSHEET1", "PULLSHEET2", "PULLSHEET3")).Visible = xlSheetHidden
    End If
End If
End Sub

1 ответ1

0

Коллекция Sheets принимает только аргумент индекса для своего метода по умолчанию (Item). Вы не можете передать массив к нему. Вам нужно перебрать элементы в массиве и использовать их один за другим.

Ниже показано, как это сделать:

'============================================================================================
' Module     : <in the "Client Info" sheet module>
' Version    : 0.1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://superuser.com/a/1328507/763880
'============================================================================================
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("'Client Info'!D20")) Is Nothing Then
    Dim enumVisibility As Excel.XlSheetVisibility
    If Range("'Client Info'!D20").Value > 0 Then
      enumVisibility = xlSheetVisible
    Else
      enumVisibility = xlSheetHidden
    End If
    Dim varSheetName As Variant
    For Each varSheetName In Array("PULLSHEET1", "PULLSHEET2", "PULLSHEET3")
      Sheets(varSheetName).Visible = enumVisibility
    Next varSheetName
  End If
End Sub

Обратите внимание, что я удалил избыточный, And Not IsEmpty(Range("'Client Info'!D20")) .

Вы также можете видеть, что я использовал переменную для хранения требуемой видимости и перенес ее фактическую настройку после оператора If . Таким образом, нужно использовать только один цикл вместо двух.

Если все имена листов содержат базовое имя с числовым суффиксом, лучшим циклом будет:

Dim lngSheetNumber As Long
For lngSheetNumber = 1 To 3
  Sheets("PULLSHEET" & lngSheetNumber).Visible = enumVisibility
Next lngSheetNumber

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .