Excel VBA (не VBScript) 101: Как мне создать и прочитать многомерный массив? - PullRequest
2 голосов
/ 19 сентября 2011

Я использую Excel 2010, и у меня есть макрос, который должен загрузить результаты OData в массив в памяти. Единственная часть, которую мне не хватает, это как создать этот массив в Excel.

Как создать многомерный массив (или массив класса) в Excel 2010?

Единственное ограничение, которое у меня есть, заключается в том, что все, что я создаю, должно содержаться в XLSX. Это означает, что зависимости от PowerPivot, надстроек и т. Д. Отсутствуют. Я думаю, что это оставляет меня только с макросами VBScript.

Я часами искал в MSDN, StackOverflow и Google и не могу найти наглядного примера того, как это сделать.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

В качестве дополнения к ответу @Jeremy:

вы МОЖЕТЕ перенаправить многомерные массивы.

DIM arr() as Variant 'or object or class or whatever.  
Redim arr(1 To 1, 1 To 1) 'works 
Redim arr(1 To 3, 1 To 3) 'works, but deletes any existing data
Redim Preserve arr(1 To 3, 1 To 10) 'works and keeps any data
Redim Preserve arr(1 To 10, 1 To 10) 'fails, you can only redm preserve the last dimension

Выбор массивов, коллекций (или словарей) для вашего приложения зависит от деталей вашего приложения

2 голосов
/ 19 сентября 2011

Открыть Excel

Нажмите Alt + F11

Щелкните правой кнопкой мыши по VBAProject> Вставить> Класс

Укажите Имя для класса VBA «Персона» в левой панели., диалог свойств

Дайте классу Person свойство, например, firstname

Public FirstName As String

Создайте файл второго класса или модуля, и вот как создать / получить доступ к массиву класса People:

Public colOfPeople As New Collection

Public Function MakePeople() As String

Dim clsP As New clsPerson
clsP.FirstName = "Jeremy"

colOfPeople.Add (clsP)

End Function

Решение 1: Чтобы сделать этот многомерный объект, я сделал коллекцию массивом:

Public multiColOfPeople() As New Collection

Public Function MakeMultiPeople() As String

ReDim Preserve colOfPeople(1) 'dimension multi-array collection
Dim clsP As New clsPerson
clsP.FirstName = "Jeremy"
colOfPeople(0).Add (clsP)

Dim clsP1 As New clsPerson
clsP1.FirstName = "Lisa"
colOfPeople(1).Add (clsP1)

End Function

Решение 2: Использование мультимассив (без коллекции)

Public multiArray(3, 3) As New clsPerson

Dim clsP As New clsPerson
'store
multiArray(0, 1) = clsP
'retrieve
clsP = multiArray(0, 1)

Редактировать *

Чтобы использовать второе решение, см. ответ Криса Нейлсена для получения информации о многомерном ReDim'ingмассивы

...