【问题标题】:Array of unique values in a Column range列范围内的唯一值数组
【发布时间】:2020-10-30 18:53:28
【问题描述】:

试图找出代码来创建一个列中所有唯一值的数组。

就像从 C3:C30 说的那样,我想要一个名为 divisionNames 的数组,其中包含该范围内的所有唯一值。我打算稍后在代码中使用该数组。试图找出一种极简的方法,这样我就不会在宏中添加 60 多行代码。

非常感谢任何建议

更新:

Gary 的学生在下面的回复满足了我的需要,但我非常感谢大家提供的帮助。谢谢你。另外作为旁注,我现在意识到我应该补充说我正在使用 Office 365。老实说,我没有意识到它有很大的不同,但我会记住这一点以供将来参考,再次感谢大家的帮助

Sub uniq()
    With Application.WorksheetFunction
        divisionNames = .Unique(Range("C3:C30"))
    End With
End Sub

【问题讨论】:

  • 这是一种使用字典的方法:stackoverflow.com/a/36044716/1521579
  • 你需要什么样的数组? 1D 0-based、1D 1-based 还是 2D 1-based?基于 2D 1 的值很容易粘贴到列范围:Range("A1").Resize(Ubound(Data, 1), Ubound(Data, 2)).Value = Data。无需转置。
  • 老实说,我只需要一个......我想的名字列表,以便稍后我可以将它们粘贴到 ComboBox 中。加里的学生在下面的回答对我有用。不过,感谢大家抽出宝贵时间回复,真的很感激。老实说,我非常感谢这些论坛上所有了不起的人。
  • 既然你喜欢短代码,这里是combo box link

标签: arrays excel vba unique


【解决方案1】:

唯一(字典)

  • 没有错误处理,即假定范围是一列范围并且没有错误或空值。这很容易实现,但您希望它简短。

一维 - 函数

Function getUniqueColumn1D(ColumnRange As Range)
    Dim Data As Variant
    Data = ColumnRange.Resize(, 1).Value
    With CreateObject("Scripting.Dictionary")
        Dim i As Long
        For i = 1 To UBound(Data)
            .Item(Data(i, 1)) = Empty
        Next
        ReDim Data(1 To .Count)
        i = 0
        Dim key As Variant
        For Each key In .Keys
            i = i + 1
            Data(i) = key
        Next key
    End With
    getUniqueColumn1D = Data
End Function

Sub test1D()
    Dim rng As Range
    Set rng = Range("C3:C30")
    Dim Data As Variant
    Data = getUniqueColumn1D(rng)
    Debug.Print Join(Data, vbLf)
End Sub

2D - 函数

Function getUniqueColumn(ColumnRange As Range)
    Dim Data As Variant
    Data = ColumnRange.Resize(, 1).Value
    With CreateObject("Scripting.Dictionary")
        Dim i As Long
        For i = 1 To UBound(Data)
            .Item(Data(i, 1)) = Empty
        Next
        ReDim Data(1 To .Count, 1 To 1)
        i = 0
        Dim key As Variant
        For Each key In .Keys
            i = i + 1
            Data(i, 1) = key
        Next key
    End With
    getUniqueColumn = Data
End Function

Sub TESTgetUniqueColumn()
    Dim rng As Range
    Set rng = Range("C3:C30")
    Dim Data As Variant
    Data = getUniqueColumn(rng)
    ' e.g.
    Dim i As Long
    For i = 1 To UBound(Data)
        Debug.Print Data(i, 1)
    Next i
    ' or:
    Range("A1").Resize(UBound(Data, 1), UBound(Data, 2)).Value = Data
End Sub

2D - 子

Sub getUniqueColumnSub()
    Dim Data As Variant
    Data = Range("C3:C30")
    With CreateObject("Scripting.Dictionary")
        Dim i As Long
        For i = 1 To UBound(Data)
            .Item(Data(i, 1)) = Empty
        Next
        ReDim Data(1 To .Count, 1 To 1)
        i = 0
        Dim key As Variant
        For Each key In .Keys
            i = i + 1
            Data(i, 1) = key
        Next key
    End With
    
    ' e.g.
    For i = 1 To UBound(Data)
        Debug.Print Data(i, 1)
    Next i
    ' or:
    Range("A1").Resize(UBound(Data, 1), UBound(Data, 2)).Value = Data
End Sub

【讨论】:

  • 感谢您的回复。我希望这不会花太长时间(如果不是更长的话,我会花一个小时左右)我非常感谢你抽出时间来回复。 Gary's Student's reply 成功了,而且很简短。只是想说感谢您抽出宝贵的时间输入所有内容
  • @GeekyMeeks:别担心,我是为可能没有 365 的用户编写的。但感谢您的反馈。 3 行对 15 行:这很简单。
【解决方案2】:

使用 Excel 365

Sub uniq()
    With Application.WorksheetFunction
        divisionNames = .Unique(Range("C3:C30"))
    End With
End Sub

编辑#1:

这个版本会对结果进行排序,并将数据放在D列中:

Sub uniq()
    With Application.WorksheetFunction
        divisionNames = .Unique(Range("C3:C30"))
        divisionNames = .Sort(divisionNames)
    End With
    
    u = UBound(divisionNames, 1)
    Range("D3:D" & 3 + u - 1).Value = divisionNames
    
End Sub

【讨论】:

  • 这样就行了,谢谢你,我现在唯一需要弄清楚的是,我是否可以按字母顺序对 DivisionNames 中的数据进行排序,但这只是一个小技巧
  • @GeekyMeeks 查看我的 EDIT#1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多