Daten in die Zwischenablage kopieren

15.02.2006 von Helma  Spona
Wenn Daten einer Datenbank auch in anderen Anwendungen genutzt werden sollen, ist es hilfreich, wenn dieser Datenaustausch auch bequem und einfach über die Zwischenablage erfolgen kann. Dazu muss der Benutzer die Daten eines Formulars oder einer Tabelle in die Zwischenablage kopieren können. Neben Windows API und externen Komponenten gibt es hierfür noch weitere Alternativen.

Der einfachste Fall liegt vor, wenn Sie es dem Benutzer ermöglichen möchten, den Inhalt eines Steuerelements in einem Formular oder einen ganzen Datensatz beziehungsweise Teile davon in die Zwischenablage zu kopieren. Das Einzige, was Sie dazu brauchen, ist ein Steuerelement, in dem sich der zu kopierende Inhalt befindet und das den Fokus bekommen kann.

Formularinhalte kopieren

Möchten Sie also Teile eines Datensatzes kombinieren und im Ganzen kopieren, fügen Sie dazu einfach ein Textfeld in das Formular ein und geben den Inhalt als Formel an. Möchten Sie beispielsweise in einem Formular zur Erfassung von Adressen die komplette Adresse zusammensetzen, könnte das wie in Bild 1 aussehen.

Bild 1: Formular zur Erfassung von Adressdaten.

Sie brauchen dann noch eine Schaltfläche, im Beispiel heißt sie bttMerken, mit der Sie den Kopiervorgang starten. Für diese Schaltfläche erstellen Sie eine Ereignisprozedur für das Click- Ereignis (Listing 1). Um den Inhalt des Textfeldes txtAdresse mit der Anschrift zu kopieren, müssen Sie zunächst dafür sorgen, dass das Steuerelement den Fokus hat, indem Sie die SetFocus-Methode aufrufen. Anschließend markieren Sie den Inhalt des Textfeldes und legen dazu mit der Sel- Start-Eigenschaft den Anfang der Markierung auf 0 fest. Danach bestimmen Sie die Länge der Markierung mit der SelLength-Eigenschaft. Die Länge des Inhalts wird mit Hilfe der Len-Funktion ermittelt. Den markierten Text kopieren Sie zum Schluss mit der DoMenuItem-Methode.

Private Sub bttMerken_Click()
Me.txtAdresse.SetFocus
'Text markieren
Me.txtAdresse.SelStart = 0
Me.txtAdresse.SelLength = Len(Me.txtAdresse.Value)
'Text kopieren
DoCmd.DoMenuItem acFormBar, acEditMenu, acCopy, , acMenuVer70
End Sub

Die RunCommand-Anweisung

Alternativ lässt sich auch die RunCommand-Anweisung verwenden (Listing 2). Wenn Sie ihr die Konstante acCmdCopy übergeben, kopiert sie die aktuelle Markierung in die Zwischenablage. Entsprechend können Sie die kopierten Inhalte mit der Konstanten acCmdPaste wieder einfügen.

Private Sub bttMerken2_Click()
Me.txtAdresse.SetFocus
'Text markieren
Me.txtAdresse.SelStart = 0
Me.txtAdresse.SelLength = Len(Me.txtAdresse.Value)
'Text kopieren
RunCommand acCmdCopy
End Sub

Kopieren mit Hilfe der Windows API

Möchten Sie die Windows-API verwenden, benötigen Sie den meisten Code. Allerdings hat diese Methode den Vorteil, dass sie unabhängig von Formularfeldern ist und beliebige Texte in die Zwischenablage kopieren kann. Dazu müssen Sie natürlich zunächst auf Modulebene die benötigten API-Funktionen und Konstanten deklarieren. Die Funktion Kopieren ruft die Funktionen dann auf und gibt bei Erfolg eine leere Zeichenfolge zurück, bei Misserfolg die entsprechende Fehlermeldung. Den zu kopierenden Text übergeben Sie als Parameter an die Funktion Kopieren. Die Prozedur test_kopieren zeigt den Aufruf. Nach dem Ausführen der Prozedur sollte Access 2000 und höher die Zwischenablage wie in Abbildung 2 anzeigen. In Access 97 erkennen Sie, dass der Text tatsächlich kopiert wurde, indem Sie den Cursor in das Testfenster setzen und [Strg] + [V] drücken. Dann wird der kopierte Text eingefügt.

Bild 2: Der kopierte Text in der Zwischenablage.

Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, _
ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Function Kopieren(strText As String) As String
Dim lngMem As Long
Dim lngPMem As Long
Dim lngMemausschn As Long
Dim lngX As Long
Kopieren = ""
'Speicher in erforderlicher Größe sperren
lngMem = GlobalAlloc(GHND, Len(strText) + 1)
'Zeiger auf den gesperrten Speicherblock ermitteln
lngPMem = GlobalLock(lngMem)
'Zeichenkette in Speicher kopieren
lngPMem = lstrcpy(lngPMem, strText)
'Sperrung des Speichers aufheben
If GlobalUnlock(lngMem) <> 0 Then
Kopieren = "Fehler: Freigeben des Speichers nicht möglich!"
'Zwischenablage schließen
If CloseClipboard() = 0 Then
Kopieren = Kopiere & "Fehler: Zwischenablage kann nicht geschlossen werden!"
End If
Exit Function
End If
'Zwischenablage öffnen
If OpenClipboard(0&) = 0 Then
Kopieren = Kopieren & "Fehler: Zwischenablage konnte nicht geöffnet werden!"
Exit Function
End If
'Inhalt der Zwischenablage löschen
lngX = EmptyClipboard()
'Daten in die Zwischenablage kopieren
lngMemausschn = SetClipboardData(CF_TEXT, lngMem)
'Zwischenablage schließen
If CloseClipboard() = 0 Then
Kopieren = Kopiere & "Fehler: Zwischenablage kann nicht geschlossen werden!"
End If
End Function
Sub test_kopieren()
Dim strTemp As String
strTemp = Kopieren("Dies ist ein Test")
If strTemp > "" Then
Debug.Print strTemp
End If
End Sub