Bild aus Zwischenablage in Userform-Image einfügen
#1
Liebe Leserin, lieber Leser,

oft möchte man ein Bild, einen Tabellenbereich oder einfach nur den Inhalt aus der Zwischenablage in ein Userform-Imagecontrol einfügen.
Bild oder Tabellenbereich hat man per VBA schon mal kopiert und ist nicht Bestandteil dieses Artikels.

Neben dem bekannten Weg, sich aus dem Bereich ein Chartobjekt zu kreieren, dieses in eine Datei auszulagern und die Datei dann per UserForm.Image1.Picture = LoadPicture(sFilePath) einzubinden,
zeige ich hier mal eine praktische API-Möglichkeit.

Code:

Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _
        ByRef PicDesc As PIC_DESC, ByRef RefIID As GUID, _
        ByVal fPictureOwnsHandle As LongPtr, ByRef IPic As IPictureDisp) As Long
Private Declare PtrSafe Function CopyImage Lib "user32" ( _
        ByVal handle As LongPtr, ByVal un1 As Long, ByVal n1 As Long, _
        ByVal n2 As Long, ByVal un2 As Long) 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

Private Type GUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type

Private Type PIC_DESC
   lSize As Long
   lType As Long
   hPic  As LongPtr
   hPal  As LongPtr
End Type

Private Const PICTYPE_BITMAP    As Long = 1
Private Const CF_BITMAP         As Long = 2
Private Const IMAGE_BITMAP      As Long = 0
Private Const LR_COPYRETURNORG  As Long = &H4

Sub Paste_Picture_In_UF(oUF As Object)
' Fügt ein Bild aus der Zwischenablage in ein Userform-Control ein
  Dim oPict As IPictureDisp
  Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID

  If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
    
     If OpenClipboard(0&) <> 0 Then                                 ' Zwischenblage öffnen
        With tID_IDispatch
             .Data1 = &H20400
             .Data4(0) = &HC0
             .Data4(7) = &H46
        End With
        
        With tPicInfo
             .lSize = LenB(tPicInfo)
             .lType = PICTYPE_BITMAP
             .hPic = CopyImage(GetClipboardData(CF_BITMAP), _
                     IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)          ' Bitmap-Daten aus Zwischenablage holen
             CloseClipboard                                         ' Zwischenablage schließen
             If .hPic <> 0 Then
                OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict
             End If
        End With
        
        If Not oPict Is Nothing Then
           oUF.Picture = oPict                                      ' Bild in Image einfügen
        Else
           MsgBox "Das Bild kann nicht angezeigt werden", vbCritical, "Bild einfügen"
        End If

     End If
  End If
End Sub


Sub Test()
  ThisWorkbook.Sheets("Tabelle1").Range("A20:B22").Copy
  DoEvents                  ' Achtung, wichtig
  Call Paste_Picture_In_UF(UserForm1.Image3)
  UserForm1.Show
End Sub

_________
viele Grüße
Karl-Heinz
Antworten Top


Gehe zu:


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