Создание динамического массива после стирания - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь создать экземпляр динамического массива после его удаления. Я использую массив для хранения фигур, которые я создаю, так что мне не нужно зацикливать каждую фигуру на странице. Так как уже много. При каждой новой странице я стираю массив, но затем при попытке добавить первую фигуру в массив появляется ошибка «индекс вне диапазона».

Dim SeqShapes() As Shape
For PageCount = 0 to activeDocument.Pages.Count
    Erase SeqShapes

    For ShapesNeeded = 0 to ShapesCount
        Set NewShape = ActivePage.Drop(SomeShape, 20, 20)
        SeqShapes(UBound(SeqShapes)) = NewShape
    Next

    'Some more code

Next

Это возвращает ошибку, потому что в массиве нет записей. Я не хочу использовать фиксированный массив, потому что нет способа узнать, сколько фигур будет создано заранее.

Я попытался добавить фиктивную запись, но не могу понять синтаксис:

Dim SeqShapes() As Shape
Dim DummyShape As Shape
For PageCount = 0 to activeDocument.Pages.Count
    Erase SeqShapes
    SeqShapes(0) = DummyShape

    For ShapesNeeded = 0 to ShapesCount
        Set NewShape = ActivePage.Drop(SomeShape, 20, 20)
        SeqShapes(UBound(SeqShapes)) = NewShape
    Next

    'Some more code

Next

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 29 марта 2019

Использовать коллекцию, а не массив

 Dim SeqShapes As Collection
 For PageCount = 0 to activeDocument.Pages.Count
    Set SeqShapes = Nothing      '  Easiest way to clear it is to recreate it.
    Set SeqShapes = New Collection

    Dim ShapesNeeded
    Dim newShape As Shape
    For ShapesNeeded = 0 To 3
        Set newShape = ActivePage.Drop(SomeShape, 20, 20)
        SeqShapes.Add newShape     ' Add the shape into Collection
    Next ShapesNeeded  
    ...
Next PageCount

Чтобы перебрать все фигуры в коллекции:

    ' Using ForEach (you have to declare you running variable as Variant)
    Dim sh As Variant
    For Each sh In SeqShapes
        Debug.Print sh.Name
    Next sh

    ' Using for
    Dim i As Long
    For i = 1 To SeqShapes.Count
        Debug.Print SeqShapes(i).Name
    Next i
...