AutoOcultar / Mostrar várias folhas com base em um valor de célula?

1

Eu tenho o seguinte VBA e funciona muito bem. Auto / Oculta ou Auto / Mostra perfeitamente.

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

O que estou tentando fazer agora é ter o valor Cell em D20 Auto / Hide ou mostrar outras duas planilhas adicionais ao mesmo tempo.

O que se segue é o que estou tentando e estou tendo problemas.

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
    
por klocksbass 04.06.2018 / 07:29

1 resposta

0

A coleção Sheets aceita apenas um argumento de índice para o método padrão ( Item ). Você não pode passar um array para ele. Você precisa fazer um loop nos itens da matriz e usá-los um por um.

O seguinte mostra como fazer isso:

'============================================================================================
' 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

Note que removi o And Not IsEmpty(Range("'Client Info'!D20")) redundante.

Você também pode ver que usei uma variável para armazenar a visibilidade necessária e movi a configuração real dela para depois da instrução If . Desta forma, apenas um loop precisa ser usado em vez de dois.

Se todos os nomes de folhas contiverem um nome base com um sufixo numérico, um loop melhor seria:

Dim lngSheetNumber As Long
For lngSheetNumber = 1 To 3
  Sheets("PULLSHEET" & lngSheetNumber).Visible = enumVisibility
Next lngSheetNumber
    
por 04.06.2018 / 14:58