如何合并单个 array/dictionary 和 return 值中的重复数据?

How to merge duplicate data in a single array/dictionary and return values?

我为 CorelDraw 编写了一个 VBA 宏,它循环遍历选定的对象和 returns 值作为字符串。我希望它能够更好地处理重复数据,例如如果两个对象具有相同的大小,它应该 return

"2 of 10 x 10"

而不是

"1 of 10 x 10"
"1 of 10 x 10"

来自Ruby(特别是哈希值),我认为宏应该遍历选定的范围,添加 (object.sizeWidth, object.sizeHeight) 数据作为字符串到 array/dictionary 应该检查重复项并计算它们的位置。我不知道什么是最好的或如何 set/check 他们的价值观。

到目前为止,这是我的代码

Sub objectsToString()

Dim str As String
Dim v As Shape, vr As ShapeRange
Dim xSize#, ySize#
Dim dupCount As Integer

str = ""
Set vr = ActiveSelectionRange

    For Each v In vr
    dupCount = 'value assigned via iteration
    xSize = v.SizeWidth
    ySize = v.SizeHeight
    str = str & dupCount & " of " & xSize & " x " & ySize & vbNewLine

    Next v

 End Sub

例如使用 scripting.dictionary 使用形状名称作为键,并使用它的 .exists 方法然后将项目作为计数并使用具有相同键名的单独字典,然后使用 class/type/array/collection/dictionary 尺寸为.

这样的事情会是一个好的开始。

Sub x()

Dim a() As Variant
Dim d As Scripting.Dictionary
Dim v As Variant

a = Array("10 x 10", "20 x 20", "30 x 30", "10 x 10")

Set d = New Scripting.Dictionary

For Each v In a

    If Not d.Exists(v) Then
        d.Add v, 1
    Else
        d(v) = d(v) + 1
    End If

Next v

For Each v In d.Keys

    Debug.Print d(v) & " of " & v

Next v

End Sub

给出结果

2 个,共 10 个 x 10 个

1 个,共 20 个 x 20 个

1 个,共 30 个 x 30 个