Excel VBA - scripting.dictionary и чтение из переменной (созданной) локации - PullRequest
0 голосов
/ 13 октября 2018

У меня сложная многоуровневая структура словаря, содержащая ответ JSON.

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

Например, если моя таблица поиска имеет

TARGET_TBL_FIELD           DICT_LOCATION     
Hostname                   data.dc.hostname
Main_Contact               data.owner.contact1

, я хочу получить JSON и затем построить таблицу, используя.

row 1, cell1 = dict.("data")(1)("dc")("hostname") 
row 1, cell2 = dict.("data")(1)("owner")("contact1") 
row 2, cell1 = dict.("data")(2)("dc")("hostname")
row 2, cell2 = dict.("data")(2)("owner")("contact1")

Ипродолжайте, пока не останется больше элементов данных, dc и owner всегда будут одним набором данных.

В любом случае, я написал весь код, но застрял.

Я используютаблица поиска для построения строковой переменной Excel с путем к словарю.

 For Each ghdLookupRow In ghdLookupTable.ListRows

                                  ssFieldLabel = ghdLookupRow.Range(1, ghdLookupColumns("SS_TITLE").Index).Value
                                  ssFieldSource = ghdLookupRow.Range(1, ghdLookupColumns("GHD_SOURCE").Index).Value
                                  ssFlattenData = ghdLookupRow.Range(1, ghdLookupColumns("FLATTEN_DATA").Index).Value

                                  If ghdRow = 1 Then
                                   ' Write header data into array
                                    'qcDataArray(1, 1) = ssFieldLabel
                                    ghdDataArray(c, 0) = ssFieldLabel
                                  End If
                                   ' pass the field source string , dictionary object and row number into command to retrieve data
                                   ghdFieldValue = getJsonField(ghdData, ghdRow, ssFieldSource, ssFlattenData)

                                   ' Store the data retrieved from the Json
                                   ghdDataArray(c, ghdRow) = ghdFieldValue

                                  'increment column variable

                                  c = c + 1
                           Next

Где функция getJsonField

Function getJsonField(ghdData As Dictionary, ghdRow As Long, fieldPath As String, flattenData As Boolean) As String
   Dim field As Variant, ghdPath As String
   ghdPath = "ghdData(" & Chr(34) & "data" & Chr(34) & ")(" & ghdRow & ")"

   For Each field In Split(fieldPath, ".", , vbTextCompare)
    ghdPath = ghdPath & "(" & Chr(34) & field & Chr(34) & ")"

   Next

   'The ghdPath string has the correctly structured path for the dictionary location e.g "ghdData("data")(1)("dc")("hostname")"
   ' How do I "call" the string as if it was a written command
   ' so how do I retrieve the data?
   ' If I write the line specifically then it returns

    getJsonField = ghdData("data")(1)("dc")("hostname")

    'How do I 'evaluate' the string as a command?
    getJsonField = ***How.To.Evaluate***(ghdPath)


End Function

Итак, у меня есть строковая переменная, содержащая данные {dict. ("") (1) (" dc ") (" hostname ")}.

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

Не могувыяснить, как «выполнить» или «вызвать» содержимое переменной в качестве объекта сценарияct путь к местоположению, чтобы получить данные и записать их в соответствующую ячейку.

Возможно ли это?

...