Clipboard-Format
#1
Hallo,

Problem: Welche Art von Daten ist im Clipboard?

VBA stellt eine Reihe von "xlClipboarsFormat..." zur Verfügung, aber der Code, welches ist das aktuell Format, war per googeln nicht auffindbar.

Noch schwieriger waren entsprechende API, z.B.

https://stackoverflow.com/questions/1211...board-data

oder

https://learn.microsoft.com/en-us/archiv...86b2db2878

Gibt es eine einfache Möglichkeit zu bestimmen, ob ein Excel-Range oder etwas anderes im Clipboards ist?

Danke und mfg


PS: Das Problem ist eine Verbindung per VPN und RDP zu einem Terminal-Server (TS), auf dem ein VBA-Code läuft. Falls der User lokal das Clipboard nutzt, kann es Konflikte zum Clipboard des TS geben
Antworten Top
#2
Hallo Fennek,

wenn in Excel etwas normal kopiert wird, befinden sich etliche Formate in der Zwischenablage.
Beim Einfügen an anderer Stelle wird das passende Format eingefügt oder das, was der User ausgewählt hat, wenn das angeboten wird.

Ob sich ein Format aktuell in der Zwischenablage befindet kannst Du mit der API-Funktion IsClipboardFormatAvailable ganz einfach ermitteln.
Mit EnumClipboardFormats kannst Du Dir alle Formate auflisten lassen. SO wie es in dem von Dir Link ja auch schon dargestellt ist.

Wozu brauchst Du das?
Wenn z.B. nur Text erlaubt ist bei Deiner Ziel-App, dazu habe ich hier im Forum einen Beitrag, der zeigt, wie man die Zwischenablage zwingt, nur Text bereitzuhalten.
https://www.clever-excel-forum.de/Thread...e-kopieren

Ansonsten kann ich hier in meiner Bastelkiste mal schauen, ob ich da schon etwas Passendes drin habe.

Gruß
KH
Antworten Top
#3
Hallöchen,

ich hatte das vor langem so in einem Projekt. Ob man damit allerdings auf "Range" kommt, sei dahingestellt ...
Allerdings finde ich die im Code genannten Formate 38, 40 und 45 nicht in der Enumeration von MS:
ms/vba/api/excel.xlclipboardformat
Da scheint sich auch ab und an was zu ändern, siehe Kommentar zu 97 und XP Wink Die 45 könnte von W7 oder W10 kommen, das Ding lief gut 25 Jahre...
Das "Shape" war eine Gruppierung aus Textboxen une einem Diagramm.

Code:
Function TestClipboard(name$) As Boolean
'--- Prüft, ob sich im Clipboard die Vorlage befindet
    Dim retcode As Boolean, tst_clp As Boolean
    Dim formats, i%, test_shape As Shape
    retcode = False
    formats = Application.ClipboardFormats
    tst_clp = False
    For i = LBound(formats) To UBound(formats)
        'unter 97 = 40, XP = 38 warum auch immer SCH
        If formats(i) = 40 Or formats(i) = 45 Then tst_clp = True
    Next i
    If tst_clp Then
        'Inhalt der Zwischenablage auf temporäres Blatt
        With Vars.Vorlagen.Worksheets("temp")
            On Error Resume Next
            If .Shapes.count > 0 Then
                .Shapes(1).Delete
                .Shapes(name).Delete
            End If
            .Paste
            Set test_shape = .Shapes(name)
            If Not (test_shape Is Nothing) Then
                retcode = True
            End If
            .Shapes(1).Delete
            On Error GoTo 0
            .Cells.Delete
        End With
    End If
    TestClipboard = retcode
End Function
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#4
Vielen Dank

aus dem Link von Volti habe ich "Function GlobalSize" gelernt um die Anzahl der Zeichen im Clipboard zu bestimmen. Der erste Test war ganz gut, aber es bedarf noch mehr Prüfungen.

In meinem Archiv habe ich diesen Code gefunden:

Code:
Sub ListClipFormats()
    Dim Arr, Fmt

    Arr = Application.ClipboardFormats

    For Each Fmt In Application.ClipboardFormats
        Select Case Fmt
            Case xlClipboardFormatBIFF Or 8: Debug.Print "Binary Interchange file format for Excel version 2.x"
            Case xlClipboardFormatBIFF12 Or 63: Debug.Print "Binary Interchange file format 12"
            Case xlClipboardFormatBIFF2 Or 18: Debug.Print "Binary Interchange file format 2"
            Case xlClipboardFormatBIFF3 Or 20: Debug.Print "Binary Interchange file format 3"
            Case xlClipboardFormatBIFF4 Or 30: Debug.Print "Binary Interchange file format 4"
            Case xlClipboardFormatBinary Or 15: Debug.Print "Binary format"
            Case xlClipboardFormatBitmap Or 9: Debug.Print "Bitmap format"
            Case xlClipboardFormatCGM Or 13: Debug.Print "CGM format"
            Case xlClipboardFormatCSV Or 5: Debug.Print "CSV format"
            Case xlClipboardFormatDIF Or 4: Debug.Print "DIF format"
            Case xlClipboardFormatDspText Or 12: Debug.Print "Dsp Text format"
            Case xlClipboardFormatEmbeddedObject Or 21: Debug.Print "Embedded Object"
            Case xlClipboardFormatEmbedSource Or 22: Debug.Print "Embedded Source"
            Case xlClipboardFormatLink Or 11: Debug.Print "Link"
            Case xlClipboardFormatLinkSource Or 23: Debug.Print "Link to the source file"
            Case xlClipboardFormatLinkSourceDesc Or 32: Debug.Print "Link to the source description"
            Case xlClipboardFormatMovie Or 24: Debug.Print "Movie"
            Case xlClipboardFormatNative Or 14: Debug.Print "Native"
            Case xlClipboardFormatObjectDesc Or 31: Debug.Print "Object description"
            Case xlClipboardFormatObjectLink Or 19: Debug.Print "Object link"
            Case xlClipboardFormatOwnerLink Or 17: Debug.Print "Link to the owner"
            Case xlClipboardFormatPICT Or 2: Debug.Print "Picture"
            Case xlClipboardFormatPrintPICT Or 3: Debug.Print "Print picture"
            Case xlClipboardFormatRTF Or 7: Debug.Print "RTF format"
            Case xlClipboardFormatScreenPICT Or 29: Debug.Print "Screen Picture"
            Case xlClipboardFormatStandardFont Or 28: Debug.Print "Standard Font"
            Case xlClipboardFormatStandardScale Or 27: Debug.Print "Standard Scale"
            Case xlClipboardFormatSYLK Or 6: Debug.Print "; SYLK"
            Case xlClipboardFormatTable Or 16: Debug.Print "; Table"
            Case xlClipboardFormatText Or 0: Debug.Print "Text"
            Case xlClipboardFormatToolFace Or 25: Debug.Print "Tool Face"
            Case xlClipboardFormatToolFacePICT Or 26: Debug.Print "Tool Face Picture"
            Case xlClipboardFormatVALU Or 1: Debug.Print "Value"
            Case xlClipboardFormatWK1 Or 10: Debug.Print "Workbook"
        End Select
    Next Fmt

End Sub

Nach dem Kopieren eines Excel-Range mit Texten war das Ergebnis:

Text
Picture
DIF format
CSV format
; SYLK
RTF format
Binary Interchange file format for Excel version 2.x
Bitmap format
Link
Dsp Text format
Native
Link to the owner
Object link
Embedded Source
Link to the source file
Object description
Link to the source description
Binary Interchange file format 12


Das konnte ich nicht interpretieren. Erwartet hatte ich entweder "Table", "Text", "Object" oder "Link".

Wenn die Anzahl der Zeichen im Clipboard valide wäre, könnte ich das zur Kontrolle nutzen.

mfg

Dieser Code scheint die Anzahl der Zeichen im Clipboard zu bestimmen, ohne Änderungen vorzunehmen:

Code:
Option Explicit

Private Declare PtrSafe Function GlobalSize Lib "kernel32" ( _
        ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" ( _
        ByVal wFormat As Long) As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _
        ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _
        ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long

Sub T_Clip_Size()
  Dim hMem As LongPtr, lpGMem As LongPtr, sCliptext As String, i As Long
  Const CF_TEXT As Long = 1

If IsClipboardFormatAvailable(CF_TEXT) > 0 Then               ' Daten vorhanden?
      OpenClipboard 0&                                       ' Zwischenablage öffnen
      hMem = GetClipboardData(CF_TEXT)         ' TEXT aus Zwischenablage
      If hMem > 0 Then
          Debug.Print CLng(GlobalSize(hMem))
      End If
      
      CloseClipboard     ' Zwischenablage schließen
End If

End Sub

Da mein Code viele tausend Zeichen kopiert, sollte andere copies von einem User unterschieden werden. Mal sehen was ein echter Test bringt.

mfg
Antworten Top
#5
Hallo,

ich denke, da kann man in der Tat die Größe der kopierten Menge gut abschätzen.

Aber der Code zeigt nur den Textteil (CF_TEXT) der Zwischenablage. Wurde nur ein Objekt kopiert, wird 0 zurückgegeben, obwohl ja Objektdaten in der Zwischenablage sind.

Die Formate (Excelformate wie Deine und Andrés Code xlClip...) sind nicht deckungsgleich mit den Windowsformaten und geben m.E. beide nicht die von Dir gewünschten Bezeichnungen wie Table, usw. her.

Gruß
KH
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste