VB6 и COM используют сочетание индексации на основе 0 и 1 (массивы основаны на 0, за исключением случаев, когда вы изменяете это с помощью Option Base или объявляете их иным образом).
Коллекции COM обычно основаны на 1 в более ранних объектных моделях COM, но иногда основаны на 0 ...
Данные Dim / Redim (от 1 до N) - это массив из N элементов, проиндексированных от 1 до N
Данные Dim / Redim (от 0 до N-1) - это массив из N элементов, проиндексированных от 0 до N-1
Данные Dim / Redim (N) - это массив из N + 1 элементов, проиндексированных от 0 до N (если Option Base равен 0)
Последний случай, который иногда сбивает с толку, данные (N) обычно означают данные (от 0 до N), которые представляют собой массив из N + 1 элементов.
Лично я всегда объявляю массивы явно как (от 0 до N-1) и не полагаюсь на Option Base, которая более знакома разработчикам, использующим более одного языка.
Существует один крайний случай: VBA не поддерживает массивы нулевой длины, у вас всегда должен быть хотя бы один элемент (для каждого измерения в многомерных массивах). Поэтому наименьший массив, который вы можете объявить, - это данные (от 0 до 0) или данные (от 1 до 1) с одним элементом.
В вашем случае, я подозреваю, что вы создаете массив с одним элементом, затем добавляете элемент каждый раз через цикл:
ReDim data(1 To 1)
While Cells(ndx, 1).Value <> vbNullString
ReDim Preserve data(1 To (UBound(data) + 1))
ndx = ndx + 1
Wend
Вместо этого (оставляя в стороне соображения эффективности вызова ReDim Preserve в цикле), вы должны использовать:
ReDim data(1 To 1)
nStartIndex = ndx
While Cells(ndx, 1).Value <> vbNullString
' On the first iteration this does nothing because
' the array already has one element
ReDim Preserve data(1 To ndx - nStartIndex + 1)
ndx = ndx + 1
Wend