Как объединить повторяющиеся данные в одном массиве / словаре и вернуть значения? - PullRequest
0 голосов
/ 13 февраля 2019

Я написал макрос VBA для CorelDraw, который проходит по выбранным объектам и возвращает значения в виде строки.Я хочу, чтобы он мог лучше обрабатывать дублирующиеся данные, например, если два объекта имеют одинаковый размер, он должен вернуть

"2 of 10 x 10"

вместо

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

Исходя из Ruby (в частности,думая о хешах), я думаю, что макрос должен циклически перебирать выбранный диапазон, добавлять (object.sizeWidth, object.sizeHeight) данные в виде строк в массив / словарь, где их следует проверять на наличие дубликатов и подсчитывать их.Я не знаю, что лучше или как установить / проверить их значения.

Вот мой код пока

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

1 Ответ

0 голосов
/ 13 февраля 2019

Используйте scripting.dictionary, используя, например, имя формы в качестве ключа, и используйте его метод .exists, затем укажите элемент в качестве счетчика и создайте отдельный словарь с тем же именем ключа, а затем укажите класс / тип / массив /коллекция / словарь с размерами в.

Примерно так будет хорошим началом.

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

...