如何通过VBA从过滤表中获取唯一值?

问题描述 投票:0回答:1

我有一个通过切片器进行过滤的表,用户可以自己摆弄。例如,假设我有一个包含 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 中的变量中。

另请注意,由于过滤器的原因,过滤表中的行可能不连续,并且列数应该是动态的。

sql sql-server excel vba filtering
1个回答
0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.