根据单元格值自动隐藏/显示多张工作表?

根据单元格值自动隐藏/显示多张工作表?

我有以下 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

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

相关内容