VBA — анализ текста электронной почты для доступа к экземпляру класса 2000

Сейчас я поддерживаю устаревшее приложение VBA/Access 2000 для клиента. У них есть клиент, который отправляет заказы по электронной почте с текстом, который выглядит следующим образом.

Contact: Peggy Hill
Company: Arlen Residential Mortgage Finance Co
Address: 43456 South 18939 West, Suite 47995
City: Arlen City
ContactState: TX
ContactZip: 88888
Phone: 8019990000
Email: [email protected]

DateOrdered: 4/6/09
DateDue: 4/15/09

и т.д...

Приложение имеет класс VBA со всеми атрибутами, но не может разобрать данные в соответствующие поля. Моему клиенту нужна форма, в которую он может вставить текст из электронного письма, проанализировать его в полях для проверки, а затем записать в базу данных.

Проблемы/Факты:

  1. Каждое значение устанавливается с помощью токена 'ValueName: "
  2. В зависимости от того, как почтовые клиенты искажают строку, в конце каждой строки может быть или не быть CrLf.
  3. Отсутствующие значения будут иметь только токен, без "" или пустого места.

Я хотел бы создать функцию CreateOrder(OrderText As String), которая будет читать текст из формы, но я понятия не имею, как обрабатывать синтаксический анализ в VBA.
Я начал создавать 2D-массив с предварительно введенными токенами, но это кажется неуклюжим. так как я должен прочитать следующий элемент в массиве, чтобы выяснить, когда прекратить прием данных для предыдущего токена.

Предложения?


person Gary.Ray    schedule 15.04.2009    source источник


Ответы (1)


Это довольно минималистично; пожалуйста, добавьте свою собственную проверку ошибок. Необходимо добавить ссылку на «Среду выполнения сценариев Microsoft».

Public Function Parse(msg As String) As Dictionary
   Dim i As Integer, pos As Integer
   Dim line As Variant
   Dim lines() As String
   Dim dict As New Dictionary

   lines = Split(msg, vbCrLf)
   For Each line In lines()
      pos = InStr(1, line, ":", vbTextCompare)
      If pos <> -1 Then
        dict.Add Trim$(Left$(line, pos - 1)), Trim$(Right$(line, Len(line) - pos))
      End If
   Next

   Rem: Access values like this (with null checks):
   Rem:    dict("Contact"), dict("Address")

   Set Parse = dict

End Function

Я использовал его, создав простую форму с текстовым полем и кнопкой и добавил это к событию нажатия кнопки:

Private Sub Command2_Click()
    Dim dict As Dictionary

    Text0.SetFocus
    Set dict = Parse(Text0.text)

    Debug.Print dict("Contact"), dict("Address")

    Rem clear up when done
    Set dict = Nothing

End Sub
person Mitch Wheat    schedule 15.04.2009
comment
Очень хорошо! Совсем забыл, что в ФСО есть объект Словарь. - person Gary.Ray; 15.04.2009
comment
Я думаю, было бы лучше использовать FSO с поздним связыванием, чтобы не добавлять ссылку, которая будет использоваться только для одного фрагмента кода. - person David-W-Fenton; 16.04.2009