Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2008.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Teilen Sie importierte Zeichenketten bequem per Formular in zwei Teile auf.

Techniken

Formulare, VBA

Voraussetzungen

Access 2000 oder höher

Beispieldateien

Bücherverwaltung.mdb

Shortlink

628

Texte aufteilen

André Minhorst, Duisburg

Manchmal kann man sich mit kleinen Tools das Leben erheblich erleichtern. In diesem Beispiel geht es um die Vereinfachung der Bearbeitung importierter Daten. Dabei liefert die Quelle eine Zeichenkette in einem Feld, die eigentlich auf zwei Felder aufgeteilt sein sollte - allerdings ohne die Möglichkeit, dies komplett zu automatisieren. Sei es drum: Eine kleine Arbeitserleichterung ist besser als keine.

Beispiel

Als Anregung für den Bau der hier beschriebenen Hilfe dient die Bücherverwaltung aus dem gleichnamigen Beitrag (Shortlink 633). Die dort beschriebene Anwendung liest unter anderem Buchdaten vom Webservice von Amazon ein. Dieser hat die unangenehme Eigenart, Buchtitel und Untertitel in einem zu liefern. Die beiden Eigenschaften liefert Amazon zwar durch einen Doppelpunkt getrennt, da viele Bücher aber bereits einen Doppelpunkt im Titel und/oder Untertitel tragen, wäre eine automatische Aufteilung von Titel und Untertitel nicht besonders zuverlässig.

Lösung

Wie also kann man dies vereinfachen? Normalerweise würde man wohl die komplette Zeichenkette, also Titel und Untertitel, in eines der Zieltextfelder, vorzugsweise in den Titel kopieren und die Zeichenkette dann manuell auf Titel und Untertitel aufteilen. Dazu markiert man dann den Untertitel innerhalb der Zeichenkette, schneidet diesen entweder per Tastenkombination Strg + X oder über den entsprechenden Kontextmenüeintrag aus und fügt ihn mit Strg + V in das Untertitel-Feld ein.

Im Beispiel sieht das wie in Abb. 1 aus. Der Text im Feld Titel enthält nicht nur den Titel, sondern auch noch den Untertitel. Das Formular enthält direkt eine Schaltfläche, die das Formular zum Aufteilen des Titels auf Titel und Untertitel öffnet. Dieses sieht wie in Abb. 2 aus.

pic001.tif

Abb. 1: Buchdetails mit einem Titeltext, der noch auf Titel und Untertitel aufgeteilt werden muss

pic002.tif

Abb. 2: Dieses Formular teilt Texte einfach auf.

Das Formular zeigt direkt den kompletten im Feld Titel enthaltenen Text an. Platziert der Benutzer die Einfügemarke irgendwo im Text, erscheint der Teil vor der Einfügemarke im ersten, der Teil hinter der Einfügemarke im zweiten Ergebnisfeld.

Falls sich zwischen den beiden Teilen Zeichen befinden, die weder dem ersten noch dem zweiten Teiltext zugeordnet werden sollen, markiert man diesen Teil einfach. Dann zeigt das erste Ergebnisfeld den Teil vor Beginn der Markierung an und das zweite den Teil hinter der Markierung. Ein Klick auf OK genügt, um das Formular zu schließen und den aufgeteilten Text zurückzuschicken.

Lösung verwenden

Der Einsatz der Lösung erfordert nur ein paar Zeilen Code, die einen Funktionsaufruf beinhalten und diesem den Originaltext übergeben sowie zwei leere Variablen, die mit den beiden Textfragmenten gefüllt werden sollen (s. Listing 1).

Außerdem müssen Sie der Zieldatenbank das Modul mdlTextAufteilen und das Formular frmTextAufteilen hinzufügen.

Der Aufruf liefert den Wert True zurück, wenn der Benutzer den Text aufgeteilt und im Formular auf die OK-Schaltfläche geklickt hat.

Wenn Sie das Beispiel aus Listing 1 in eigene Lösungen einbauen, brauchen Sie statt des Texts nur eine String-Variable mit dem Originaltext zu übergeben und die zurückgelieferten Textfragmente in die Zieltextfelder zu schreiben.

Listing 1: Beispielaufruf des Formulars zum vereinfachten Aufteilen von Texten

Public Sub Test()

Dim str1 As String

Dim str2 As String

If TextAufteilen("Dies ist ein Titel. Und sein Untertitel.”, str1, str2) = True Then

    Debug.Print "Teil 1: " & str1

    Debug.Print "Teil 2: " & str2

End If

End Sub

Wie funktioniert das?

Das Formular frmTextAufteilen (s. Abb. 3) soll den Eingangstext verarbeiten und zwei einzelne Texte zurückliefern. Das verlangt nach der üblichen Technik für solche Fälle, wo man das Formular als modalen Dialog öffnet und diesem per OpenArgs den Parameter übergibt. Der aufrufende Code, der ja im weiteren Verlauf die durch den Benutzer im Formular gemachten Angaben noch auslesen soll, wird so erst nach dem Fokusverlust des Formulars fortgesetzt. Dieser erfolgt entweder durch das Schließen des Formulars per Klick auf die Abbrechen-Schaltfläche oder durch einen Klick auf die OK-Schaltfläche. Nach letzterem ist das Formular zwar noch geöffnet, aber nicht mehr sichtbar, wodurch die aufrufende Routine das Formular noch auslesen kann und so die beiden Teilzeichenketten erhält.Damit Sie das Formular so einfach wie mit Listing 1 aufrufen können und sich nicht mit dem eigentlichen Öffnen des Formulars und der Auswertung der in den Steuerelementen befindlichen Informationen beschäftigen müssen, gibt es die von Listing 1 aufgerufene Funktion TextAufteilen (s. Listing 2).

Listing 2: Diese Routine teilt den Text in zwei Teile auf.

Public Function TextAufteilen(strOriginal As String, str1 As String, str2 As String) As Boolean

    DoCmd.OpenForm "frmTextAufteilen", WindowMode:=acDialog, OpenArgs:=strOriginal

    If IstFormularGeoeffnet("frmTextAufteilen") Then

        str1 = Forms!frmTextAufteilen!txt1

        str2 = Forms!frmTextAufteilen!txt2

        DoCmd.Close acForm, "frmTextAufteilen"

        TextAufteilen = True

    End If

End Function

pic003.tif

Abb. 3: Das Formular frmTextAufteilen in der Entwurfsansicht

Fehlt noch die Funktionalität im Formular. Dieses soll zunächst den übergebenen Text im Textfeld txtOriginal anzeigen, wofür die Ereignisprozedur sorgt, die das Formular beim Öffnen auslöst:

Private Sub Form_Open(Cancel As Integer)

    Me.txtOriginal = Me.OpenArgs

    End Sub

Dann muss das Formular auf alle Benutzereingaben reagieren, welche die Position der Einfügemarke im Textfeld txtOriginal verändern könnten:

  • Eingabe herkömmlicher Zeichen, etwa um den Text zu ergänzen oder Teile zu entfernen
  • Bewegen der Einfügemarke mit den Cursortasten
  • Positionieren der Einfügemarke durch Klicken mit der Maus auf die entsprechende Stelle

Diese drei Varianten werden durch die folgenden Ereigniseigenschaften abgefangen:

Private Sub txtOriginal_Change()

    TextTeilen

    End Sub

Private Sub txtOriginal_KeyUp(KeyCode As _

    Integer, Shift As Integer)

    TextTeilen

    End Sub

Private Sub txtOriginal_MouseUp(Button As _

    Integer, Shift As Integer, X As Single, _

    Y As Single)

    TextTeilen

    End Sub

Alle drei rufen die gleiche Routine namens TextTeilen auf, die wie folgt aussieht und dem Textfeld txt1 den Teil vor Beginn der Markierung und txt2 den Teil hinter der Markierung hinzufügt:

Private Sub TextTeilen()

    Me.txt1 = Left(Me.txtOriginal.Text, _

    Me.txtOriginal.SelStart)

    Me.txt2 = Mid(Me.txtOriginal.Text, _

    Me.txtOriginal.SelStart + _

    Me.txtOriginal.SelLength + 1)

    End Sub

Schließlich fehlen noch die beiden Routinen, die durch die Schaltflächen OK und Abbrechen ausgelöst werden:

Private Sub cmdCancel_Click()

    DoCmd.Close acForm, Me.Name

    End Sub

Private Sub cmdOK_Click()

    Me.Visible = False

    End Sub

Download

Download

Die .zip-Datei enthält folgende Dateien:

Buecherverwaltung.mdb

Beispieldateien downloaden

Verwandte Beiträge:

Zeichenketten zerlegen

Flexible Datumstextfelder

Platzbedarf für Text ermitteln

Platzhalterauswahl per Kontextmenü

Importieren von Textdateien

© 2003-2018 André Minhorst Alle Rechte vorbehalten.