从跨越多列的名称范围编译不同值的列表

Posted

技术标签:

【中文标题】从跨越多列的名称范围编译不同值的列表【英文标题】:Compile a list of distinct values from a name range that spans multiple columns 【发布时间】:2021-08-12 15:26:55 【问题描述】:

我正在尝试将命名范围“WESupplierALL”中的不同值列表编译到单个列中。 我已经尝试过独特和高级的过滤器功能,但我似乎可以破解它。 有任何想法吗?我对所有选项持开放态度,包括 VBA、公式等。

【问题讨论】:

在 *** 中查看这篇文章。 Excel UNIQUE Across Columns 这能回答你的问题吗? Excel VBA Dictionary Storing and Retrieving - VBA 中的 Dictionary object 可用于存储唯一键(值),这对于在数据集中查找 1 个重复数据实例很有用。 您是否只想列出上图中 A2:M10 中的唯一值? 【参考方案1】:

根据 cmets(链接)中的建议,您可以使用 TEXTJOINFILTERXML 的组合,但公式很长,会影响可读性。 Power Query 是另一种选择。

多年来,我使用自己的 VBA 函数来统一价值观。您可以使用我的存储库中的DM_ARRAY 函数:VBA-ArrayTools。有一个演示工作簿可用,您将找到每个用户定义函数 (UDF) 的专用工作表。对于DM_ARRAY,第一个参数是您想要作为输出的列数,然后您可以根据需要传递任意数量的范围。在您的情况下,您可以使用=UNIQUE(DM_ARRAY(1,E2:E23,I2:I23,M2:M23)) 获得所需的结果。当然你可以传递一个命名范围,比如=UNIQUE(DM_ARRAY(1,WESupplierALL))

此外,如果您想在没有高级数组公式的另一台计算机上获得相同的结果,那么同一个库有一个您可以使用的 DM_UNIQUE 函数。

【讨论】:

【参考方案2】:

将唯一值从多列写入一列

调整(使用)常量部分和工作簿中的值。
Option Explicit

Sub writeUnique()
    
    Const wsName As String = "Sheet1"
    Const ColsList As String = "E,I,M"
    Const fRow As Long = 2
    Const lRow As Long = 23
    Const dFirst As String = "A2"
        
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim Cols() As String: Cols = Split(ColsList, ",")
    Dim rCount As Long: rCount = lRow - fRow + 1
    
    Dim ws As Worksheet: Set ws = wb.Worksheets(wsName)
    
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare ' ignore case
      
    Dim crg As Range
    Dim Data As Variant
    Dim Key As Variant
    Dim r As Long, n As Long
    
    For n = 0 To UBound(Cols)
        Set crg = ws.Columns(Cols(n)).Resize(rCount).Offset(fRow - 1)
        Data = crg.Value
        For r = 1 To rCount
            Key = Data(r, 1)
            If Not IsError(Key) Then ' ignore error values
                If Len(Key) > 0 Then ' ignore blanks
                    dict(Key) = Empty
                End If
            End If
        Next r
    Next n
    
    If dict.Count = 0 Then Exit Sub
    
    ReDim Data(1 To dict.Count, 1 To 1)
    r = 0
    
    For Each Key In dict.Keys
        r = r + 1
        Data(r, 1) = Key
    Next Key
    
    With ws.Range(dFirst)
        .Resize(r).Value = Data
        .Resize(.Worksheet.Rows.Count - .Row - r + 1).Offset(r).ClearContents
    End With
    
End Sub

【讨论】:

以上是关于从跨越多列的名称范围编译不同值的列表的主要内容,如果未能解决你的问题,请参考以下文章

一次在多列上使用 pandas groupby().apply(list) [重复]

iOS中使用CSS多列的电子书(计算不同列中的文本范围)

如何创建具有从 csv 文件中的列表收集的唯一名称值的类的多个对象

如何在R中的函数中有不同数量的具有默认值的参数?

系统地遍历 DF 的多列和多行以跨多列输出不同的列表大小

从网格视图创建不同值的列表