Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1604to1608
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
Inhaltsverzeichnis

dynamisches Diagramm als Image in UserForm

dynamisches Diagramm als Image in UserForm
02.02.2018 11:18:54
Christian
Hallo Zusammen,
ich habe im Tabellenblatt Gewicht ein Diagramm 4, dass ich über die UserForm2 in dessen Image1 anzeigen lassen möchte. Wie ich das einmalig und quasi manuell als .picture löse, habe ich hinbekommen. Da das Diagramm allerdings in den dargestellten Daten dynamisch ist, möchte ich es bei dem Aufruf der UserForm2 jedes Mal neu "laden".
Ich habe mir versucht etwas mit Verstand und Google zusammenzubauen und bin dabei aber nicht wirklich weitergekommen. Das ist davon "übrig" geblieben:
Sub UserForm2_preload()
Dim Diagramm As ChartObject
Set Diagramm = Worksheets("Gewicht").Shapes.Range(Array("ChartObjects 4"))
With Diagramm
.Chart.Export Filename:="C:\Temp\Diagramm.gif"
End With
UserForm2.Image1.Picture = LoadPicture("C:\TEMP\Diagramm.gif")
UserForm2.Show
End Sub

Helft Ihr mir mit Eurem Können wieder einmal weiter - das wäre klasse?!
Vielen Dank und viele Grüße
Christian

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 11:29:10
Beverly
Hi Christian,
sobald sich die Daten im Diagramm ändern musst du den Code erneut ausführen, sodass das geänderte Diagramm dann ins Image geladen werden kann.


AW: dynamisches Diagramm als Image in UserForm
02.02.2018 11:36:19
Sepp
Hallo Christian,
Nepumuk hat dazu mal was feines gezeigt.
In ein allgemeines Modul:
Modul Modul1
Option Explicit 
 
'© 2015 by Nepumuk - http://www.herber.de/forum/messages/1458287.html 
 
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(CLngPtr(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 = Len(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 ShowShape( _
        ByRef probjWorksheet As Worksheet, _
        ByVal pvstrShapeName As String) As IPictureDisp 
 
    Static slngptrCopy As LongPtr 
 
    Call OpenClipboard(0&) 
    Call EmptyClipboard 
    Call CloseClipboard 
 
    If slngptrCopy <> 0 Then Call DeleteObject(slngptrCopy) 
 
    probjWorksheet.Shapes(pvstrShapeName).CopyPicture _
        Appearance:=xlScreen, Format:=xlBitmap 
 
    Set ShowShape = PastePicture(slngptrCopy) 
 
    If ShowShape Is Nothing Then _
        Call MsgBox("Shape can't show in Userform", vbCritical, "Error") 
 
End Function 
 

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


In das Modul des UF:
Dialog UserForm2
Option Explicit 
 
'© 2015 by Nepumuk - http://www.herber.de/forum/messages/1458287.html 
 
Private Sub UserForm_Initialize() 
Set Image1.Picture = ShowShape(Sheets("Gewicht"), "ChartObjects 4") 
    Repaint 
End Sub 

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0

Gruß Sepp

Anzeige
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 14:06:35
Christian
Hallo Sepp,
leider funktioniert das nicht - es werden keine Änderung des Diagramms ins Image1 übernommen. An welche Stelle muss ich dann das UserForm2.show setzen. Muss das UserForm2_Initialize im Zusammenhang mit Call aufgerufen werden?
Sorry, sollte das nicht sehr klug klingen...
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 14:42:43
Sepp
Hallo Christian,
"funktioniert nicht" ist meine liebste Fehlerbeschreibung!
Wenn du das UF aufrufst, wird 'Initialize' durchlaufen. Wenn du das Diagramm änderst während das UF angezeigt wird, musst du natürlich den Code
Set Image1.Picture = ShowShape(Sheets("Gewicht"), "ChartObjects 4")
Repaint

erneut ausführen.
Sonst lade mal deine Datei hoch.
Gruß Sepp

Anzeige
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 14:52:33
Christian
Funktioniert nicht... bedeutet in diesem Fall, dass Änderungen im Diagramm nicht bei Aufruf der UserForm angezeigt werden. Ich lade die Datei gerne hoch. Die UserForm2 soll bei Klicken auf Image3 in UserForm1 aufgerufen werden.
https://www.herber.de/bbs/user/119495.xlsm
VIELEN DANK
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 14:53:15
Christian
Vergiss das bitte mit der UserForm1 - die musste ich auf Grund der Dateigröße löschen.
Wo ist das Problem?
02.02.2018 15:06:40
Beverly
Ich hatte in meinem Bietrag doch geschrieben, dass du den Code für das Exportieren des Diagramms und Laden ins Image immer wieder neu ausführen musst - und wenn das bei Klick auf Image3 im UserForm1 ausgeführt werden soll, dann musst du den Code immer von dort aus wieder neu aufrufen. Also Code im UserForm3:
Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, _
ByVal Y As Single)
UserForm2_preload
End Sub

Und - wie bereits vorhanden - Code im allgemeinen Modul:
Sub UserForm2_preload()
Dim Diagramm As ChartObject
Set Diagramm = Worksheets("Gewicht").ChartObjects(1)
With Diagramm
.Chart.Export Filename:="C:\Temp\Diagramm.gif"
End With
UserForm2.Image1.Picture = LoadPicture("C:\Temp\Diagramm.gif")
UserForm2.Caption = "Gewichtsverlauf"
UserForm2.Show
End Sub



Anzeige
AW: Wo ist das Problem?
02.02.2018 15:42:15
Christian
Hallo und Entschuldigung, die Datei hatte fast 3 MB und ich habe beim löschen wohl auch den Code im allgemeinen Modul herausgenommen. Vorher habe ich alles entsprechend eingefügt... leider ohne den gewünschten Erfolg. Die Darstellung des Diagramms4 änderte sich nicht dynamisch. Die Umbenennung von Initialize habe ich gemacht,da ich zuvor die Fehlermeldung hatte, dass das Objekt nicht gefunden werde. So war diese dann zumindest nicht mehr da. Ich wollte mich halt selbst versuchen und nicht jeden Gedanken hier erfragen. Leider hat das dann nicht geklappt.
AW: Wo ist das Problem?
02.02.2018 17:35:31
Beverly
Und hast du den Code, den ich gepostet habe, denn nun mal getestet?


Anzeige
AW: Wo ist das Problem?
02.02.2018 19:55:18
Christian
Hallo Karin,
ich komme leider erst jetzt wieder dazu, es auszuprobieren. Was soll ich sagen... außer Dankeschön - auch für Deine Beharrlichkeit. Es klappt alles wunderbar. Der gewünschte Effekt tritt ein...PERFEKT.
Und noch einmal sorry, auch und mit dem gleichen Danke an Sepp, für das Wirrwarr bzw. das Fehlen der Codes in der hochgeladenen Datei.
Ihr hat mir sehr geholfen.
Viele Grüße, Christian
AW: dynamisches Diagramm als Image in UserForm
02.02.2018 15:00:33
Sepp
Hallo Christian,
hast du irgendwo gelesen, dass du 'Private Sub UserForm_Initialize()' umbenennen sollst?
Dialog UserForm2
Option Explicit 
 
Private Sub UserForm_Initialize() 
Set Image1.Picture = ShowShape(Sheets("Gewicht"), "Diagramm 4") 
    Repaint 
End Sub 

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0

Und ohne den Code im allgemeinen Modul, wird es wohl auch nicht gehen, oder glaubst du, der war nur zur Dekoration?
Gruß Sepp

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige