UDF для извлечения определенных данных из общей строки

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь создать функцию типа =Extractinfo(«A2″,»Name»), которая может извлекать имя, телефон и идентификатор электронной почты из необработанных данных, одну функцию для всех 3 извлечений, у меня уже есть функция для извлечения идентификатора электронной почты

  Raw Data

"Name":"Ram","Phone":"9898989898","Email":"abcd@gmail.com"
"Name":"Raju","Phone":"2323232323","Email":"xyz123@gmail.com"
"Name":"Rameshsing","Phone":"555999999","Email":"rameshsing@gmail.com"

(Function to extract)          (Expected Result)
=Extractinfo("A2","Name")      Ram
=Extractinfo("A2","Name")      Raju
=Extractinfo("A4","Name")      Rameshsing


Function ExtractEmailFun(extractStr As String) As String

 Dim CharList As String
 On Error Resume Next
CheckStr = "[A-Za-z0-9._-]"
OutStr = ""
Index = 1
Do While True
Index1 = VBA.InStr(Index, extractStr, "@")
getStr = ""
If Index1 > 0 Then
    For p = Index1 - 1 To 1 Step -1
        If Mid(extractStr, p, 1) Like CheckStr Then
            getStr = Mid(extractStr, p, 1) amp; getStr
        Else
            Exit For
        End If
    Next
    getStr = getStr amp; "@"
    For p = Index1   1 To Len(extractStr)
        If Mid(extractStr, p, 1) Like CheckStr Then
            getStr = getStr amp; Mid(extractStr, p, 1)
        Else
            Exit For
        End If
    Next
    Index = Index1   1
    If OutStr = "" Then
        OutStr = getStr
    Else
        OutStr = OutStr amp; Chr(10) amp; getStr
    End If
Else
      Exit Do
End If
Loop
ExtractEmailFun = OutStr
End Function
 

Комментарии:

1. Какова ваша общая цель и каков источник данных? Если ваша цель — создать таблицу, то Power Query вы можете сделать это довольно легко. Если вам нужно, чтобы элементы были разделены по какой-либо другой причине, одним из способов является использование регулярных выражений.

2. Если ваши данные в формате JSON, то есть лучшие способы приблизиться к этому.

3. Находятся ли эти строки в ячейке? И все ли записи имеют форму «Имя»: «Оперативная память», «Телефон»: «9898989898», «Электронная почта»: «abcd@gmail.com »

4. Да, это формат JSON, и он находится в одной ячейке, из которой я пытаюсь извлечь

Ответ №1:

Ваши НЕОБРАБОТАННЫЕ данные, похоже, соответствуют формату JSON. Одна вещь, которую можно сделать, это использовать модуль (например, этот, который очень хорошо работал для меня) для его анализа (т. Е. Наведите в нем некоторый порядок, чтобы вы могли легко получить искомый результат).

Следуйте простым инструкциям, чтобы добавить этот модуль в ваш проект VBA (не забудьте добавить ссылку на Microsoft.Scripting!). Тогда ваша функция будет выглядеть следующим образом :

 Public Function Extractinfo(byval CompleteString as String, byval FieldName as String) as String

    Dim JSON as Object
    Set JSON = JsonConverter.ParseJson(CompleteString)

    ExtractInfo = JSON(FieldName)

End Function
 

Этот пример кода чрезмерно упрощен (не имеет никакой обработки ошибок), но это должно помочь вам начать.

Ответ №2:

Как насчет:

 Public Function ExtractInfo(s As String, choice As String) As String

    dq = Chr(34)
    arr = Split(s, dq)

    If choice = "Name" Then
        ExtractInfo = arr(3)
        Exit Function
    End If

    If choice = "Phone" Then
        ExtractInfo = arr(7)
        Exit Function
    End If

    If choice = "Email" Then
        ExtractInfo = arr(11)
        Exit Function
    End If

    ExtractInfo = "bad data"
End Function
 

введите описание изображения здесь

Это предполагает, что все ваши данные соответствуют одной и той же схеме. Варианты будут:

 =extractinfo(A1,"Name")
=extractinfo(A1,"Phone")
=extractinfo(A1,"Email")
 

Вы также можете использовать Case для этого.

Комментарии:

1. это работает отлично, это то, что я искал, чем вы так много