我有一个通过切片器进行过滤的表,用户可以自己摆弄。例如,假设我有一个包含 4 列的表,在用户选择他或她想要通过相应切片器应用于每列的过滤器后,我们有下表:
Client ID | Identifier | Gender | Occupation
123 | A | F | 1
999 | Z | M | 5
563 | B | F | 5
如何获取每个过滤列的唯一值?特别是,我想要 123、999 和 563 代表
Client ID
,A、Z 和 B 代表 Identifier
,M 和 F 代表 Gender
,1 和 5 代表 Occupation
。
请注意,我应该只用一个“F”来表示
Gender
,而不是两个,用一个“5”来表示 Occupation
,而不是两个。
这样做的原因是因为我需要将上述信息转变成 SQL Server 2016 的
WHERE
条件。使用上面的例子,我希望最终结果是AND [Client ID] IN ('123, '999', '563') AND [Identifier] IN ('A', 'Z', 'B') AND [Gender] IN ('F', 'M') AND [Occupation] IN ('1', '5')
。这将存储在 VBA 中的变量中。
另请注意,由于过滤器的原因,过滤表中的行可能不连续,并且列数应该是动态的。
Option Explicit
Sub GetUniqList()
Dim rArea As Range, visRng As Range
Dim sKey As String, c As Range, i As Long
Dim oTab As ListObject, arrDic(1 To 4)
For i = 1 To 4
Set arrDic(i) = CreateObject("scripting.dictionary")
Next
Set visRng = ActiveSheet.ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeVisible)
If Not visRng Is Nothing Then
For Each rArea In visRng.Areas
For Each c In rArea.Rows
For i = 1 To 4
sKey = "'" & c.Cells(i).Value & "'"
If Not arrDic(i).exists(sKey) Then arrDic(i)(sKey) = ""
Next
Next
Next
End If
For i = 1 To 4
Debug.Print Join(arrDic(i).Keys, ",")
Next
End Sub