2009-04-15 78 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