Как извлечь значение из массива в Excel с VBA - PullRequest
0 голосов
/ 05 декабря 2018

В моей таблице есть ячейка A1, содержащая массив в виде строки в следующем формате: [{'type':'general', 'name':'light'},{'type':'brand', 'name':'lighti'},{'type':'misc', 'name':'Sale%'}]

Теперь я хочу создать новый лист с именем бренда "lighti" в видеотдельная ячейка-значение.Это значит: я хочу получить значение в A1, найти тип «brand», вернуть название бренда и вставить его в A2.Вот и все.

Как извлечь значение массива с помощью VBA?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать пользовательскую функцию для считывания значения из A1, применения разделения с поисковым термином и анализа необходимой информации.Использование синтаксического анализатора JSON кажется излишним, хотя эта строка является JSON, и вы можете извлечь ее таким образом.

Option Explicit

Public Sub test()
    [A2] = GetValue([a1], "brand")
End Sub
Public Function GetValue(ByVal rng As Range, ByVal searchTerm As String) As Variant
    '[{'type':'general', 'name':'light'},{'type':'brand', 'name':'lighti'},{'type':'misc', 'name':'Sale%'}]
    On Error GoTo errhand
    GetValue = Split(Split(rng.Value, "{'type':'" & searchTerm & "', 'name':'")(1), "'")(0)
    Exit Function
errhand:
    GetValue = CVErr(xlErrNA)
End Function

Если бы вы использовали JSONParser, например JSONConverter.bas Вы можете проанализировать JSON следующим образом.Примечание. После добавления .bas в ваш проект вам нужно перейти в VBE> Инструменты> Ссылки и добавить ссылку на Microsoft Scripting Runtime.

Option Explicit
Public Sub test()
    [A2] = GetValue([a1], "brand")
End Sub
Public Function ExtractItem(ByVal rng As Range, ByVal searchTerm As String) As Variant
    Dim json As Object, key As Object
    json = JsonConverter.ParseJson(rng.Value)
    For Each item In json
        For Each key In item
            If key = searchTerm Then
                GetValue = item(key)
                Exit Function
            End If
        Next
    Next
    ExtractItem = CVErr(xlErrNA)
End Function
0 голосов
/ 05 декабря 2018

Вы можете использовать ActiveX ScriptControl с Language, установленным на JScript, и проанализировать строку как фактический JSON.

Затем вы можете просто написать функцию Javascript, которая возвращает «имя» на основе «типа».Для этого вам не нужны никакие внешние библиотеки / другие макросы и т. Д.:

Option Explicit
Public Sub UseScriptControlAndJSON()
    Dim JsonObject As Object
    Dim resultString As String
    Dim ScriptEngine As Object

    'get the script control:
    Set ScriptEngine = CreateObject("ScriptControl")
    ScriptEngine.Language = "JScript"

    'Add javascript to get the "name" based on "typeName":
    ScriptEngine.AddCode "function findByType(jsonObj, typeName) { for (var i = 0; i < jsonObj.length; i++) { if (jsonObj[i].type == typeName){ return jsonObj[i].name; }}}"

    'Get the string and parse it:
    Set JsonObject = ScriptEngine.Eval("(" & Range("A1").Value & ")")

    'Now get the resulting "name" using the JS function, by passing in "brand" as type:
    resultString = ScriptEngine.Run("findByType", JsonObject, "brand")

    'Will pop-up: "lighti"
    MsgBox resultString
End Sub

Примечание 1: функция JS вернет первое вхождение.

Примечание 2: Строго говоря, вывы не используете VBA для извлечения значения.

Примечание 3. Протестировано с 32-битным Excel 2016 на 64-битной машине;Управление сценарием является 32-битным компонентом - см., например, этот вопрос + ответы - На 64-битной системе вы можете заставить его работать с некоторыми обходными путями согласно одному из ответов в этой ссылке.

0 голосов
/ 05 декабря 2018

Если слово «бренд» предшествует названию бренда каждый раз, то

Function GetNameOfBrand(celltext As String) As String
Dim x As Long
Dim s As String
x = InStr(celltext, "brand")
If x = 0 Then
    GetNameOfBrand = ""
Else
    s = Mid(celltext, x + 16, Len(celltext) - x + 15)
    x = InStr(s, "'")
    s = Left(s, x - 1)
    GetNameOfBrand = s
End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...