Корень вашей проблемы в том, что вы пытаетесь изменить размер «статического» массива уровня модуля. Вот хорошее описание (от Chip Pearson) различия между «статическими» и «динамическими» массивами VBA:
http://www.cpearson.com/excel/vbaarrays.htm
У вас есть вторичная проблема в том, что ваши функции будут возвращать значение VBA Empty
вместо количества путей. В VBA вы возвращаете значение из функции, присваивая значение имени функции.
В приведенном ниже коде я исправил эти проблемы:
- делает массив уровня модуля "динамическим"
- добавление подпрограммы "init" для добавления туда вашего начального элемента
- возврат значений, которые вы ожидаете от своих функций
Возможно, вам не понадобится (2), если ваше первоначальное объявление (1 To 1)
не совсем то, что вы хотели.
Обратите внимание на использование Option Explicit
re: (3). Если бы у вас это было, ваш исходный код с назначениями «GETPATH» не скомпилировался бы даже после исправления (1).
Option Explicit
Option Base 1
Private Type PathsArray
Nodes() As String
End Type
' Just declare the module-level array
Dim Paths() As PathsArray
Public Sub init()
ReDim Paths(1 To 1) As PathsArray
End Sub
Function SETTWENTY()
' Increase size of the array, preserving the current elements already inside it
ReDim Preserve Paths(1 To UBound(Paths) + 1)
' Make the inner array be 20 elements long
ReDim Preserve Paths(UBound(Paths)).Nodes(1 To 20)
' Return something random
SETTWENTY = UBound(Paths)
End Function
Function SETTHIRTY()
' Increase size of the array, preserving the current elements already inside it
ReDim Preserve Paths(1 To UBound(Paths) + 1)
' Make the inner array be 30 elements long
ReDim Preserve Paths(UBound(Paths)).Nodes(1 To 30)
' Return something random
SETTHIRTY = UBound(Paths)
End Function