Home > Artikel > Ausgabe 1/2017 > Platzhalter in Textdateien füllen

Platzhalter in Textdateien füllen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Texte mit Platzhaltern zu füllen und die Platzhalter dann durch in der Datenbank gespeicherte Daten zu ersetzen ist ein oft benötigter Anwendungsfall. Im Prinzip bildet Word das mit der Seriendokument-Funktion ab: Hier werden im Dokument Verknüpfungen zur Datenquelle hergestellt und dann gefüllt. Wir wollen es eine Nummer kleiner angehen und einfache Text mit entsprechenden formatierten Platzhaltern wie [Vorname] versehen und diese dann nach Bedarf mit den Daten aus der Datenbank füllen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1701_PlatzhalterInTextenFuellen.accdb.

Textdatei mit Platzhaltern erstellen

Der erste Schritt besteht daraus, eine geeignete Textdatei zu erstellen, die wir mit Platzhaltern versehen. Hier kommt bereits die erste Hürde: Wie sollen die Platzhalter aussehen, damit wir diese später auch zuverlässig finden können? Die erste Voraussetzung ist, dass die Namen der Platzhalter mit den Datenfeldern korrelieren. Wenn wir aus einer Tabelle Felder namens Vorname, Nachname und Strasse in die Textdateien füllen wollen, sollten die Platzhalter auch entsprechend benannt werden. Das hat allein praktische Gründe: Wir können so später einfach die Felder der Datenherkunft in einer Schleife durchlaufen und die Werte direkt in die Platzhalter einsetzen.

Die zweite Voraussetzung ist, dass die Platzhalter vom übrigen Text unterschieden werden können. Wenn Sie beispielsweise nur den Namen des betroffenen Feldes als Platzhalter verwenden, ist die Wahrscheinlichkeit gegeben, dass dieser Name auch im eigentlichen Text zum Einsatz kommt.

Also müssen wir die Platzhalter noch mit einer Start- und einer Endmarkierung versehen, die in dieser Art sonst nicht im Text vorkommt. Dazu eignen sich beispielsweise eckige Klammern. [Vorname] wäre also ein geeigneter Platzhalter. Auf Nummer Sicher gehen Sie, wenn Sie die Start- und die Endmarkierung noch ein wenig eindeutiger gestalten, beispielsweise mit @[Vorname@]. Auf diese Weise sollte nichts anbrennen.

Die Vorlage sieht dann beispielsweise wie in Bild 1 aus. Sie enthält einige Platzhalter, die mit @[ beginnen und mit ]@ enden. Nun benötigen wir eine Tabelle beziehungsweise Abfrage, welche die angegebenen Platzhalterbezeichnungen innerhalb der Begrenzungszeichen aufweist. Dazu legen wir eine Tabelle namens tblKunden an, deren Entwurf Sie in Bild 2 finden. Das Feld AnredeID ist ein Fremdschlüsselfeld, das noch mit der Tabelle tblAnreden verknüpft ist.

Entwurf der Tabelle tblKunden

Bild 1: Entwurf der Tabelle tblKunden

Beispielvorlage als Textdatei

Bild 2: Beispielvorlage als Textdatei

tblAnreden enthält die Felder ID (Primärschlüsselfeld) und Bezeichnung sowie zwei Felder mit speziellen Formen der Anrede: AnredeAdresse nimmt die Form der Anrede für den Adressblock auf (Herrn/Frau), AnredeBrief die Anrede für die erste Zeile des Brieftextes (Sehr geehrter Herr/Sehr geehrte Frau) – siehe Bild 3.

Die Tabelle tblAnreden mit einigen Werten

Bild 3: Die Tabelle tblAnreden mit einigen Werten

Abfrage als Quelle für die Platzhalter

Nun benötigen wir noch eine Abfrage, welche die Daten der beiden Tabellen so zusammenführt, dass wir diese in der anschließend zu erstellenden VBA-Prozedur zum Ersetzen der Platzhalter nutzen können. Diese Abfrage soll die beiden Tabellen tblKunden und tblAnreden als Datenherkunft nutzen und alle Felder dieser beiden Tabellen mit Ausnahme des Feldes AnredeID der Tabelle tblKunden und des Feldes ID der Tabelle tblAnreden enthalten. Der Entwurf dieser Abfrage, die wir unter dem Namen qryKundenMitAnrede speichern, sieht wie in Bild 4 aus.

Entwurf der Abfrage qryKundenMitAnrede

Bild 4: Entwurf der Abfrage qryKundenMitAnrede

Das Ergebnis der Abfrage aus Bild 5 liefert alle Daten der Tabelle tblKunden plus die dazugehörigen Anreden aus der Tabelle tblAnreden.

Die Abfrage qryKundenMitAnrede in der Datenblattansicht

Bild 5: Die Abfrage qryKundenMitAnrede in der Datenblattansicht

Formular zum Füllen der Platzhalter in der Textdatei

Die Funktionen zum Auswählen der Vorlage mit den Platzhaltern, zum Auswählen der Zieldatei und zum Festlegen des Kunden, für den die Vorlage gefüllt werden soll, wollen wir in eine Benutzeroberfläche integrieren – sprich: in ein Formular. Dieses sieht in der Entwurfsansicht wie in Bild 6 aus. Es enthält im oberen Bereich zwei Textfelder namens txtVorlage und txtZiel. In beiden soll der Benutzer die Namen der Dateien eintragen, die verwendet werden sollen. Beide Dateien sollen der Einfachheit halber im Verzeichnis der aktuellen Datenbankdatei liegen.

Das Formular frmPlatzhalterErsetzen in der Entwurfsansicht

Bild 6: Das Formular frmPlatzhalterErsetzen in der Entwurfsansicht

Vorlagendatei öffnen

Die Schaltfläche rechts vom Textfeld für die Vorlagendatei soll die angegebene Datei zum Betrachten und Bearbeiten öffnen. Dazu löst diese die Prozedur cmdVorlageOeffnen aus (siehe Listing 1). Diese fügt den mit CurrentProject.Path ermittelten Datenbankpfad und die im Textfeld txtVorlage angegebene Datei in einer Variablen namens strVorlage zusammen und prüft mithilfe der Dir-Funktion, ob die Datei überhaupt vorhanden ist. Diese Funktion würde in diesem Fall den reinen Dateinamen zurückliefern. Hat Dir(strVorlage) also eine Länge größer 0, dann ist die Datei vorhanden.

Private Sub cmdVorlageOeffnen_Click()

     Dim strVorlage As String

     strVorlage = CurrentProject.Path & "\" & Me!txtVorlage

     If Len(Dir(strVorlage)) > 0 Then

         DateiOeffnen strVorlage

     Else

         MsgBox "Die Datei '" & Me!txtVorlage & "' ist nicht im aktuellen Ordner der Datenbank vorhanden."

     End If

End Sub

Listing 1: Anzeige der Vorlagendatei im Text-Editor

In diesem Fall ruft die Prozedur eine weitere Routine namens DateiOeffnen auf, die im Modul mdlTools angelegt ist. Diese verwendet eine API-Funktion namens ShellExecute, um die mit dem Parameter strPfad übergebene Datei zu öffnen (siehe Listing 2).

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nshowcmd As Long) As Long

Public Const SW_NORMAL = 1

Public Function DateiOeffnen(strPfad As String) As Boolean

     Call ShellExecute(0, "open", strPfad, "", "", SW_NORMAL)

End Function

Listing 2: Diese Prozedur öffnet ein neues Formular oder zeigt dieses an, wenn es bereits geöffnet ist.

Auswahl des Kunden, mit dem die Platzhalter gefüllt werden sollen

Das Listenfeld lstKunden dient der Anzeige aller Kunden der Abfrage qryKundenMitAnrede und der Auswahl des Kunden, für den die Platzhalter in der Vorlage ersetzt werden sollen. Dazu stellen Sie die Eigenschaft Datensatzherkunft auf den Namen der Abfrage qryKundenMitAnrede ein. Damit das Primärschlüsselfeld der Abfrage nicht angezeigt wird, sondern nur die ersten beiden Felder Vorname und Nachname, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 3 und die Eigenschaft Spaltenbreiten auf den Wert 0cm;4cm;4cm ein.

Das gefüllte Listenfeld sieht wie in Bild 7 aus.

Das Formular frmPlatzhalterErsetzen in Aktion

Bild 7: Das Formular frmPlatzhalterErsetzen in Aktion

Voreinstellungen

Damit das Formular beim Erstellen und Ausprobieren immer gleich ein paar sinnvolle Dateinamen anzeigt und einen Eintrag der Kundenliste auswählt, hinterlegen Sie für die Ereigniseigenschaft Beim Laden, dem Sie den Wert [Ereignisprozedur] zuweisen, die folgende Prozedur:

Private Sub Form_Load()

Me!txtVorlage = "Vorlage.txt"

Me!txtZiel = "Ziel.txt"

Me!lstKunden = Me!lstKunden.ItemData(0)

End Sub

Danach können Sie gleich loslegen – mit einem Klick auf die Schaltfläche cmdErstellen.

Textdatei-Platzhalter füllen

Die Prozedur, die durch den Mausklick auf die Schaltfläche cmdErstellen ausgelöst wird, finden Sie in Listing 3. Die Prozedur ermittelt zunächst den Primärschlüsselwert für den aktuell in der Liste markierten Kunden und speichert diesen in der Variablen lngKundeID.

Private Sub cmdErstellen_Click()

     Dim lngKundeID As Long

     Dim strText As String

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Dim strZieldatei As String

     Dim strVorlage As String

     lngKundeID = Me!lstKunden

     Set db = CurrentDb

     Set rst = db.OpenRecordset("SELECT * FROM qryKundenMitAnrede WHERE ID = " & lngKundeID, dbOpenDynaset)

     If Not rst.EOF Then

         strVorlage = CurrentProject.Path & "\" & Me!txtVorlage

         strText = TextdateiEinlesen(strVorlage)

         If PlatzhalterPruefen(strText, rst) = True Then

             strText = PlatzhalterErsetzen(strText, rst)

             strZieldatei = CurrentProject.Path & "\" & Me!txtZiel

             TextdateiSchreiben strZieldatei, strText

             DateiOeffnen strZieldatei

         Else

             DateiOeffnen strVorlage

         End If

     End If

     rst.Close

     Set rst = Nothing

     Set db = Nothing

End Sub

Listing 3: Hauptprozedur zum Ersetzen der Platzhalter in einer Textdatei

Dann initialisiert sie die Variable db mit einem Verweis auf das aktuelle Database-Objekt und füllt die Variable rst mit einem Recordset auf Basis der Abfrage qryKundenMitAbfrage, wobei diese nach dem Wert der Variablen lngKundeID für das Feld KundeID gefiltert wird. Sofern das Recordset danach einen Datensatz enthält, folgen die Schritte innerhalb der If...Then-Bedingung der Prozedur.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!