Daten in die Zwischenablage kopieren

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.
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