VBA - анализ текста электронной почты для доступа к экземпляру класса 2000 - PullRequest
1 голос
/ 15 апреля 2009

Сейчас я поддерживаю устаревшее приложение 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: peggy.hill@arlenmortgage.com

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

и т.д ...

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

Вопросы / Факты:

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

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

Предложения

1 Ответ

3 голосов
/ 15 апреля 2009

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

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
...