VBA Word ->Wert aus CSV in Feld

Kalito

Erfahrenes Mitglied
Hallo,

ich habe eine CSV, die verschiedene Aufträge beinhaltet. Jetzt soll ich ein Makro schreiben, welches aus der CSV alle Losnummern ausliest. Die ermittelten Losnummern sollen dann in ein bestimmtes Feld in Word angezeigt werden. Dabei sollen nicht alle Losnummern auf einmal angezeigt werden, sondern pro Losnummer soll eine seperate Seite erzeugt werden (Wie bei einem Serienbrief). Anhand der angehängten CSV müssen demnach 4-Seiten bei der Ausführung generiert werden.

Ich kenne mich bei VBA leider so garnicht aus und komme noch nicht so auf einen grünen Zweig.

Dankefür eure Hilfe.

Gruß Patrick
 

Anhänge

  • Beispiel_CSV.csv
    1,6 KB · Aufrufe: 5
Hab mir mal deine CSV angeschaut (btw: Die ist ziemlicher Murks was den Aufbau betrifft, da du keine einzelnen Zeilen hast)
Du hast de facto 4 Trennzeichen, nach denen du das alles aufdröseln musst (und zwar in gezeigter Reihenfolge)
1) vbLF - LineFeed
2) | - Pipe-Symbol
3) $ - Symbol
4) : - Doppelpunkt

anbei mal ein kurzes Code-Beispiel:
Visual Basic:
Sub main()
Dim sTemp As String
Dim sContent As String
Dim i As Long
Dim arrSplitLF() As String
Dim arrSplit() As String
Dim arrSplitDollar() As String
Dim Datei As Integer
Dim MeinPfad As String

    Datei = FreeFile
    MeinPfad = "C:\MeinPfad\Ordner"
    Open MeinPfad & "\Beispiel_CSV.csv" For Input As #Datei
    sContent = Input(LOF(Datei), Datei) 'Lese Datei komplett ein
    Close #Datei

    arrSplitLF = Split(sContent, vbLf)  'Auftrennen nach vbLF

    For i = 0 To UBound(arrSplitLF)
        sTemp = arrSplitLF(i)    
        arrSplit = Split(sTemp, "|")       'Auftrennen nach |-Symbol
        If UBound(arrSplit) > 0 Then 'Pipe gefunden --> Kopf-/Adresssatz
            'Tu etwas mit Adress-Satz
        End If      

        arrSplit = Split(sTemp, "$")   'Auftrennen nach $-Symbol
        If UBound(arrSplit) > 0 Then '$ gefunden --> Detail-Satz
            arrSplitDollar = Split(arrSplit(2), ":")   'Auftrennen nach :-Symbol
            If UBound(arrSplitDollar) = 1 Then
                Debug.Print Trim$(arrSplitDollar(1)) 'Zeige Spielauftragsnummer
            End If
        End If
    Next
End Sub
 
Ich würde das mit RegExp lösen
Hier geht es zum Test für den RegExp-Pattern: https://regex101.com/r/flxvS2/1
Visual Basic:
Public Sub t407150()
    Const C_CSV_PATH = "C:\Users\C754943\Temp\Beispiel_CSV.csv"
    Dim csvText As String
    
    Dim fso As Object       'FileSystemObject
    Dim rx  As Object       'RegExp
    Dim mc  As Object       'MatchCollection
    Dim m   As Object       'Match
    
    'FileSstemObject anlegen
    Set fso = CreateObject("Scripting.FileSystemObject")
    'Datei vollständig auselsen
    csvText = fso.OpenTextFile(C_CSV_PATH).ReadAll
    
    'RegExp Obect anlegen und defineren
    Set rx = CreateObject("VBScript.RegExp")
    rx.pattern = "\bLosnummer:\s+(\d+)\b"
    rx.Global = True
    
    'Prüfen ob das CSV passt
    If rx.test(csvText) Then
        'Das CSV durch den RegExp parssen
        Set mc = rx.execute(csvText)
        'Die einzelnen Funde durchgehen
        For Each m In mc
            'Der erste SubMatch ist die Nummer
            Debug.Print m.subMatches(0)
        Next m
    End If
    
End Sub

PS: Und hier ein Pattern umd noch die IBAN, Superzahl und Spiel77 auszulesen
Code:
\bIBAN:\s+(\w+).+?\bLosnummer:\s+(\d+)\b.+?\bSuperzahl:\s+(\d)\b.+?\bSpiel77:\s+(Nein|Ja)\b
 
Yaslaw,

hab ich auch daran gedacht, aber wir wissen ja nicht, ob er zu den Spiellosen etc. auch den Namen des Spielers (und weitere Infos aus den Adress-Sätzen) braucht.
 
Noch eine Möglichkeit. Die Zeilen erinnern mich stark an JSON. Dazu hatte ich mal Funktionen geschrieben, die frei Verfügbar sind.
http://wiki.yaslaw.info/doku.php/vba/cast/json

Und so einfach wäre dann die Anwendung, ikl. Header-Daten
Visual Basic:
'Verwendet die JSON-Library: http://wiki.yaslaw.info/doku.php/vba/cast/json
Public Sub t407150()
    Const C_CSV_PATH = "C:\Users\C754943\Temp\Beispiel_CSV.csv"
    Dim line As String
    Dim json As String
    Dim hdrJson As String
    Dim lineNr As Long
    Dim hdrColums() As String
    Dim hdrValues() As String
    Dim hdrJsons()  As String
    Dim colNr As Long
    Dim record As Object    'Dictionary
    Dim fso As Object       'FileSystemObject
 
    'FileSstemObject anlegen
    Set fso = CreateObject("Scripting.FileSystemObject")
 
    With fso.OpenTextFile(C_CSV_PATH, ForReading)
        Do While Not .AtEndOfStream
            line = .ReadLine
            lineNr = lineNr + 1
         
            If lineNr = 1 Then
                'Header-Zeile
                hdrColums = Split(line, "|")
                ReDim hdrJsons(UBound(hdrColums))
            ElseIf line Like "^?*" Then
                'Info Zeile
                hdrValues = Split(Mid(line, 2), "|")
             
                'Header Spaltenüberschriften mit den Headerdaten kombinieren
                For colNr = LBound(hdrColums) To UBound(hdrColums)
                    If colNr <= UBound(hdrValues) Then
                        hdrJsons(colNr) = hdrColums(colNr) & ":" & hdrValues(colNr)
                    Else
                        hdrJsons(colNr) = hdrColums(colNr) & ":NULL"
                    End If
                Next colNr
                hdrJson = Join(hdrJsons, ",")
            ElseIf Not line = "|" And Not line = "^" Then
                'Spielzeiles
                'Aus der Zeile einen JSON-String machen. $ durch Komma ersetzen, das ganez in {} fassen
                json = "{" & hdrJson & "," & replace(line, "$", ",") & "}"
                'Json in ein Dictionary parsen
                Set record = json2obj(json)
                'Und die Werte der Felder gemütlich auslesen
                Debug.Print "Player_number:", record!Player_number
                Debug.Print "Losnummer:", record("Losnummer")
                Debug.Print "Spiel77:", record!Spiel77
            End If
        Loop
    End With
 
End Sub
Und das Resultat:
Code:
Player_number:               100026114
Losnummer:     2290227
Spiel77:      Nein
Player_number:               100026114
Losnummer:     2290228
Spiel77:      Nein
Player_number:               222222222
Losnummer:     2290229
Spiel77:      Nein
Player_number:               222222222
Losnummer:     2290226
Spiel77:      Nein

Und so das Objekt record. Die Einzelnen Propeties kann man dann pro Spiel gemütlich auslesen und auswerten
Code:
<Dictionary>  (
    [letter_type] => <String> 'DA1A'
    [date] => <Date> 23.08.2018
    [salutation] => <String> 'Herr'
    [Title] => <String> ' '
    [First_name] => <String> 'Max'
    [Last_name] => <String> 'Muster'
    [Street] => <String> 'Musterstr.'
    [House_number] => <Integer> 22
    [Post_code] => <Integer> 11111
    [Country_code] => <String> 'DEU'
    [City] => <String> 'Musterhausen'
    [Player_number] => <Long> 100026114
    [credit_account_no] => <String> ' '
    [credit_bank_code] => <String> ' '
    [debit_account_no] => <String> ' '
    [debit_bank_code] => <String> ' '
    [Wager_amount] => <String> '55,00'
    [steuer_nr_1] => <String> ' '
    [steuer_nr_2] => <String> ' '
    [credit_BIC] => <String> 'eineBic'
    [credit_IBAN] => <String> 'DE99999999999999999999'
    [debit_BIC] => <String> 'eineBic'
    [debit_IBAN] => <String> 'DE99999999999999999999'
    [Mandatsreferenz] => <String> 'REF06jddm4urgqki-02'
    [Einzugstermine] => <String> ' '
    [SubscriptionDetails] => <Null>
    [IBAN] => <String> 'DE99999999999999999999'
    [BIC] => <String> 'eineBic'
    [Spielauftrag] => <Double> 3000030190
    [Veranstaltung] => <String> 'Samstag'
    [Spielart] => <String> 'GlücksSpirale,1.'
    [Teilnahme] => <Date> 06.01.2018
    [Letzte Teilnahme] => <Date> 29.12.2018
    [Losnummer] => <Long> 2290227
    [Superzahl] => <Integer> 7
    [Spiel77] => <String> 'Nein'
    [SUPER6] => <String> 'Nein'
    [Anteilssystem] => <String> '1/5,%'
)

PS: Die passende JSON-Zeile
JSON:
{letter_type:DA1A,date:23.08.2018,salutation:Herr,Title:,First_name:Max,Last_name:Muster,Street:Musterstr.,House_number:22,Post_code:11111,Country_code:DEU,City:Musterhausen,Player_number:100026114,credit_account_no:,credit_bank_code:,debit_account_no:,debit_bank_code:,Wager_amount:55,00,steuer_nr_1:,steuer_nr_2:,credit_BIC:eineBic,credit_IBAN:DE99999999999999999999,debit_BIC:eineBic,debit_IBAN:DE99999999999999999999,Mandatsreferenz:REF06jddm4urgqki-02,Einzugstermine:,SubscriptionDetails:NULL,IBAN: DE99999999999999999999,BIC: eineBic,Spielauftrag:   3000030190,Veranstaltung:   Samstag,Spielart:   GlücksSpirale,1.Teilnahme: 06.01.2018,Letzte Teilnahme:    29.12.2018,Losnummer:   2290227,Superzahl:  7,Spiel77:  Nein,SUPER6:    Nein,Anteilssystem: 1/5,%}
 
Zurück