Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bild aus Zelle in Userform anzeigen

Bild aus Zelle in Userform anzeigen
29.07.2020 02:46:27
Sleepyhead
Guten Morgen zusammen,
hier gleich das nächste Problemkind...
Ich möchte in meiner Userform je nach Auswahl eines Eintrages in der zugehörigen ListBox das Bild welches zu dem Eintrag in der Listform gehört anzeigen lassen. Sowohl die Daten für die ListBox als auch für die Image-form sind in einem Worksheet desselben Workbooks gespeichert.
Ich habe mich online schon durch viele verschiedene Foren gewälzt, jedoch keine direkte Lösung für mein Problem gefunden. Ich kann die Bilder nicht anhand der Bildnummer suchen, da diese auch von einem User ohne jegliche Ahnung von Excel in dem Worksheet eingefügt werden sollen.
Versucht habe ich dies z.B. indem ich die ZellAdresse in der das jeweilige Bild gespeichert ist ansteuer und mir das Object bzw. Picture der Zelle in der Useform direkt anzeigen lasse.
Könnte mir jemand ein Sub-Beispiel dafür geben wie ich mir Bilder aus dem Worksheet anzeigen lassen kann und ggf. auch eine Möglichkeit ein eingefügtes Bild direkt mit der Zelle zu verankern, sodass auch bei neuen Einträgen der Zellenbezug des Bildes gleichbleibt?
Vielen Dank im Voraus
LG
Sleepyhead
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bild aus Zelle in Userform anzeigen
29.07.2020 08:24:58
volti
Hallo Sleepyhead,
hier mal zwei Beispiele, wie Du Bilder aus Deinem Worksheet in einer Userform anzeigen lassen kannst.
Einmal über den Namen des Bildes und einmal über die Zellposition. Der code kann in ein Modul oder auch in einen UF-Bereich. Tabellenname und Image müsstet Du noch anpassen, dann sollte es funktionieren.
[+][-]
Option Explicit 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 SetClipboardData Lib "user32" (ByVal wFormat As Long, _ ByVal hMem As LongPtr) As LongPtr 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 Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Declare PtrSafe Function RegisterClipboardFormat Lib "user32" _ Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long Private Type PIC_DESC lSize As Long lType As Long hPic As LongPtr hPal As LongPtr End Type Dim hPic As LongPtr Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Const PICTYPE_BITMAP = 1 Private Const CF_BITMAP = 2 Private Const IMAGE_BITMAP = 0 Private Const LR_COPYRETURNORG = &H4 Sub Paste_Picture_ByPosition(iZeile As Long) 'Fügt ein Bild aus einer Pic-Sammlung über die Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp, oShape As Shape Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID 'Bild suchen und in die Zwischenablage kopieren With ThisWorkbook.Sheets("Tabelle2") For Each oShape In .Shapes If oShape.TopLeftCell.Address = .Cells(iZeile, "A").Address Then oShape.CopyPicture Appearance:=xlScreen, Format:=xlBitmap DoEvents: Exit For End If Next oShape End With 'Bild aus Zwischenablage in das Image einfügen If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) CloseClipboard If hPic <> 0 Then With tID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With tPicInfo .lSize = Len(tPicInfo) .lType = PICTYPE_BITMAP .hPic = hPic .hPal = 0 End With OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict If Not oPict Is Nothing Then '######### Hier die Userform und Image-Angaben anpassen ######## UserForm1.Image3.Picture = oPict Else MsgBox "Das Bild kann nicht angezeigt werden", vbCritical, "Bild einfügen" End If End If End If End If End Sub Sub Paste_Picture_ByName(sSuch As String) 'Fügt ein Bild aus einer Pic-Sammlung über die Zwischenablage in ein Userform-Control ein Dim oPict As IPictureDisp, oShape As Shape Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID 'Bild suchen und in die Zwischenablage kopieren With ThisWorkbook.Sheets("Tabelle2") For Each oShape In .Shapes If oShape.Name Like sSuch & "*" Then oShape.CopyPicture Appearance:=xlScreen, Format:=xlBitmap DoEvents: Exit For End If Next oShape End With 'Bild aus Zwischenablage in das Image einfügen If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then If OpenClipboard(0&) <> 0 Then hPic = CopyImage(GetClipboardData(CF_BITMAP), _ IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) CloseClipboard If hPic <> 0 Then With tID_IDispatch .Data1 = &H20400 .Data4(0) = &HC0 .Data4(7) = &H46 End With With tPicInfo .lSize = Len(tPicInfo) .lType = PICTYPE_BITMAP .hPic = hPic .hPal = 0 End With OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict If Not oPict Is Nothing Then '######### Hier die Userform und Image-Angaben anpassen ######## UserForm1.Image3.Picture = oPict Else MsgBox "Das Bild kann nicht angezeigt werden", vbCritical, "Bild einfügen" End If End If End If End If End Sub
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Bild aus Zelle in Userform anzeigen
29.07.2020 22:43:02
Sleepyhead
Vielen vielen Dank Karl Heinz,
damit kann ich etwas anfangen, ich werde das ganze nur noch ein wenig anpassen müssen, da sich die Userform auf über 10.000 Zeilen mit Daten und Bildern pro Sheet bezieht aber mit dieser erstklassigen Vorlage bekomme ich das hin.
LG
Sleepyhead
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Bilder aus Zellen in Userform anzeigen


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor in Excel (Alt + F11).
  2. Füge ein neues Modul hinzu:
    • Rechtsklick auf "VBAProject (DeinWorkbookName)" > Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Option Explicit

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 Type PIC_DESC
    lSize As Long
    lType As Long
    hPic As LongPtr
    hPal As LongPtr
End Type

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

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

Sub Paste_Picture_ByPosition(iZeile As Long)
    Dim oPict As IPictureDisp, oShape As Shape
    Dim tPicInfo As PIC_DESC, tID_IDispatch As GUID

    With ThisWorkbook.Sheets("Tabelle2")
        For Each oShape In .Shapes
            If oShape.TopLeftCell.Address = .Cells(iZeile, "A").Address Then
                oShape.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
                DoEvents: Exit For
            End If
        Next oShape
    End With

    If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        If OpenClipboard(0&) <> 0 Then
            hPic = CopyImage(GetClipboardData(CF_BITMAP), IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
            CloseClipboard
            If hPic <> 0 Then
                With tID_IDispatch
                    .Data1 = &H20400
                    .Data4(0) = &HC0
                    .Data4(7) = &H46
                End With
                With tPicInfo
                    .lSize = Len(tPicInfo)
                    .lType = PICTYPE_BITMAP
                    .hPic = hPic
                    .hPal = 0
                End With
                OleCreatePictureIndirect tPicInfo, tID_IDispatch, 0&, oPict
                If Not oPict Is Nothing Then
                    UserForm1.Image3.Picture = oPict
                Else
                    MsgBox "Das Bild kann nicht angezeigt werden", vbCritical, "Bild einfügen"
                End If
            End If
        End If
    End If
End Sub
  1. Passe den Code an:
    • Ersetze "Tabelle2" durch den Namen deines Arbeitsblattes.
    • Stelle sicher, dass das Image-Steuerelement in deiner Userform korrekt benannt ist (z. B. Image3).

Häufige Fehler und Lösungen

  • Fehler: Bild wird nicht angezeigt
    Lösung: Überprüfe, ob die Zelladresse korrekt ist und dass das Bild tatsächlich in der angegebenen Zelle vorhanden ist.

  • Fehler: Laufzeitfehler bei OleCreatePictureIndirect
    Lösung: Stelle sicher, dass du die richtigen Verweise in deinem VBA-Projekt hast. Manchmal kann es helfen, das Bild in der Zelle erneut einzufügen und den Code erneut auszuführen.


Alternative Methoden

Eine andere Möglichkeit, Bilder in einer Userform anzuzeigen, ist die Verwendung des ipicturedisp-Objekts, um Bilder direkt aus einer Bilddatei zu laden. Hier ist ein Beispiel:

Sub LoadPictureFromFile(FilePath As String)
    UserForm1.Image3.Picture = LoadPicture(FilePath)
End Sub

Du kannst diesen Code verwenden, um Bilder direkt von einer Datei zu laden, anstatt sie aus einer Zelle zu kopieren.


Praktische Beispiele

  • Beispiel 1: Um ein Bild aus der Zelle A1 anzuzeigen, rufe die Subroutine Paste_Picture_ByPosition(1) auf, während du dich in einem Button-Click-Ereignis befindest.
  • Beispiel 2: Um ein Bild anhand des Namens anzuzeigen, verwende eine ähnliche Methode, aber passe den Code so an, dass er den Namen des Bildes überprüft.

Tipps für Profis

  • Verankere Bilder in Zellen, indem du sicherstellst, dass die zelle-Objekte entsprechend eingestellt sind. So bleibt das Bild auch bei Verschiebungen in der Tabelle korrekt zugeordnet.
  • Nutze OleCreatePictureIndirect, um die Integration von Bildern in Userforms zu optimieren. Dies ermöglicht eine bessere Speicherverwaltung und schnellere Bilddarstellung.

FAQ: Häufige Fragen

1. Wie kann ich ein Bild in einer Zelle verankern?
Um ein Bild in einer Zelle zu verankern, kannst du die Eigenschaften der Shape-Objekte anpassen, sodass sie an die Zelle gebunden sind.

2. Was ist der Unterschied zwischen LoadPicture und OleCreatePictureIndirect?
LoadPicture wird verwendet, um Bilder von Dateien zu laden, während OleCreatePictureIndirect für die Verwendung von Bildern aus der Zwischenablage oder von Shapes in Excel gedacht ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige