Как вернуть массив, который является элементом многомерного массива? - PullRequest
0 голосов
/ 06 марта 2020

Насколько мне известно, массив в VBA (особенно если это тип Variant) может принимать более или менее все в качестве элемента. Большим преимуществом является то, что массивы сами могут быть элементами массива, что делает «верхний» массив, содержащий «нижние» массивы, многомерным.

' Example
Dim TestArray() As Variant
Dim NestedArray1() As Variant
Dim NestedArray2() As Variant

NestedArray1 = Array(1, 2, 3)
NestedArray2 = Array(4, 5, 6)

TestArray = Array(NestedArray1, NestedArray2)

Структура понятна. TestArray будет иметь 2 элемента: NestedArray1, NestedArray2, которые сами являются массивами с 3 элементами, содержащими (1,2,3) и (4,5,6). Окно Locals в редакторе VBA также правильно перечисляет эти элементы.

Но тут возникает сложная часть.

Как получить доступ к «нижним» массивам в целом?

Обычно доступ к элементу массива выполняется следующим образом

ArrayName(n)         ' One-dimensional
ArrayName(n,m,...)   ' Multidimensional

TestArray(1,2)       ' Using the above Example will return 2

Так что я бы ожидал, что

TestArray(1)

вернет эквивалент NestedArray1. TestArray (1) даже указан в виде массива с типом Variant в окне locals, как и любой другой массив.

К сожалению, этот метод недопустим.

Вот конкретный пример:

Join (sourceArray, [seperator]) - это встроенная функция, которая ожидает, что массив и разделитель возвратят элементы массивов с разделителем между элементами.

Итак:

Join(Array(1,2,3), ", ")

вернется в виде строки:

1, 2, 3

Но с использованием приведенного выше примера:

Join(TestArray(1), ", ")

К сожалению, не работает.

Я знаю, что Join () ожидает одномерный исходный массив, но является ли неспособность рассматривать вложенные массивы как допустимый ввод ограничением самого языка?

Есть ли элегантное решение или всегда приходится разрешать циклически проходить через каждый элемент? вложенного массива, создание временного нового и использование его в качестве входных данных для функции?

1 Ответ

1 голос
/ 06 марта 2020

Вы страдаете от общей путаницы новичков ie с Variants в VBA.

Вариантная переменная в VBA может содержать массив. Это не то же самое, что массив вариантов.

Рассмотрим приведенный ниже код

Public Sub TestArrayWithVariants()

    Dim myArray As Variant
    Dim myVariantArray(0 To 2) As Variant

    myArray = Split("Its,a,variant,containing, an,array", ",")
    ' The next line produces a Can't assign to array error
    myVariantArray = Split("Its,a,variant,containing, an,array", ",")

End Sub

Возникла путаница, поскольку для одномерных массивов нет явного различия в синтаксисе варианта, содержащего массив и массив вариантов.

например,

myArray(0)
myVariantArray(0)

Однако, если мы скажем

myArray(3)=Split("Its,a,variant,containing,an,array", ",")

, то для печати 'варианта' в позиции 2 второго массива будет be

debug.Print myArray(3)(2)

Это отличается от того, если мы объявим myVariantArray как многомерный массив

Dim myVariantArray(0 to 3,0 to 4)

myVariantArray(3,0)="Its"
myVariantArray(3,1)="an"
myVariantArray(3,2)"Array"
myVariantArray(3,3)"Containing"
myVariantArray(3,4)"Variants"

Для варианта, содержащего массив, лучше всего думать о первом измерении, возвращающем анонимный массив и когда мы индексируем в этот анонимный массив, мы получаем любой элемент, расположенный в индексе.

myArray(2)(4)

становится

anonymous_array(4)

и т. д.

Если вы планируете структура данных, основанная на вложенных вариантах, я настоятельно рекомендую вместо этого использовать вложенные коллекции.

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