Я написал макрос 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 ответ1

1

У меня нет CorelDraw, но вот сопоставимый пример:

' Set up some sample items
Dim items(2) As String
items(0) = "10 x 10"
items(1) = "20 x 20"
items(2) = "10 x 10"

' Create a dictionary to store the items and count
' Key: [n] x [n]
' Value: Count of item
Dim dict As New Scripting.Dictionary

For Each Item In items
    If dict.Exists(Item) Then
        ' Increase existing count
        dict(Item) = dict(Item) + 1
    Else
        ' Add new item to dictionary and set count to 1
        dict.Add Item, 1
    End If
Next

' Print dictionary
For Each Key In dict.Keys
    Debug.Print dict(Key) & " of " & Key
Next

Если вы еще этого не сделали, вам нужно добавить ссылку на библиотеку Microsoft Scripting Runtime в диалоге Инструменты → Ссылки. Если этой библиотеки нет в списке, используйте кнопку обзора, чтобы выбрать C:\Windows\System32\scrrun.dll .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .