Как создать выделенный массив нулевой длины, который можно зациклить? - PullRequest
3 голосов
/ 20 октября 2019

Я хочу создать массив VBA, который имеет ноль элементов, но может быть зациклен на.
Вы можете посмотреть на код ниже, чтобы понять, что я имею в виду:

Sub testloopemptyarr()    
    Dim spl() As String, v As Variant, count As Integer
    spl = Split(Empty, ",")    'lbound=0, ubound=-1, zero elements
    'ReDim spl(-1 To -1)        ' one element
    'ReDim spl(-1)              ' does not compile: subscript out of range
    'ReDim spl(-1 To 0)         ' two elements
    'ReDim spl(0 To -1)         ' does not compile: subscript out of range

    For Each v In spl
        count = count + 1
    Next
    MsgBox count
End Sub

В сообщении появится 0в этом случае, потому что разделение пустой строки вернет массив нулевого элемента. Нет ошибок, возникающих при обнаружении цикла for, что означает, что массив является выделенным массивом.

Если вы проверите его, вы можете обнаружить, что после вызова Split () lbound (spl) равен 0, ubound (spl) равно -1, но делать ReDim spl(0 To -1) нелегально (попробуйте раскомментировать строку и запустить)

Поэтому мой вопрос:

Как мне создатьмассив, который ведет себя так же, как и массив Split ()?

1 Ответ

2 голосов
/ 20 октября 2019

Мне было бы интересно узнать, можете ли вы выделить выделенный пустой массив. Хотя я не думаю, что это возможно (весь смысл IMO массивов в том, что в них есть элементы, по крайней мере, 1), кроме того, как вы извлекали массив, используя Split.

. Возможно, вас заинтересуетв альтернативе массиву, как вы могли бы использовать ArrayList объект. ArrayList позволит вам по-прежнему добавлять элемент в «массив» для каждого номера индекса, как выделенный массив.

Sub EmptyArray()

Dim arr As Object: Set arr = CreateObject("System.Collections.ArrayList")
Dim item As Variant

Debug.Print arr.Count 'Will show 0

For Each item In arr 'Will skip iteration
    Debug.Print item
Next item

arr.Insert 0, "1st item"
arr.Insert 1, "2nd item"
arr.Insert 2, "3rd item"

Debug.Print arr.Count 'Will show 3

For Each item In arr 'Will now iterate
    Debug.Print item
Next item

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...