|
Zugriff auf die Zwischenablage per Code? Das scheint unter VBA in den Microsoft Office-Anwendungen ein kleines Geheimnis zu sein und ist wohl für VBScript (z.B. im Windows Scripting Host) völlig unbekannt. Im "puren" Visual Basic steht dagegen das schlichte wie ebenso funktionstüchtige Clipboard-Objekt zur Verfügung. Darüber können Sie Daten in den allergängigsten Formaten in die Zwischenablage legen und auch wieder auslesen.
Warum ich von einem kleinen Geheimnis in VBA spreche? Weil Sie dort den Zugriff auf die Zwischenablage erst dann bekommen, wenn Sie die MSForms-Bibliothek als Verweis laden und das darin enthaltene DataObject verwenden. Aber weder in der allgemeinen Office-Bibliothek noch in den Office-Anwendungen werden sie ein entsprechendes Objekt finden können.
Um diesem Mangel abzuhelfen, und um auch in Scripting-Umgebungen die Zwischenablage zur Verfügung zu stellen, habe ich die VB-eigene Zwischenablage in eine kleine ActiveX-Server-DLL verpackt. Laden Sie einfach in Ihren VBA-Projekten einen Verweis darauf, oder legen Sie in einem Script mit CreateObject("avbClipboardDLL.avbClipboard") ein entsprechendes Objekt an.
Das avbClipboard-Objekts verwenden Sie auf exakt gleiche Weise wie das originale VB-Clipboard-Objekt. Der einzige winzige Unterschied besteht darin, dass die Format-Konstanten jetzt die Vorsilbe "avb" tragen - die originalen Konstanten vbCFxxx stehen Ihnen ja außerhalb einer VB-Umgebung nicht zur Verfügung.
Da das Objekt ein globales Objekt darstellt, brauchen Sie es unter VBA noch nicht einmal explizit zu instanzieren - Sie verwenden es einfach direkt, sozusagen "aus heiterem Himmel":
Debug.Print avbClipboard.GetText
Natürlich können Sie es auch unter VBA dynamisch per CreateObject anlegen - aber wozu der Umstand?
Einzige wichtige Voraussetzung für die Verwendung des avbClipboard-Objekts ist, dass auf dem betreffenden System die VB6-Runtime-Dateien installiert sind. Die Version, die Sie hier herunterladen können (siehe Ende dieses Beitrags), enthält ein Visual Basic 6-Projekt und die DLL ist auch mit VB6 kompiliert. Es sollte jedoch kein Problem sein, das das Klassen-Modul avbClipboard.cls auch in Visual Basic 5 in ein ActiveX-DLL-Projekt zu laden und zu kompilieren.
Wie Sie aus dem folgenden Code der Klasse avbClipboard ersehen können, wird in der Klasse avbClipboard lediglich die originale Funktionalität ohne jede Einschränkung eins zu eins offengelegt. Die notwendige Fehlerbehandlung nimmt dabei sogar mehr Platz in Anspruch, als die eigentliche Funktionalität:
Public Enum avbCFConstants
avbCFLink = &HBF00
avbCFRTF = &HBF01
avbCFText = 1
avbCFBitmap = 2
avbCFMetafile = 3
avbCFDIB = 8
avbCFPalette = 9
End Enum
Public Sub Clear()
Clipboard.Clear
End Sub
Public Function GetData _
(Optional ByVal Format As avbCFConstants = avbCFBitmap) _
As IPictureDisp
On Error Resume Next
Set GetData = Clipboard.GetData(Format)
If Err.Number Then
Err.Raise Err.Number, "avbClipboardDLL.GetData", Err.Description
End If
End Function
Public Function GetFormat(ByVal Format As avbCFConstants) As Boolean
On Error Resume Next
GetFormat = Clipboard.GetFormat(Format)
If Err.Number Then
Err.Raise Err.Number, "avbClipboardDLL.GetFormat", _
Err.Description
End If
End Function
Public Function GetText _
(Optional ByVal Format As avbCFConstants = avbCFText) As String
On Error Resume Next
GetText = Clipboard.GetText(Format)
If Err.Number Then
Err.Raise Err.Number, "avbClipboardDLL.GetText", _
Err.Description
End If
End Function
Public Sub SetData _
(Picture As IPictureDisp, Optional ByVal Format As avbCFConstants _
= avbCFBitmap)
On Error Resume Next
Clipboard.SetData Picture, Format
If Err.Number Then
Err.Raise Err.Number, "avbClipboardDLL.SetData", _
Err.Description
End If
End Sub
Public Sub SetText _
(Str As String, Optional ByVal Format As avbCFConstants = avbCFText)
On Error Resume Next
Clipboard.SetText Str, Format
If Err.Number Then
Err.Raise Err.Number, "avbClipboardDLL.SetText", _
Err.Description
End If
End Sub
|
Nachgerüstet: Zwischenablage für VBA-Programme

|

|