列出一组名称以便稍后在代码中调用

我有一个名单,我需要筛选数据透视表上。 我使用一个案例select来使等价于名称的透视项目可见和所有其他不可见。 我可以创build一个一次性数组或这15个名称的列表,并在代码中调用列表/数组名称,而不是在多个位置使用15个名称? 我不得不玩一个数据透视表,并多次对这些名字进行sorting。

这是我想要避免的。 它按原样工作,但我试图在未来通过修改来挽救自己的头痛。

Set table = Worksheets("Sheet2").PivotTables("PivotTable2") With table.PivotFields("Assigned to") For Each PvI In .PivotItems Select Case PvI.Name Case "Antone", "Brad", "Cavan", "Chris", "Daneisha", "Edward", "James", "Jonathan", "Joesph", "Karen", "Shaun", "Steve", "Timothy", "Tracey" PvI.Visible = True Case Else PvI.Visible = False End Select Next End With 

试试这个REVERSE Select Case

 Sub Sample() Dim sNames As String sNames = "/Antone/Brad/Cavan/Chris/Daneisha/Edward/James/Jonathan/Joesph/Karen/Shaun/Steve/Timothy/Tracey/" Set Table = Worksheets("Sheet2").PivotTables("PivotTable2") With Table.PivotFields("Assigned to") For Each PvI In .PivotItems Select Case 0 '<~~ Reverse Select case Case InStr(1, sNames, "/" & PvI.Name & "/", vbTextCompare) PvI.Visible = False '<~~ This also reverses Case Else PvI.Visible = True End Select Next End With End Sub 

这里是一个简单的方法来看看Reverse Select Case如何工作:)

 Sub Sample() Dim sNames As String, NameToCheck As String sNames = "/Antone/Brad/Cavan/Chris/Daneisha/Edward/James/Jonathan/Joesph/Karen/Shaun/Steve/Timothy/Tracey/" NameToCheck = "Antoneeeee" 'NameToCheck = "Daneisha" Select Case 0 Case InStr(1, sNames, "/" & NameToCheck & "/", vbTextCompare) MsgBox "Not found" Case Else MsgBox " Found" End Select End Sub 

当然,它消除了select案例。 我testing了下面的代码减去数据透视表方面。 这将你的名字存储在一个数组中。 您可以将该数组保留为全局variables或作为工作簿中的范围(对于后者更改nameArr = ...行)。 代码(UBound(Filter(nameArr, PvI.Name)) > -1)将检查是否存在nameArr中PvI.Name通过筛选数组为您所需的名称,并检查结果数组中是否有任何内容。 然后由“数组包含检查”返回的真/假值分配给PvI.Visible

 Dim nameArr As Variant nameArr = Array("Antone", "Brad", "Cavan", "Chris", "Daneisha", "Edward", "James", "Jonathan", "Joesph", "Karen", "Shaun", "Steve", "Timothy", "Tracey") Set table = Worksheets("Sheet2").PivotTables("PivotTable2") With table.PivotFields("Assigned to") For Each PvI In .PivotItems PvI.Visible = (UBound(Filter(nameArr, PvI.Name)) > -1) Next End With 

详细阐述我的意见,我build议采用表驱动的方法。

要做的第一件事就是把感兴趣的名字放在工作表中,给这个范围一个名字。 在这个例子中,我称范围“MyNames”。

第二件事是把这个function添加到你的项目中:

 Function NameIsInList(LookFor As String) As Boolean On Error GoTo Err_NameIsInList NameIsInList = WorksheetFunction.Match(LookFor, Range("MyNames"), 0) > 0 On Error GoTo 0 Exit Function Err_NameIsInList: ' the name was not found, or a bad parameter was supplied NameIsInList = False On Error GoTo 0 End Function 

最后,修改你的程序来使用这个函数:

 Set table = Worksheets("Sheet2").PivotTables("PivotTable2") With table.PivotFields("Assigned to") For Each PvI In .PivotItems PvI.Visible = NameIsInList(PvI.Name) Next End With 

我在这里拍摄的优点是:

  • 表驱动:值列表可以存储在工作表中,方便访问和修改。 (如果您不希望用户看到LOV,则始终可以隐藏工作表。)
  • 可重用:让函数做检查名单的工作。 你build议这是需要做很多次的事情; 该function可以从多个地方调用。