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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2011.

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

Erfahren Sie, wie Sie auf einfachste Weise Daten aus unstrukturierten Texten in die Felder Ihrer Tabellen kopieren können.

Techniken

Formulare, VBA, Klassen

Voraussetzungen

Access 2000 und höher

Beispieldateien

UnstrukturierteDaten.mdb

Shortlink

www.access-im-unternehmen.de/757

Daten aus unstrukturierten Texten übernehmen

André Minhorst, Duisburg

Auch wenn Sie noch so gut mit VBA umgehen und reguläre Ausdrücke aus dem Effeff beherrschen: Wenn Sie Daten aus einem unstrukturierten Text in die Felder einer Tabelle übernehmen möchten, kommen Sie um ein wenig Handarbeit nicht herum. Vielleicht lassen sich aber mit einer kleinen Lösung noch ein paar Kopieren-und-Einfügen-Aktionen sparen? Schauen wir uns das einmal am Beispiel einer E-Mail mit einer Kontaktanfrage an.

Beispielhaft

Für die in diesem Beitrag vorgestellte Technik gibt es verschiedene Anlässe. Diesen ist gemein, dass ein Formular ein Textfeld mit einem Text enthält, aus dem eine oder mehrere Informationen in gebundenen Feldern landen sollen. Abb. 1 zeigt, wie das aussehen soll: Dort finden Sie auf der linken Seite einen unstrukturierten Text (in diesem Fall eine Adresse) und auf der rechten Seite eine Reihe Textfelder, welche die Bestandteile des Texts links aufnehmen sollen. Hier funktioniert das ganz einfach: Sie setzen den Fokus auf das Zielfeld rechts und markieren dann den Text links, der in diesem Textfeld landen soll, mit der Maus. Beim Loslassen der Maustaste wird der Text in das Textfeld kopiert.

pic001.png

Abb. 1: Einfachstes Kopieren markierter Texte in ausgewählte Textfelder

Wie funktioniert das? Eigentlich ganz einfach: Wir benötigen zunächst eine Variable des Datentyps Control, die sich das zuletzt auf der rechten Seite angeklickte und somit aktive Zielsteuerelement merken soll:

Dim ctlZiel As Control

Die Textfelder auf der rechten Seite versehen Sie dann jeweils mit einer Ereignisprozedur, die durch das Ereignis Bei Fokuserhalt ausgelöst wird und wie folgt aussieht:

Private Sub txtZielfeld1_GotFocus()

    Set ctlZiel = txtZielfeld1

End Sub

Die einzige Anweisung dieser Prozedur füllt die Variable ctlZiel mit einem Verweis auf das soeben aktivierte Steuerelement. Eine solche Prozedur legen Sie für jedes betroffene Textfeld an. Dies ist Voraussetzung für die Prozedur, die durch das Ereignis Maustaste auf des Textfelds links ausgelöst wird. Diese prüft schlicht, ob im Textfeld links ein Text markiert ist, und schreibt diesen dann in das zuletzt auf der rechten Seite markierte Textfeld. Anschließend setzt es noch den Fokus auf dieses Textfeld:

Private Sub txtUnstrukturiert_MouseUp(Button As Integer, Shift As Integer, _

        X As Single, Y As Single)

    If Me!txtUnstrukturiert.SelLength > 0 Then

        ctlZiel = Me!txtUnstrukturiert.SelText

        ctlZiel.SetFocus

    End If

End Sub

Das Setzen des Fokus ist wichtig für das schnelle Einfügen der Elemente aus dem linken Textfeld in die Zieltextfelder. Der geplante Ablauf sieht vor, dass Sie zunächst das obere Zielfeld markieren dann links mit der Maus den Text auswählen, der in diesem Textfeld landen soll.

Dadurch, dass das Zieltextfeld danach den Fokus erhält, können Sie mit der Tabulator-Taste gleich zum nächsten Textfeld springen. Der Mauszeiger kann dann gleich auf dem unstrukturierten Text links verharren und braucht nicht zwischen den Textfeldern hin- und herbewegt zu werden.

Um etwa Name, Straße, Ort und Land von links in die vier Felder rechts zu kopieren, brauchen Sie genau vier Markierungsgesten mit der Maus und drei Betätigungen der Tabulator-Taste - einfacher geht es nicht, wenn der Text kein vollautomatisches Auslesen erlaubt.

Technik schnell integriert

Wie so oft in der letzten Zeit haben wir wieder eine beziehungsweise mehrere Klassen programmiert, welche die für ein einzelnes Formular entwickelte Technik flexibel einsetzbar machen.

Wenn Sie die Lösung gleich einsetzen möchten, führen Sie die folgenden Schritte durch:

  • Importieren Sie die beiden Klassen clsCopyText und clsCopyTextControl in die Zieldatenbank.
  • Wählen Sie das Zielformular aus. Dieses muss sowohl das Quelltextfeld enthalten als auch die Zieltextfelder.
  • Fügen Sie der Ereigniseigenschaft Beim Laden des Formulars den Wert [Ereignisprozedur] hinzu und klicken Sie auf die Schaltfläche rechts neben der Eigenschaft.
  • Es erscheint der Prozedurrumpf der Prozedur Form_Load. Unabhängig davon, ob diese in Ihrem Formular bereits enthalten ist und gegebenenfalls bereits Code enthält, fügen Sie die folgenden Zeilen hinzu:

Set objCopyText = New clsCopyText

With objCopyText

    Set .SourceTextBox = Me!txtUnstrukturiert

End With

Statt Me!txtUnstrukturiert geben Sie einfach den Namen des Quelltextfelds auf Ihrem Formular an. Fertig! Beim nächsten Anzeigen des Formulars in der Formularansicht sorgt die Lösung gleich dafür, dass das erste Zieltextfeld grau hinterlegt wird.

Außerdem fügt sie allen beteiligten Textfeldern die bereits oben beschriebene Funktion hinzu. Sprich: Das aktuell selektierte Textfeld dient als Ziel, wenn der Benutzer einen Text im als SourceTextBox angegebenen Textfeld markiert.

Funktion der Klassen

Die Lösung verwendet zwei Klassen, um das Formular und die enthaltenen Textfelder mit den benötigten Automatismen zu versehen.

Die erste Klasse heißt clsCopyText (s. Listing 1) und besitzt zwei öffentliche Eigenschaften. Die zweite ist nur für die Konfiguration von der Ereignisprozedur Beim Laden des Formulars wichtig. Sie heißt SourceTextBox und erwartet einen Verweis auf das Textfeld, das als Quelle für die Kopiervorgänge dienen soll.

Listing 1: Die Steuerklasse clsCopyText zum Hinzufügen der Kopierfunktion

Dim colTextboxes As Collection

Dim m_Active As Control

Dim WithEvents m_Source As TextBox

Public Property Set ActiveControl(ctl As Control)

    Set m_Active = ctl

End Property

Public Property Get ActiveControl() As Control

    Set ActiveControl = m_Active

End Property

Public Property Set SourceTextBox(txt As TextBox)

    Dim frm As Form

    Dim ctl As Control

    Dim objCopyTextControl As clsCopyTextControl

    Set m_Source = txt

    Set colTextboxes = New Collection

    m_Source.OnMouseUp = "[Event Procedure]"

    Set frm = m_Source.Parent

    For Each ctl In frm.Controls

        If ctl.ControlType = acTextBox And ctl.Name <> m_Source.Name Then

            Set objCopyTextControl = New clsCopyTextControl

            With objCopyTextControl

                Set .CopyText = Me

                Set .TargetTextBox = ctl

            End With

            colTextboxes.Add objCopyTextControl

        End If

    Next ctl

End Property

Private Sub m_Source_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If m_Source.SelLength > 0 Then

        m_Active = m_Source.SelText

        m_Active.SetFocus

    End If

End Sub

Wenn das Formular geöffnet und die Prozedur Form_Load ausgeführt wird, instanziert diese die Klassel clsCopyText und weist ihrer Eigenschaft SourceTextBox beispielsweise den Wert Me!Quelltextbox zu. Dadurch wird die Property Set-Prozedur SourceTextBox ausgelöst. Die Klasse clsCopyText erfährt somit schon einmal, welches Textfeld als Quelle für die Kopiervorgänge dienen soll. Der Verweis auf dieses Textfeld wird gleich zu Beginn in der lokalen Variablen m_Source gespeichert. Diese Variable ist mit dem Schlüsselwort WithEvents deklariert, das bedeutet, dass Sie in der gleichen Klasse Ereignisprozeduren für das enthaltene Steuerelement hinterlegen können.

Dies erledigt die Property Set-Prozedur auch gleich, indem sie die Eigenschaft OnMouseUp mit dem Wert [Event Procedure] füllt. Außerdem findet sich in der gleichen Klasse die Prozedur, die Sie schon vom einführenden Beispiel her kennen: Diese prüft, ob das Quelltextfeld einen markierten Text enthält, und weist diesen dem gerade aktiven Zieltextfeld zu. Dieses wird in dieser Prozedur allerdings über eine Variable namens m_Active referenziert - dazu gleich mehr.

Die Funktion des Quelltextfeldes wäre somit bereits erledigt - es reagiert auf das MouseUp-Ereignis und kopiert den gewünschten Text. Nun sorgt die Property Set-Prozedur noch dafür, dass alle potenziellen Zieltextfelder ebenfalls mit einer Funktion ausgestattet werden. Diese soll dafür sorgen, dass der Klasse clsCopyText jederzeit das aktive Textfeld bekannt ist, das der Benutzer beispielsweise mit der Tabulator-Taste oder mit der Maus aktivieren kann.

Dazu statten wir alle weiteren im Formular enthaltenen Textfelder ebenfalls mit einer Ereignisprozedur für das Ereignis Bei Fokuserhalt aus. Dazu brauchen wir allerdings für jedes Textfeld eine eigene Klasse, die das Textfeld mit einer Variablen referenziert, die ihrerseits als WithEvents deklariert ist und das Ereignis GotFocus auslöst. Diese Klasse finden Sie in Listing 2.

Listing 2: Die Klasse clsCopyTextControl repräsentiert jeweils eines der Zieltextfelder.

Dim WithEvents m_Textbox As TextBox

Dim m_CopyText As clsCopyText

Public Property Set TargetTextBox(txt As TextBox)

    Set m_Textbox = txt

    With m_Textbox

        .OnGotFocus = "[Event Procedure]"

    End With

    If m_CopyText.ActiveControl Is Nothing Then

        Set m_CopyText.ActiveControl = m_Textbox

        m_Textbox.BackColor = &HEEEEEE

    End If

End Property

Public Property Set CopyText(ct As clsCopyText)

    Set m_CopyText = ct

End Property

Private Sub m_Textbox_GotFocus()

    m_CopyText.ActiveControl.BackColor = &HFFFFFF

    Set m_CopyText.ActiveControl = m_Textbox

    m_Textbox.BackColor = &HEEEEEE

End Sub

Um die Textfelder mit dieser Ereignisprozedur auszustatten, durchläuft die Prozedur SourceTextBox der Klasse clsCopyText alle Textfelder des Formulars. Dabei erstellt sie für jedes Textfeld eine neue Instanz der Klasse clsCopyTextControl und weist der Eigenschaft CopyText einen Verweis auf sich selbst und der Eigenschaft TargetTextBox einen Verweis auf das aktuell durchlaufene Textfeld zu. Damit diese Instanzen verfügbar bleiben, werden sie in einer Collection-Variablen gespeichert.

Was macht die Klasse clsCopyTextControl nun mit diesen Informationen?

Der Verweis auf das Textfeld ist leicht zu erklären: Natürlich legt die Klasse für dieses Textfeld eine Ereignisprozedur namens GotFocus an, die beim Fokuserhalt des Textfelds reagiert und dieses als aktives Zieltextfeld festlegt. Aber wo wird dieses festgelegt? Natürlich in der Hauptklasse clsCopyText. Dazu übergibt diese auch einen Verweis auf sich selbst an jede Instanz der Textfeld-Klasse, damit diese auf die öffentliche Eigenschaft ActiveControl zugreifen und diese mit einem Verweis auf das soeben selektierte Textfeld füllen kann. Die Hauptklasse kann dann genau dieses Textfeld mit dem im Quelltextfeld ausgewählten Text füllen.

Aber die Klasse clsCopyTextControl erledigt noch mehr: Sie stellt das aktive Textfeld gleich beim ersten Aufruf ein und sorgt außerdem dafür, dass dieses jeweils grau hinterlegt und das zuvor markierte Textfeld wieder weiß eingefärbt wird (falls die Farbe bei Ihnen abweicht, müssen Sie dies im Code entsprechend berücksichtigen).

Zusammenfassung und Ausblick

Fallen bei Ihnen oder bei den Benutzern Ihrer Datenbanken regelmäßig Aufgaben an, bei denen unstrukturierte Daten in Tabellenfelder überführt werden sollen, deren Import sich nicht automatisieren lässt, finden Sie hier einen interessanten Ansatz. Sie können diese Lösung natürlich an eigene Bedürfnisse anpassen - beispielsweise, wenn Sie auch Kombinationsfelder mit den kopierten Texten füllen möchten.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Download

Download

Die .zip-Datei enthält folgende Dateien:

UnstrukturierteDaten.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.