vba:从数组获取唯一值:说明

时间:2019-04-26 16:06:26

标签: excel vba

我在尝试理解以下代码时遇到困难。我在以下链接中找到了它:vba: get unique values from array

Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    'Set d = New Scripting.Dictionary


Dim i As Long
For i = LBound(myArray) To UBound(myArray)
    d(myArray(i)) = 1
Next i

Dim v As Variant
For Each v In d.Keys()
    'd.Keys() is a Variant array of the unique values in myArray.
    'v will iterate through each of them.
Next v

编辑:我很理解整个代码,但是我不明白最后一部分。

Dim v As Variant
For Each v In d.Keys()
    'd.Keys() is a Variant array of the unique values in myArray.
    'v will iterate through each of them.
Next v

我听不懂这行

 d(myArray(i)) = 1

编辑:我正在寻找执行相同目标的代码,但我希望完全了解我要应用的内容,而不是仅复制并粘贴我不了解的内容。

更具体地说,我正在构造宏中的几个元素,而这正是我要寻找的元素。

  1. 首先要在数据集中找到重复项
  2. 找到重复项后,我需要计算如果我的项目完成的行中有4个重复项,那么重复项的数量是
  3. 然后,如果重复项超过4个,我需要将重复项转移到另一张纸并将其存储在其中
  4. 另一方面,如果重复项少于4个,我将需要找到此类项目,并尝试将这些项目与广告资源进行匹配,以找出剩余的元素,从而堆叠4个元素。

该宏将帮助我完成第4点。一旦我确定了少于4个的项目,我需要找到这些项目,并尝试将它们与另一张纸上的项目进行匹配。我需要使用上面的代码,因为我宁愿在宏中使用数组而不是Excel本身中的函数,以免因幻影图形对用户造成混淆。

1 个答案:

答案 0 :(得分:2)

按部分划分:

Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
'Set d = New Scripting.Dictionary

这将创建字典对象


Dim i As Long
For i = LBound(myArray) To UBound(myArray)
    d(myArray(i)) = 1
Next i

对于字典对象,有两种添加新项的方法:

  1. d.Add Key, Value

    如果字典中已有该键,则此方法将导致错误

  2. d(Key) = Value

    从技术上讲,此方法是对指定键的值的重新分配。如果键不存在,则会隐式添加。如果键已经存在,则值将被更新。

那么代码在做什么,是循环遍历数组中的每个值,以及:

  1. 使用当前字典键(数组的值)将当前索引重新分配为字典值

  2. 如果该密钥尚不存在,请创建它。

这将导致字典中每个唯一值具有一个键。只需将所有重复的值重新分配给现有键的值,而不是创建新的键。


Dim v As Variant
For Each v In d.Keys()
    'd.Keys() is a Variant array of the unique values in myArray.
    'v will iterate through each of them.
Next v

详细说明:d.Keys以数组的形式返回字典中的所有键。由于键是myArray的唯一值,因此d.KeysmyArray的唯一值的数组。