2009-04-15 11 views
1

クライアント用の従来のVBA/Access 2000アプリケーションを維持管理しています。彼らは、アプリケーションが、属性のすべてと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[email protected] 

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

などのように見えるテキストで

を電子メールの注文顧客を持っています。私のクライアントは、電子メールからテキストを貼り付け、検証のためにフィールドを解析してからdbに書き込むフォームを必要としています。

問題/事実:

  1. それぞれの値が「ValueNameのでオフに設定されている:電子メールクライアントはしてもしなくてもよい、それぞれの末尾にCRLFがあるかもしれない文字列をマングル方法に応じて、「トークン
  2. ライン。
  3. 欠損値は「いいえ、ただのトークンを持っている」または空のスペースになります。

私は、フォームからテキストを読んでいましたCreateOrder(OrderText As String)関数を作成したいのですが、私は何も私を持っていません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

非常に素晴らしいです!私は、FSOにDictionaryオブジェクトがあることを完全に忘れていました。 –

+0

私は、レイトバインディングでFSOを使用して、1つのコードにしか使用されないリファレンスを追加するのをやめるほうがよいと思います。 –

関連する問題