2009-04-15 79 views
1

我正在为客户端维护传统的VBA/Access 2000应用程序。他们有一个客户谁电子邮件订单的文字,看起来像这样VBA - 解析电子邮件文本以访问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)功能,将读取表单中的文本,但我没有我dea如何处理VBA中的解析。
我开始创建一个预先输入令牌的2D数组,但由于我必须读取数组中的下一个项目才能确定何时停止接受前一个令牌的数据,所以这似乎很笨重。

对此提出建议?

回答

3

这相当简约;请添加您自己的错误检查。需要添加一个引用到“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 
+1

很NICE !我完全忘记了FSO中有一个Dictionary对象。 – 2009-04-15 06:07:58