使用字典从数组中删除重复的数字

时间:2018-06-28 14:21:39

标签: excel vba excel-vba

我已经创建了一个数组,想过滤掉所有重复项,并留下一个仅包含一次出现的数字的新数组。

下面是我的代码。第一个数组捕获了我需要的所有数字,但是由于某种原因,第二个数组未按要求过滤掉,并输出与第一个相同的数字。感谢您对发现问题的任何帮助!

ReDim theArray(0 To dRange)
Dim singleValues()

Dim i
Dim q

'fill the array
For i = LBound(theArray) To UBound(theArray)
    If (dRange - (dRange * i) <= dRange) Then
        theArray(i) = (dHigh - (tSize * i))
    End If
Next

'filter repeating elements
 With CreateObject("Scripting.Dictionary")
    'count each number qty
    For i = 0 To dRange
        .Item(theArray(i)) = .Item(theArray(i)) + 1
    Next
    'remove repeating
    For Each q In .Keys()
        If .Item(q) > 1 Then .Remove q
    Next
    'retrieve array
    singleValues = .Keys()
End With

Debug.Print Join(theArray)
Debug.Print Join(singleValues)

1 个答案:

答案 0 :(得分:0)

通常,dictionary structure does not support key repetition强烈反对:

  

每个项目都与唯一键相关联。该键用于检索单个项目,通常是整数或字符串,但可以是除数组之外的任何东西。

您可能想做的是增加键的值。

Option Explicit

Public Sub TestMe()

    'Microsoft Scripting Runtime Library
    Dim dict As New Scripting.Dictionary 
'or Dim dict as CreateObject("Scripting.Dictionary")

    Dim arr1 As Variant
    Dim arr2 As Variant
    arr1 = Array(1, 11, 11, 112, 34, 5, 6, 6, 7, 7)

    Dim i As Long
    For i = LBound(arr1) To UBound(arr1)
        If Not dict.exists(arr1(i)) Then
            dict.Add arr1(i), 1
        Else    
            dict(arr1(i)) = dict(arr1(i) + 1)
        End If
    Next

    ReDim arr2(dict.Count)

    For i = 0 To dict.Count - 1
        Debug.Print dict.Keys(i); " key is value - "; dict.Items(i)
        arr2(i) = dict.Keys(i)
    Next i

    Debug.Print Join(arr1)
    Debug.Print Join(arr2)

End Sub

它将打印以下两个数组:

1 11 11 112 34 5 6 6 7 7
1 11 12 112 34 5 6 7 8 

我不确定如何将With CreateObject("Scripting.Dictionary")Keys一起使用,因为分配键的语法如下:dict(arr1(i)),因此毫无意义,您不能参考与对象。不过,仍然可能有解决方法。

上面的代码使用早期绑定,因此您必须向其中添加一个MS库,从长远来看,它的速度相当快。