VBA - 将电子邮件文本解析为访问2000类实例

时间:2009-04-15 05:09:56

标签: string vba ms-access access-vba

我现在正在为客户端维护传统的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:“标记
  2. 设置
  3. 根据电子邮件客户端如何破坏字符串,每行末尾可能有也可能没有CrLf。
  4. 缺少值只有令牌,没有“”或空格。
  5. 我想创建一个CreateOrder(OrderText As String)函数来读取表单中的文本,但我不知道如何在VBA中处理解析。
    我开始使用预先输入的标记创建一个2D数组,但这似乎很笨重,因为我必须读取数组中的下一个项目,以确定何时停止接受前一个标记的数据。

    建议?

1 个答案:

答案 0 :(得分:3)

这是相当简约的;请添加您自己的错误检查。需要添加对“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