Повторное использование массива с функциями - PullRequest
1 голос
/ 20 июля 2011

У меня есть две разные функции, которым требуется доступ к одному и тому же массиву (массив не является константой; он будет редактироваться и добавляться к нему всякий раз, когда функция используется внутри ячейки на листе).

Я хочу сделать этот массив доступным для них обоих.Массив должен быть многомерным (или быть UDT, в котором может быть несколько элементов, как я пытался описать в моем коде ниже), и он должен иметь возможность динамического изменения размера.Вот пример кода (немного отредактированный), который у меня есть, но он, кажется, не работает должным образом.

Option Base 1

Private Type PathsArray
    Nodes() As String
End Type

' Instantiate the global array
Dim Paths(1 To 1) As PathsArray

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
    GETPATH = 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
    GETPATH = UBound(Paths)

End Function

Кто-нибудь знает, почему это не сработает?

1 Ответ

1 голос
/ 20 июля 2011

Корень вашей проблемы в том, что вы пытаетесь изменить размер «статического» массива уровня модуля. Вот хорошее описание (от Chip Pearson) различия между «статическими» и «динамическими» массивами VBA:

http://www.cpearson.com/excel/vbaarrays.htm

У вас есть вторичная проблема в том, что ваши функции будут возвращать значение VBA Empty вместо количества путей. В VBA вы возвращаете значение из функции, присваивая значение имени функции.

В приведенном ниже коде я исправил эти проблемы:

  1. делает массив уровня модуля "динамическим"
  2. добавление подпрограммы "init" для добавления туда вашего начального элемента
  3. возврат значений, которые вы ожидаете от своих функций

Возможно, вам не понадобится (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...