VBA从数组说明中获取唯一值

时间:2019-04-26 14:13:08

标签: excel vba

我已经找到了这段代码,但是我很难理解它。您能详细解释一下吗?

https://stackoverflow.com/questions/3017852/vba-get-unique-values-from-array?answertab=active#=

    Sub unique() 
  Dim arr As New Collection, a 
  Dim aFirstArray() As Variant 
  Dim i As Long 

  aFirstArray() = Array("Banana", "Apple", "Orange", "Tomato", "Apple", _ 
  "Lemon", "Lime", "Lime", "Apple") 

  On Error Resume Next 
  For Each a In aFirstArray 
     arr.Add a, a 
  Next 

  For i = 1 To arr.Count 
     Cells(i, 1) = arr(i) 
  Next 

End Sub 

2 个答案:

答案 0 :(得分:1)

在每行中添加评论:

Sub unique()

    'Declare a collection object called `arr`. Despite the name, it's not an array. Also declare the variable `a` as type variant (default)
    Dim arr As New Collection, a

    'Declare an array of type variant, being used here in this example and it will be loaded with fruit names.
    Dim aFirstArray() As Variant

    'Declare a variable called `i` as a long integer type
    Dim i As Long


    'Here's are our example single-dimensional array for which we want to find unique values.
    aFirstArray() = Array("Banana", "Apple", "Orange", "Tomato", "Apple", _
    "Lemon", "Lime", "Lime", "Apple")

    'If we encounter an error adding `aFirstArray` array elements/items into our `arr` collection object then ignore them
    On Error Resume Next

    'Loop through each element(fruit name) in the array `aFirstArray`
    For Each a In aFirstArray

        'Add the item to the collection. The key and the value are both being set to the fruitname which is now in variable `a`
        'If the key (fruit name) already exists, that `On Error Resume Next` will ignore the error that pops.
        arr.Add a, a
    Next

    'Now we have a collection object `arr` that contains unique values from the array held in both the key and value of each item.
    'Iterate from 1 to the however many unique items are in the collection object `arr`
    For i = 1 To arr.Count

        'Print the value (fruitname) out to the workbook
        Cells(i, 1) = arr(i)
    Next

End Sub

此处使用collection对象的原因是它的工作原理很像数组,但是我们可以设置key来代替保存值的索引。键必须是唯一的,因此当我们尝试在设置了value之后添加相同的键时,它会出错。最后得到的是一个集合对象,该对象具有来自数组的唯一键(在这种情况下为匹配值)。

您还将使用Dictionary对象看到该子例程/函数的类似版本。与dictionary object has a method exists相比,我更喜欢这些集合,因此您可以在添加On Error Resume Next之前检查字典中是否已经存在key而不是If Not myDictionary.Exists(keyvalue) Then myDictionary.Add keyValue, val,它更像是拐杖。 。

答案 1 :(得分:0)

aFirstArray() = ...创建一个数组,该数组的值不是(必要)唯一的。

下一个代码块尝试将每个项目添加到Collection中,并使用On Error Resume Next来忽略如果尝试添加一个已经存在的项目会引发的错误到集合中,从而确保arr(集合)仅包含数组中的唯一值。

Collection.Add method上的Dox:

  

如果指定的键与集合的现有成员的键重复,也会发生错误。