![根据单元格值自动隐藏/显示多张工作表?](https://linux22.com/image/1562589/%E6%A0%B9%E6%8D%AE%E5%8D%95%E5%85%83%E6%A0%BC%E5%80%BC%E8%87%AA%E5%8A%A8%E9%9A%90%E8%97%8F%2F%E6%98%BE%E7%A4%BA%E5%A4%9A%E5%BC%A0%E5%B7%A5%E4%BD%9C%E8%A1%A8%EF%BC%9F.png)
我有以下 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