Хранение пар ключ-значение в макросе VBA

Заключительный этап длинного макроса, который я написал в Outlook, состоит в том, чтобы направить электронное письмо соответствующему человеку, в зависимости от всего, что обнаружил макрос. Я сделал это до того, как использовал лист excel и vlookup значения «Key», но в этом случае пары ключ-значение будут статическими, и поэтому excel кажется излишним и замедлит работу.

И ключ, и значение будут строками, скорее всего, менее 50 символов каждая, но, вероятно, будет около 1500 пар. Было бы лучше скомпилировать его в какую-то DLL или что-то в этом роде?


person Martin KS    schedule 03.11.2017    source источник
comment
Взгляните на объект Scripting.Dictionary: msdn. microsoft.com/en-us/vba/language-reference-vba/articles/   -  person Kostas K.    schedule 03.11.2017
comment
конечно, создание словаря из 1500 пар с 1500 строками кода каждый раз, когда запускается макрос, было бы немного медленным?   -  person Martin KS    schedule 03.11.2017
comment
если только я не ошибся концом палки; инициализация словаря: d.Add "a", "Athens" d.Add "b", "Belgrade" и т.д.   -  person Martin KS    schedule 03.11.2017
comment
Нет, это как вы добавляете к нему. Словарь не входит в стандартную библиотеку VBA, он находится в библиотеке Microsoft Scripting Runtime. Поэтому вам нужно либо добавить ссылку на библиотеку, либо создать объект, используя CreateObject("Scripting.Dictionary"). Множество ресурсов в Интернете, чтобы увидеть, как это работает и, самое главное, для чего оно используется. Возможно, вам подойдет простая встроенная коллекция.   -  person Kostas K.    schedule 03.11.2017
comment
@MartinKS - см. также эту ссылку, вы можете легко просмотреть словарь - excelmacromastery.com/vba-dictionary< /а>   -  person Vityata    schedule 03.11.2017
comment
Хорошо, я понимаю, как пользоваться словарем, и это именно то, что мне нужно для быстрого поиска маршрутов. В настоящее время у меня есть список из 1500 значений пар ключей, но как лучше всего подготовить их к макросу для каждого запуска?   -  person Martin KS    schedule 03.11.2017
comment
@MartinKS: сразу приходят на ум два способа: (1) сохранить их в книге, которая обрабатывается макросом при запуске; или (2) Напишите код для написания процедуры инициализации из того места, где у вас сейчас хранится список. Кстати: объект VBA Collection является словарем ключ-значение по своей сути.   -  person Pieter Geerkens    schedule 03.11.2017
comment
@PieterGeerkens - я полагаю, что файл csv - это более быстрый вариант, чем запуск копии Excel, поэтому я проверю этот маршрут.   -  person Martin KS    schedule 03.11.2017
comment
@MartinKS: обратите внимание, что приложением по умолчанию, связанным с расширением .csv, часто является EXCEL.exe. ;-)   -  person Pieter Geerkens    schedule 03.11.2017
comment
@PieterGeerkens - я просто собирался использовать обычную Open csvFilePath For Input As #FileNum, но спасибо, что напомнили   -  person Martin KS    schedule 03.11.2017


Ответы (1)


Простой способ — поместить все значения в текстовый файл, разделив ключ и значение пробелом (или другим подходящим символом, если в ключе или значении есть пробелы), а затем добавить их в словарь. На моем 300-мегагерцовом P3 это занимает менее секунды.

Dim objDict As Object, objFSO As Object, objFile As Object
Dim strLine As String, strs As Variant

Set objDict = CreateObject("Scripting.Dictionary")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFile, forReading)
For ii = 1 To 1500
    strs = Split(objFile.ReadLine(), " ")
    objDict.Add strs(0), strs(1)
Next
objFile.Close
person cup    schedule 03.11.2017
comment
Спасибо - это ответ, который был достигнут в комментариях - person Martin KS; 03.11.2017