Не удается перебрать Hashtable в VBA (Excel) - PullRequest
4 голосов
/ 30 декабря 2011

Я использую Hashtable (ссылка на mscorlib.dll).Я заполняю его данными, я могу получить любой элемент (при условии, что я конвертирую тип запроса в точно такой же тип, который хранится в хеш-таблице) .ContainsValue / Key - все это работает.Но я не могу перебрать его через цикл For Each.Я перепробовал все методы, которые мог найти в Интернете (для каждого элемента ..., где элементом является DictionaryEntry, через GetEnumerator), но ни один из них не работает - я могу пролистать таблицу через перечислитель, но не могу добраться до ключани значение того, где расположен итератор.Что я делаю неправильно?Я решил это временно, установив ключи для чисел и итерируя по этим числам, но это не сработает, потому что, наконец, будет одно и то же число дважды ...

PS: я не могу использовать словарьвместо Hashtable, потому что мне нужны и ContainsKey, и ContainsValue, а также возможность извлекать элементы по ключам или по значениям.

РЕДАКТИРОВАТЬ: мой текущий код (то, что я ищу, это заменить цикл «For i»,поэтому мне не нужны ключи, чтобы быть числами, которые я уже знаю)

For i = 1 To UBound(rands)
        chopped_yes = Split(ThisWorkbook.Worksheets(1).Range("Z" & rands(i)))
        chopped_no = Split(ThisWorkbook.Worksheets(1).Range("AA" & rands(i)))
        chopped_any = Split(ThisWorkbook.Worksheets(1).Range("AB" & rands(i)))
        For Each part In chopped_yes
            If rules_yes.ContainsValue(cscs.item(CLng(rands(i)))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
        For Each part In chopped_no
            If rules_no.ContainsValue(cscs.item(CLng(rands(i)))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
        For Each part In chopped_any
        pepa = cscs.item(CLng(rands(i)))
        chopped_pepa = Split(pepa, "=")
            If rules_any.ContainsValue(CStr(chopped_pepa(0))) Then
                validcsc = 0
                GoTo WriteIt
            End If
        Next part
    Next i

Что делает код:


Хэш-таблица cscs содержит пару ключевое слово / option_value, некоторые ключевые слова конфликтуют с другими, hashtables rules_any / yes / no содержат ключевые слова, которые конфликтуют, если проверено одно из ключевых слов = YES / NO / SOMETHING и для validcsc задано значение 0 (или недопустимая комбинация ключевых слов).


rands - массивуникальные числа - проблема в том, что если существует более одного конфликтующего ключевого слова, то у меня нет номера для ключа, который я узнаю позже и использую его для итерации

Ответы [ 2 ]

6 голосов
/ 09 марта 2013

На самом деле существует один способ просмотра хеш-таблицы .NET из VBA:

Dim hash As mscorlib.Hashtable
Set hash = New mscorlib.Hashtable

Call hash.Add("foo", "bar")
Call hash.Add(4, 8)

Dim keys As IEnumerable
Set keys = hash.keys

Dim key As Variant
For Each key In keys

    Dim value As Variant

    value = hash.Item(key)
Next

Основной проблемой является «приведение» возвращаемого значения свойства «Ключи» в IEnumerable до с использованием его в цикле «для каждого». VBA не может обрабатывать множественное наследование интерфейса с нуля: вам нужно привести к интерфейсу, которому принадлежит функция / свойство, прежде чем вы сможете его вызвать.

1 голос
/ 01 февраля 2012

VBA не может обрабатывать тип DictionaryEntry (элемент hashtable) или тип ICollection (это то, что возвращает метод .Keys), поэтому единственным решением было написать собственную библиотеку.

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