Feldkopierer für Formulare
Veröffentlicht am 06.04.2004
Mit Hilfe eines speziellen Zwischenablage-Assistenten können Sie sowohl einzelne Felder als auch die Reihenfolge der Felder auswählen, die in die Zwischenablage kopiert werden sollen.
Wenn Sie schon einmal eine Adresse in die Zwischenablage befördert und von hier aus in ein Textdokument eingefügt haben, dürften Sie sich wahrscheinlich auch schon einmal über die schlechte Funktionalität des Menüpunkts Bearbeiten/Kopieren geärgert haben. Es ist nämlich nur möglich, entweder einen einzelnen Feldinhalt oder gleich einen kompletten Datensatz (mit allen für die Adresse überflüssigen Feldern) in die Zwischenablage zu kopieren.
Für den Assistenten benötigen Sie zunächst einmal ein neues leeres Formular mit dem Namen Zwischenablage-Assistent. Platzieren Sie auf der linken Seite ein Listenfeld namens lstFeldliste und rechts daneben ein etwa gleich großes Textfeld mit dem Namen txtText. Unterhalb beider Steuerelemente ordnen Sie dann noch zwei Schaltflächen mit den Namen btnOK und btnAbbrechen an.
Um dem Formular ein für Dialogfenster typisches Aussehen zu verleihen, stellen Sie folgende Formulareigenschaften entsprechend ein:
Eigenschaft | Einstellungen |
Standard-Ansicht | Einzelnes Formular |
Bildlaufleisten | Nein |
Datensatzmarkierer | Nein |
Navigationsschaltflächen | Nein |
Rahmenart | Dialog |
Beschriftung | Zwischenablage-Assistent |
Die linke Liste des Formulars soll die Namen aller Felder eines bestimmten Formulars auflisten. Stellen Sie zu diesem Zweck die HerkunftsTyp-Eigenschaften des Steuerelements lstFeldliste auf Feldliste ein. Auf welches Formular der Assistent beim Füllen der Liste zurückgreift, wird mittels einer VBA-Ereignisprozedur festgelegt, die Sie für die BeimÖffnen-Ereigniseigenschaft anlegen. Die Prozedur enthält lediglich die folgende Anweisung:
Me!lstFeldliste.RowSource = Forms(OpenArgs).RecordSource
Bei Start des Assistenten wird der Name des betreffenden Formulars als Öffnungsargument OpenArgs übergeben. Die obige Anweisung liest nun die Datenquelle des Formulars aus und weist sie der RowSource-Eigenschaft des Listenfeldes zu. Da die HerkunftsTyp-Eigenschaft auf Feldliste eingestellt ist, werden hier keine Datensätze, sondern lediglich die Feldnamen der Datenquelle aufgelistet.
Um den Benutzer des Assistenten die Möglichkeit zu geben, bestimmte Feldinhalte auzuwählen, soll er mit einem Doppelklick auf einen Feldnamen den aktuellen Feldinhalt in das rechte Textfeld befördern. Dies erledigt eine zweite Ereignisprozedur, die mit der BeimDoppelklicken-Eigenschaft der Feldliste verknüpft ist:
Private Sub lstFeldliste_DblClick(Cancel As Integer)
Dim Feldname As String
Dim Feldinhalt As Variant
Feldname = Me!lstFeldliste
Feldinhalt = Forms(OpenArgs)(Feldname)
If IsNull(Feldinhalt) Then
Beep
MsgBox "Das ausgewählte Feld hat keinen Inhalt!"
Else
If Not IsNull(Me!txtText) Then
Me!txtText = Me!txtText & vbCrLf & Feldinhalt
Else
Me!txtText = Feldinhalt
End If
End If
End Sub
Die Prozedur ermittelt den Namen des angeklickten Datenfeldes und fügt ihn zusammen mit einem Zeilenumbruch (Konstante vbCrLf) dem Textfeld hinzu.
Nachdem der Benutzer mehrere Feldinhalte auf diese Weise übernommen hat, muss der Inhalt des Textfeldes in die Zwischenablage kopiert werden. Dafür ist die BeimKlicken-Ereignisprozedur der OK-Schaltfläche zuständig:
Private Sub btnOk_Click()
Me!txtText.SetFocus
'Text markieren
SendKeys "^{HOME}"
SendKeys "+^{END}"
'Bearbeiten>Kopieren auswählen
DoCmd.DoMenuItem acFormBar, acEditMenu _
,acCopy, , acMenuVer70
DoCmd.Close
End Sub
Die Ereignisprozedur der Abbrechen-Schaltfläche enthält nur eine einzelne Anweisung:
Private Sub btnAbbrechen_Click()
DoCmd.Close
End Sub
Der Start des Zwischenablage-Assistenten erfolgt über die DoCmd.OpenForm-Methode:
DoCmd.OpenForm FormName:="Zwischenablage-Assistent" _
,WindowMode:=acDialog _
,OpenArgs:=Screen.ActiveForm.Name
Der Ausdruck übergibt dem Zwischenablage-Assistenten direkt den Namen des momentan aktiven Formulars. Sollte kein Formular aktiv sein, tritt hierbei allerdings ein Laufzeitfehler auf. Die folgende Prozedur zeigt, wie Sie Ihn abfangen können. Zusätzlich wird auch gleich der Datensatz des aktuellen Formulars gespeichert, damit der Assistent stets auf die aktuellen Daten zugreift:
Sub ZwischenablageKopieren()
On Error Resume Next
DoCmd.DoMenuItem acFormBar, acRecordsMenu _
,acSaveRecord, , acMenuVer70
DoCmd.OpenForm FormName:="Zwischenablage-Assistent" _
,WindowMode:=acDialog _
,OpenArgs:=Screen.ActiveForm.Name
End Sub
Wenn Sie die Prozedur ZwischenAblageKopieren in ein Standardmodul platzieren, können Sie sie von jedem beliebigen Formular aus aufrufen. Legen Sie innerhalb des Formulars einfach eine Schaltfläche mit einer BeimKlicken-Ereignisprozedur an und rufen Sie von hier aus die Prozedur ZwischenAblageKopieren auf.
Bei einer Adresse ist es beispielsweise erforderlich, dass die Postleitzahl und der Ort in einer einzelnen Zeile erscheinen. Um dies zu bewerkstelligen, legen Sie dem Adressenformular einfach eine Abfrage zugrunde und definieren hier ein neues, berechnetes Feld, über das Sie die Postleitzahl mit dem Ort verknüpfen. Nach dem Start des Assistenten wird das berechnete Feld wie alle anderen Datenfelder in der Feldliste aufgeführt und steht zur Auswahl bereit. Das Anlegen eines Steuerelements für das berechnete Feld ist hierbei nicht erforderlich, da der Assistent direkt auf die Datenquelle zugreift.