2009-04-15 2 views
1

이제 클라이언트에 대한 기존 VBA/Access 2000 응용 프로그램을 유지 관리 중입니다. 그들은 사람의 이메일 주문이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: [email protected] 

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

등과 같은 텍스트와 고객 ...

응용 프로그램은 해당 필드에 데이터를 구문 분석하는 모든 속성하지만 방법과 VBA 클래스가 있습니다. 제 의뢰인은 전자 메일에서 텍스트를 붙여 넣을 수있는 양식을 원하고 확인을 위해 필드를 구문 분석 한 다음 db에 쓰십시오.

문제/현황 :

각 값이 '값 이름으로 출발한다
  1. : "토큰
  2. 이메일 클라이언트가 문자열을 난도질하는 방법에 따라하는 것은 각 끝에 CRLF가되지 않을 수도 있습니다 라인.
  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를 사용하여 후기 바인딩을 사용하면 한 코드에만 사용되는 참조를 저장하는 것이 더 좋을 것입니다. –

관련 문제