2013-09-05 3 views
1

В Python я привык иметь что-то вроде defaultdict, где я могу просто добавить много значений к данному ключу. В Excel кажется, что если я использую объект Dictionary из Runtime Scripting, я могу добавить только один элемент за ключ.Excel словарь с несколькими значениями?

Есть ли способ, что я могу сделать что-то вроде этого:

  1. Если в словаре отсутствует ключ, добавить список (первый элемент) под Dict [ключ]
  2. Если в словаре есть ключ, добавьте элемент в уже существующий список под dict [ключ]

Надеюсь, что я достаточно ясен. Может быть, вместо списка я имею в виду массив, не уверен.

Попытка:

 Dim collect As New collection 

     If Not dict.Exists(key) Then 
      dict.Add key, collect 
     End If 

     collect = dict.Item(key) 
     collect.Add (val) 

     dict.Item(key) = collect 
+0

Звучит довольно просто. У VBA есть объект Collection - http://msdn.microsoft.com/en-us/library/yb7y698k(v=vs.90).aspx - поэтому вы просто пишете пару методов: один возьмет dict, ключ и значение в качестве параметров и воспроизводит логику, которую вы псевдокодировали в своем вопросе; используйте Collection для списка значений. Другой возьмет dict и ключ и вернет значения для ключа в любой форме, какой вам нравится. –

+0

Вам нужно добавить 'Set' для ваших назначений объектов. Тогда он должен работать – RBarryYoung

ответ

1

Вы пропускаете Set ключевое слово, необходимое в VBA для назначения объектов. Однако вы можете обойти их с гораздо более компактным форматом в любом случае:

If Not dict.Exists(Key) Then dict.Add Key, New Collection 

dict.Item(Key).Add Val 

Если вы хотите сохранить старый формат, то это, как:

Dim collect As New collection 

    If Not dict.Exists(key) Then 
     dict.Add key, collect 
    End If 

    Set collect = dict.Item(key) 
    collect.Add (val) 

    Set dict.Item(key) = collect 

Но более компактный формат выше работает отлично также.

+0

@ user2680039 Извините, теперь нужно исправлять. – RBarryYoung

+0

@ user2680039 ОК, первый пример был исправлен для проблемы «Аргумент не факультативный». Вторая проблема вызвана чем-то другим, возможно, кодом вызова или кодом, который предшествует этому коду. Вам нужно будет показать нам всю процедуру и/или контекст кода вызывающего. – RBarryYoung

+0

Это очень полезно! – Bawn

Смежные вопросы