Предварительное определение многомерного массива в Excel VBA - PullRequest
8 голосов
/ 04 августа 2011

Я знаю, что мы можем определить одномерный массив в Excel VBA, используя следующую команду:

 GroupCols = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

Как вы можете задавать многомерный массив таким же образом?

Также я хочу сохранитьотслеживать определенные уровни следующим образом

 Level[16][0]
 Level[16][1]
 Level[16][2]

 Level[8][0]
 Level[8][1]
 Level[8][2]

 Level[7][0]
 Level[7][1]
 Level[7][2]

Первый индекс определяет уровень и, следовательно, может не быть последовательным ... как после 16 - прямое 8 и так далее.Для каждого мне нужно 3 информации, что составляет 0,1,2 секунды.

Кто-нибудь может подсказать мне, как добиться того же в Excel VBA?

Ответы [ 4 ]

9 голосов
/ 05 июля 2012

Существует способ определить двумерный массив с помощью методаvalu (), почти как при использовании array () для 1D:

Sub Array2DWithEvaluate()

Dim Array2D As Variant

'[] ist a shorthand for evaluate()
'Arrays defined with evaluate start at 1 not 0

Array2D = [{"1,1","1,2","1,3";"2,1","2,2","2,3"}]

Debug.Print Array2D(2, 2) '=> 2,2

End Sub

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

Sub Array2DWithEvaluateFromString()

Dim strValues As String
Dim Array2D As Variant

strValues = "{""1,1"",""1,2"",""1,3"";""2,1"",""2,2"",""2,3""}"

Array2D = Evaluate(strValues)

Debug.Print Array2D(2, 2) '=> 2,2

End Sub

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

http://www.ozgrid.com/forum/showthread.php?t=52372

9 голосов
/ 04 августа 2011

В таком массиве не может быть непоследовательных индексов. Если вы используете только непоследовательное подмножество индексов, тогда все остальные элементы будут пустыми, но все равно будут занимать место для хранения, которое неэффективно и подвержено ошибкам (LaunchMissile = Levels(17,1), упс!)

То, что вы ищете, это объект Dictionary. Перед использованием необходимо установить ссылку следующим образом: Инструменты> Справочные материалы> проверить Microsoft Scripting Runtime.

Пример:

Dim Levels As Scripting.Dictionary
Set Levels = New Scripting.Dictionary

' Fill up the dictionary
Levels.Add Key:=16, Item:=Array("A", "B", "C")
Levels.Add Key:=8, Item:=Array("FAI", "CNT", "YES")
Levels.Add Key:=7, Item:=Array("Once", "Twice", "Thrice")

' Retrieve items from the dictionary
Debug.Print Levels.Item(8)(0)
Debug.Print Levels.Item(8)(1)
Debug.Print Levels.Item(8)(2)

Обратите внимание, что объект Collection также может помочь. Преимущество: родной для VBA, поэтому нет необходимости устанавливать ссылку. Недостаток: ключ только для записи, что может быть довольно неудобно.

3 голосов
/ 04 августа 2011

Вы можете использовать Array(Array()), например,

data = Array(Array(1,2), Array(3,4))

Чтобы обратиться к первому элементу, используйте data(0)(0)

(скопировано отсюда )

0 голосов
/ 04 августа 2011

Нет способа объявить и заполнить двумерный массив, как при использовании функции array (). Вы можете использовать ReDim, чтобы определить размеры массива, а затем заполнить его. Вот пример:

ReDim myArray(0 To 16, 0 To 3)
myArray(0, 0) = "A"
myArray(0, 1) = "B"
...

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

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