Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 08:43   #1
Depressive
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 22
По умолчанию Как в VBA создать ассоциативный массив?

Имеется примерно такая таблица, содержащая названия стран и относящихся к ним туристических объектов (для простоты - городов)



Требуется создать двумерный ассоциативный массив, например, в РНР это будет выглядеть так:
PHP код:
$a = Array(
    
"АВСТРИЯ" => Array(
        
"АЙЗЕНШТАДТ",
        
"ВЕНА",
        
"ВЕНСКИЙ ЛЕС",
        
"ГРАЦ",
        
"ДОЛИНА ВАХАУ",
        
"ДОЛИНА ГАШТАЙН",
        
"ЗАЛЬЦБУРГ",
        
"ЗАМКИ ВЕНЫ",
        
"ИНСБРУК"),
    
"БЕЛЬГИЯ" => Array(
        
"БРЮГГЕ",
        
"БРЮССЕЛЬ"),
    
"БОЛГАРИЯ" => Array(
        
"ГАБРОВО",
        
"ОТДЫХ В БОЛГАРИИ",
        
"СОФИЯ",
        
"ТЫРНОВО",
        
"ШИПКА"),
); 
чтобы в дальнейшем обращаться к его элементам, примерно так:
PHP код:
$a["АВСТРИЯ"][2
чтобы произвольно сортировать его, искать в массиве объекты

Пожалуйста подскажите, как это реализовать средствами VBA для Excel?

Заранее благодарю за ответ!
Depressive вне форума Ответить с цитированием
Старый 09.05.2011, 09:26   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

два варианта на выбор (типы только в программном модуле надо обьявить)
Код:
  Type SameArr1
    nm As String
    nms(1 To 100) As String
  End Type
  
  Type SameArr2
    nm As String
    nms As New Collection
  End Type

Sub bb()
  Dim NArr(10) As SameArr1, NCol(10) As SameArr2

  NArr(1).nm = "АВСТРИЯ"
  NArr(1).nms(1) = "АЙЗЕНШТАДТ"
  NArr(1).nms(2) = "ВЕНА"
  NArr(1).nms(3) = "ВЕНСКИЙ ЛЕС"
  NArr(1).nms(4) = "ГРАЦ"
  NArr(2).nm = "БЕЛЬГИЯ"
  NArr(2).nms(1) = "БРЮГГЕ"
  NArr(2).nms(2) = "БРЮССЕЛЬ"
  NArr(3).nm = "БОЛГАРИЯ"
  NArr(3).nms(1) = "ГАБРОВО"
  
  For i = 1 To 2
    MsgBox NArr(2).nm & ", " & NArr(2).nms(i)
  Next
  
  NCol(1).nm = "АВСТРИЯ"
  NCol(1).nms.Add "АЙЗЕНШТАДТ"
  NCol(1).nms.Add "ВЕНА"
  NCol(1).nms.Add "ВЕНСКИЙ ЛЕС"
  NCol(1).nms.Add "ГРАЦ"
  NCol(2).nm = "БЕЛЬГИЯ"
  NCol(2).nms.Add "БРЮГГЕ"
  NCol(2).nms.Add "БРЮССЕЛЬ"
  NCol(3).nm = "БОЛГАРИЯ"
  NCol(3).nms.Add "ГАБРОВО"
  
  For Each ns In NCol(1).nms
    MsgBox NCol(1).nm & ", " & ns
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.05.2011, 15:17   #3
Depressive
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 22
По умолчанию

Спасибо, IgorGO!
Синтаксис несколько неудобен, но думаю, привыкну
Depressive вне форума Ответить с цитированием
Старый 14.05.2011, 00:54   #4
Depressive
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 22
По умолчанию

Что-то я совсем туплю...

Пытаюсь перебрать такой массив в двойном (вложенном) цикле:
Код:
NCol(1).nm = "АВСТРИЯ"
    NCol(1).nms.Add "АЙЗЕНШТАДТ"
    NCol(1).nms.Add "ВЕНА"
    NCol(1).nms.Add "ВЕНСКИЙ ЛЕС"
    NCol(1).nms.Add "ГРАЦ"
NCol(2).nm = "БЕЛЬГИЯ"
    NCol(2).nms.Add "БРЮГГЕ"
    NCol(2).nms.Add "БРЮССЕЛЬ"
NCol(3).nm = "БОЛГАРИЯ"
    NCol(3).nms.Add "ГАБРОВО"

    For i = 1 To UBound(NCol)
        For j = 1 To UBound(NCol(i))
            MsgBox "i=" & i & " : " & "j=" & j & " :: " & NCol(i).nm & ", " & ns
        Next
    Next
но VBA ругается на UBound(NCol(i).nm), что "ожидается массив", но разве NCol(i).nm в данном случае не рассматривается, как массив?

Последний раз редактировалось Depressive; 14.05.2011 в 00:58.
Depressive вне форума Ответить с цитированием
Старый 14.05.2011, 02:58   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Код:
  For i = 1 To UBound(NCol)
        For j = 1 To NCol(i).nms.Count
            MsgBox "i=" & i & " : " & "j=" & j & " :: " & NCol(i).nm & ", " & NCol(i).nms(j)
        Next
    Next
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 14.05.2011, 12:49   #6
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

да можно и без типов:

Код:
Sub t()
Dim sancol As New Collection, sanarr() As String, country, san
ReDim sanarr(1 To 1)
sanarr(1) = "айзенштадт"
ReDim Preserve sanarr(1 To UBound(sanarr) + 1)
sanarr(2) = "вена"
sancol.Add sanarr, "австрия"
ReDim sanarr(1 To 1)
sanarr(1) = "габрово"
sancol.Add sanarr, "болгария"
For Each country In sancol
    For Each san In country
    Debug.Print san
Next san, country
MsgBox sancol("австрия")(2)
End Sub
slan вне форума Ответить с цитированием
Старый 14.05.2011, 13:22   #7
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

но никто не мешает и так:

Sub ar()
Dim arr
arr = Array(Array(1, 2), Array(1, 2, 3))
End Sub
slan вне форума Ответить с цитированием
Старый 14.05.2011, 15:36   #8
Depressive
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 22
По умолчанию

Спасибо, doober!
Почти то, что надо!
Не понятно, является ли в конце-концов, NCol(i).nms массивом. Например, можно ли применять к нему сортировку, т.е. вначале отсортировать по первой размерности - страны (колонка "А"), затем по второй - туробъекты (колонка "В"). См. скриншот в начале топика.
Depressive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавлять новые элементы (ключ=>значение) в ассоциативный массив программно. SkAndrew PHP 38 09.04.2012 20:18
Ассоциативный массив iMax` Общие вопросы C/C++ 2 03.02.2011 09:37
SOAP и ассоциативный массив Zigmuntfreyd Работа с сетью в Delphi 1 12.07.2010 16:55
Ассоциативный массив phpcreator Помощь студентам 0 14.05.2010 20:18
Ассоциативный массив. Map phpcreator Помощь студентам 0 08.05.2010 11:57