2009-04-15 4 views
1

Je gère maintenant une ancienne application VBA/Access 2000 pour un client. Ils ont un client qui emails commandes avec le texte qui ressemble à ceciVBA - Analyser le texte d'un message dans une instance de classe Access

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 

etc ...

L'application a une classe VBA avec tous les attributs, mais aucun moyen pour analyser les données dans les champs appropriés. Mon client veut un formulaire dans lequel il peut coller le texte à partir de l'e-mail, l'analyser dans les champs pour vérification et ensuite écrire sur la base de données.

Questions/Faits:

  1. Chaque valeur est déclenché avec « ValueName:" jeton
  2. Selon la façon dont les clients de messagerie Mutile la chaîne il peut ou peut ne pas être un CrLf à la fin de chaque ligne.
  3. les valeurs manquantes auront juste le jeton, non « » ou espace vide.

Je voudrais créer une fonction CreateOrder(OrderText As String) qui lire le texte de la forme, mais je n'ai pas i Dea comment gérer l'analyse syntaxique dans VBA.
J'ai commencé à créer un tableau 2D avec les jetons pré-saisis, mais cela semble maladroit puisque je dois lire l'élément suivant dans le tableau pour savoir quand arrêter d'accepter les données pour le jeton précédent.

Suggestions?

Répondre

3

Ceci est assez minimaliste; Veuillez ajouter votre propre vérification d'erreur. Vous avez besoin d'ajouter une référence à la "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 

Je l'ai utilisé en créant une forme simple avec une zone de texte et le bouton, et a ajouté à la touche événement click:

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

Very Nice ! J'ai complètement oublié qu'il y avait un objet Dictionary dans le FSO. –

+0

Il vaudrait mieux, je pense, utiliser le FSO avec une liaison tardive afin d'éviter d'ajouter une référence qui ne sera utilisée que pour un seul morceau de code. –

Questions connexes