Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 14:18:05
28.04.2024 13:43:14
Anzeige
Archiv - Navigation
1908to1912
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Bild aus Excelblatt in Userform
09.12.2022 17:32:01
Maik
Hallo ich benötige mal etwas Hilfe wenn es überhaupt geht.
Ich habe mir eine dynamisch Bildanzeige nach der Vorgabe aus dem Link gebaut.
https://www.excel-inside.de/beispiele_vba/973-dynamische-bilderanzeige
Das Funktioniert ganz gut.
Nun möchte ich aber in einer Userform ein image einfügen und wenn ich auf einen CommandButton klicke das jeweilige Bild in der Useerform angezeigt bekommen.
Ich wähle also aus einer Listbox einen Wert aus dieser wird dann in einem Tabellenblatt geschrieben.
Die Bilder haben die gleichen Namen wie die Daten aus der Listbox. Somit wird das Bild in dem Tabellenblatt "Daten!) geändert
Wie bekommen ich also die "Grafik 6" so heißt sie bei mir oder den Namen "Bild11" so heißt sie durch den Namensmanager aus dem Link.
Dynamisch auch auf meine Userform ?
Geht das ?
Gruß Maik

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bild aus Excelblatt in Userform
09.12.2022 18:31:22
Nepumuk
Hallo Maik,
lade die Datei hoch, dann baue ich dir das ein.
Gruß
Nepumuk
AW: Bild aus Excelblatt in Userform
09.12.2022 19:21:15
Maik
Das ist schwierig es ist eine sehr große Datenbank für eine Wohnungsverwalltung die ich mir mal zusammengebastelt habe.
Ich versuche mal was neues zu machen was dem ähnlich ist.
AW: Bild aus Excelblatt in Userform
09.12.2022 19:57:18
Maik
So ich habe mal versucht es soweit wie möglich zu reduzieren wie es geht.
Sollte ja dem eigentlichen vorhaben nicht im wege stehen oder ?
Bei der Userform suche ich mir eines der beiden Objekte aus und gehe dann auf daten holen.
Es sind da normal noch viel mehr Daten zu den Objekten.
Unten soll dann wo jetzt "image65" ist das jeweilige Bild rein wenn ich Daten holen klicke.
Im Arbeitsblatt Daten! sind dann die Bilder ab 131
Geht das so ?
Wenn es geht bräuchte ich vielleicht ein paar kommentare dazu damit ich das erweitern kann.
Gruß Maik
https://www.herber.de/bbs/user/156636.xlsm
Anzeige
AW: Bild aus Excelblatt in Userform
10.12.2022 11:12:33
Maik
Ich weiß zwar nicht was das alles in dem Modul zu bedeuten hat, aber es funktioniert auch in meiner Datei super.
Recht herzlichen Dank dafür, dass war bestimmt ne menge Arbeit.
Hätte nicht gedacht das es überhaupt funktionert.
Das möchte das auch mal können. :-)
AW: Bild aus Excelblatt in Userform
09.12.2022 19:59:59
Maik
So ich habe mal versucht es soweit wie möglich zu reduzieren wie es geht.
Sollte ja dem eigentlichen vorhaben nicht im wege stehen oder ?
Bei der Userform suche ich mir eines der beiden Objekte aus und gehe dann auf daten holen.
Es sind da normal noch viel mehr Daten zu den Objekten.
Unten soll dann wo jetzt "image65" ist das jeweilige Bild rein wenn ich Daten holen klicke.
Im Arbeitsblatt Daten! sind dann die Bilder ab 131
Geht das so ?
Wenn es geht bräuchte ich vielleicht ein paar kommentare dazu damit ich das erweitern kann.
Gruß Maik
https://www.herber.de/bbs/user/156636.xlsm
Sorry für den Doppelpost
Anzeige
AW: Bild aus Excelblatt in Userform
09.12.2022 19:47:50
Daniel
Hi
muss es in der Userform sein?
wenn die Userform nicht den ganzen Bildschirm einnimmt, könntest du auch ein Excelfenster aufmachen, dort alles störende entfernen (Menüs, Scrollbars, Rahmen, Zeilen/Spaltenköpfe) und dort das Bild reinkopieren. Das Bild ist dann in einem Excelfenster, dass du neben der Userform platzierst.
Sowas sollte auch für den Anfänger mit Hilfe des Recorders programmierbar sein.
oder kannst du die Bilder als Bilddatei einem Verzeichnis ablegen?
Dann könntest du die Bilder per Code einem Image-Control zuweisen, was auch recht einfach zu programmieren sein dürfte.
Gruß Daniel
Anzeige
AW: Bild aus Excelblatt in Userform
09.12.2022 20:02:27
Maik
Es sollte schon in der Userform sein und in keiner Datei weil die Datei im Netzwerk und mal lokal auf dem Rechner liegt.
Das gibt bestimmt Problem mit dem Pfad wenn man einen Bilder Ordner nimmt oder ?
Ich habe mal eine SpieleDatei hochgeladen. In eine Post davor.
Gruß Maik
AW: Bild aus Excelblatt in Userform
09.12.2022 21:00:23
Daniel
Du solltest die Bilder in dem Verzeichnis ablegen, in dem auch die Datei liegt oder in einem Unterordner dieses Verzeichnisses.
dann kannst du mit ThisWorkbook.Path das Verzeichnis der verwendeten Datei ermitteln, so dass dieses immer stimmen sollte, auch wenn die Datei im Netzwerk liegt.
Sollten sich die Bilder ändern, erzeugt das dann halt etwas mehr Aufwand.
Problematisch wirds dann, wenn du die Datei zum Arbeiten jemanden schicken willst.
Wenn die Bilder zwingend aus der Exceldatei genommen werden müssen, dann gibt es noch folgenden Workaround:
- man kann Shapes oder Bilder, die in einem Excelblatt liegen kopieren und in ein Diagramm einfügen.
- Diagramme kann man als Bildatei speichern: https://learn.microsoft.com/de-de/office/vba/api/excel.chart.export
dh das Vorgehen wäre, dass du dir ein leeres Diagramm anlegst. Im Makro kopierst du dann das gewünschte Bild in das Diagramm. Dann exportierst du das Diagramm als Bilddatei in das Verzeichnis (Thisworkbook.Path) und liest es von dort in dein Image-Control auf der Userform ein.
danach kannst du das Bild im Verzeichnis und im Diagramm wieder löschen
Gruß Daniel
Anzeige
AW: Bild aus Excelblatt in Userform
09.12.2022 21:44:56
Daniel
Hi
das wäre der code, um ein Bild aus dem Blatt in das Image-Control zu überragen.
Das Diagramm legst du am besten so an:
rechter Mausklick auf einen Tabellenblattreiter und dann EINFÜGEN - DIAGRAMM.
dann verschiebst du das Diagramm in das Blatt 2 (Menü Diagramm - Entwurf - Ort), dort kannst du die Größe anpassen.
auf diese weise hast du sofort ein Diagramm ohne weitere elemente als leeres Blatt.
dann verwendest du diesen Code im Click-Event der Listbox500
die Listbox500 muss die Shape-Namen der Bilder auf Blatt Daten enthalten

Private Sub ListBox500_Click()
Dim file As String
file = ThisWorkbook.Path & "\xxx.gif"
Sheets("Daten").Shapes(ListBox500.Text).Copy
With Sheets("Tabelle2").ChartObjects(1).Chart
.Paste
.Export file
Image65.Picture = LoadPicture(file)
.Shapes(1).Delete
Kill file
End With
End Sub
die Listbox500 muss die Shape-Namen der Bilder auf Blatt Daten enthalten

Private Sub UserForm_Initialize()
Dim shp As Shape
For Each shp In Tabelle10.Shapes
ListBox500.AddItem shp.Name
Next
End Sub
das wars eigentlich.
Gruß Daniel
Anzeige
AW: Bild aus Excelblatt in Userform
09.12.2022 22:01:19
Maik
Das muss ich erstmal auf mich wirken lassen.
Da wird mir beim lesen schon schwindelig. Kannst du das in der Datei die ich hier angehängt habe mal zeigen?
https://www.herber.de/forum/messages/1910744.html
Versuche es aber morgen abend mal zu verwürklichen wenn ich dem folgen kann was du geschrieben hast.
AW: Bild aus Excelblatt in Userform
09.12.2022 22:35:48
Daniel
Womit hast du Schwierigkeiten:
- ein Diagramm zu erstellen?
- den Code vom Forum in den Editor kopieren?
AW: Bild aus Excelblatt in Userform
10.12.2022 09:22:37
Maik
Ich habe es jetzt doch mit dem Extra Ordner gemacht, fall es nicht so geht wie ich es mag.
Es soll definitiv auf die userform über alles andere kann man reden.
Leider funktuoniert das nicht im Netzwerk.
Ich bin auf one Drive. Arbeite aber nicht ohnline sondern über den onedrive ordner auf dem computer.
DIeser syncroniesiert sich immer mit one drive wenn ich was speicher.
Wenn ich die Datei und den Bilder Ordner lokal sichere funktioniert alles.
Der Fehler kommt bei:

If Dir(pfad & imagename)  "" Then
Hier der ganze Code

Private Sub CommandButton500_Click()
Daten_schreiben
Dim pfad As String
Dim name As String
Dim Geb_Dat As String
Dim platzhalter As String
Dim pfadplatzh As String
Dim imagename As String
pfad = ActiveWorkbook.Path & "\Bilder\"
pfadplatzh = ActiveWorkbook.Path & "\Bilder\"
name = Me.ListBox500.List(ListBox500.ListIndex, 0)
imagename = name & ".jpg"
platzhalter = "platzhalter.jpg"
If Dir(pfad & imagename)  "" Then
Image65.Picture = LoadPicture(pfad & imagename)                           'hier wird das Teilnehmerbild abgefragt
Image65.PictureSizeMode = fmPictureSizeModeStretch
Else
Image65.Picture = LoadPicture(pfadplatzh & platzhalter)                   'wenn das Teilnehmerbild nicht vorhanden, dann soll der Platzhalter eingesetzt werden
Image65.PictureSizeMode = fmPictureSizeModeStretch
End If
End Sub

Anzeige
AW: Bild aus Excelblatt in Userform
10.12.2022 11:48:53
Daniel
Bei der Methode, die ich dir gezeigt habe, brauchst du keinen weiteren Ordner, in dem die Bilder abgelegt sind.
Du brauchst lediglich irgendein Verzeichnis, in dem der Anwender Schreibrechte hat
Das kann der Desktop sein, direkt auf der C-Platte, das Windows-Temp-Verzeichnis oder der Downloadordner, egal.
Denn wie gesagt, der Ablauf ist:
1. Bild in der Tabelle kopieren und in ein Diagramm einfügen
2. Diagramm als Bilddatei exportieren
3. Bilddatei in Imagecontrol einlesen
4. Bilddatei und Bild im Diagramm wieder löschen
Wohin du hierbei das Bild Speicherstadt, is völlig egal, weil es ja sofort wieder gelöscht wird.
Das einfachste ist der Desktop, dort hat der Anwender immer Schreibrecht.
Ersetze also in meinem Code das Thisworbook.path durch Environ("USERPROFILE") & "\Desktop", um dort die Datei temporär zu speichern.
Gruß Daniel
Anzeige
AW: Bild aus Excelblatt in Userform
10.12.2022 15:55:20
Daniel
naja, wenn dir da schon schwindelig wird,

   Private Sub ListBox500_Click()
Dim file As String
file = ThisWorkbook.Path & "\xxx.gif"
Sheets("Daten").Shapes(ListBox500.Text).Copy
With Sheets("Tabelle2").ChartObjects(1).Chart
.Paste
.Export file
Image65.Picture = LoadPicture(file)
.Shapes(1).Delete
Kill file
End With
End Sub
der Code von Nepumuk ist das hier (nur mal so zum Vergleich)
das Ergenis ist das gleiche.:

Option Explicit
Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" ( _
ByRef PicDesc As PICT_DESC, _
ByRef RefIID As GUID, _
ByVal fPictureOwnsHandle As LongPtr, _
ByRef IPic As IPicture) As LongPtr
Private Declare PtrSafe Function CopyImage Lib "user32.dll" ( _
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.dll" ( _
ByVal wFormat As Long) As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32.dll" ( _
ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32.dll" ( _
ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function DeleteObject Lib "gdi32.dll" ( _
ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function CLSIDFromString Lib "ole32.dll" ( _
ByVal lpsz As Any, _
ByRef pCLSID As GUID) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type PICT_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
Private Const GUID_IPICTUREDISP As String = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
Private Function PastePicture(ByRef prlngptrCopy As LongPtr) As IPictureDisp
Dim lngReturn As Long, lngptrPointer As LongPtr
If CBool(IsClipboardFormatAvailable(CF_BITMAP)) Then
lngReturn = OpenClipboard(Application.hwnd)
If lngReturn > 0 Then
lngptrPointer = GetClipboardData(CF_BITMAP)
prlngptrCopy = CopyImage(lngptrPointer, _
IMAGE_BITMAP, 0&, 0&, LR_COPYRETURNORG)
Call CloseClipboard
If lngptrPointer  0 Then Set PastePicture = _
CreatePicture(prlngptrCopy, 0)
End If
End If
End Function
Private Function CreatePicture( _
ByVal lngptrhPic As LongPtr, _
ByVal lngptrhPal As LongPtr) As IPictureDisp
Dim udtPicInfo As PICT_DESC, udtID_IDispatch As GUID
Dim objPicture As IPictureDisp
Call CLSIDFromString(StrPtr( _
GUID_IPICTUREDISP), udtID_IDispatch)
With udtPicInfo
.lSize = LenB(udtPicInfo)
.lType = PICTYPE_BITMAP
.hPic = lngptrhPic
.hPal = lngptrhPal
End With
Call OleCreatePictureIndirect(udtPicInfo, _
udtID_IDispatch, 0&, objPicture)
Set CreatePicture = objPicture
Set objPicture = Nothing
End Function
Public Function ShowPicture( _
ByRef probjWorksheet As Worksheet, _
ByVal pvstrShapeName As String) As IPictureDisp
Static slngptrCopy As LongPtr
Dim objTempPicture As IPictureDisp
If slngptrCopy  0 Then Call DeleteObject(slngptrCopy)
Call OpenClipboard(0)
Call EmptyClipboard
Call CloseClipboard
On Error Resume Next
Do
Call probjWorksheet.Shapes(pvstrShapeName).CopyPicture( _
Appearance:=xlScreen, Format:=xlBitmap)
If Err.Number = 0 Then Exit Do
Call Err.Clear
Loop
On Error GoTo 0
Do
Set objTempPicture = PastePicture(slngptrCopy)
Loop While objTempPicture Is Nothing
Set ShowPicture = objTempPicture
Set objTempPicture = Nothing
End Function

Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige