Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1012to1016
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
Grafik in Userform funktioniert nicht
24.09.2008 21:08:48
SteffenS
Hallo Zusammen,
der angehängte Code funktioniert unter Excel 2003 unter Excel 2007 funktioniert er leider nicht.
Woran kann dies liegen?
Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
ByRef PicDesc As PIC_DESC, _
ByRef RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, _
ByRef IPic As IPictureDisp) As Long
Private Declare Function CopyImage Lib "user32.dll" ( _
ByVal handle As Long, _
ByVal un1 As Long, _
ByVal n1 As Long, _
ByVal n2 As Long, _
ByVal un2 As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
ByVal wFormat As Integer) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" ( _
ByVal wFormat As Integer) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare 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 PIC_DESC
lngSize As Long
lngType As Long
lnghPic As Long
lnghPal As Long
End Type
Private Const PICTYPE_BITMAP = 1
Private Const CF_BITMAP = 2
Private Const IMAGE_BITMAP = 0
Private Const LR_COPYRETURNORG = &H4
Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"

Private Function Paste_Picture() As IPictureDisp
Dim lngReturn As Long, lngCopy As Long, lngPointer As Long
If IsClipboardFormatAvailable(CF_BITMAP)  0 Then
lngReturn = OpenClipboard(FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption))
If lngReturn > 0 Then
lngPointer = GetClipboardData(CF_BITMAP)
lngCopy = CopyImage(lngPointer, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Call CloseClipboard
If lngPointer  0 Then Set Paste_Picture = Create_Picture(lngCopy, 0&, CF_BITMAP)
End If
End If
End Function



Private Function Create_Picture( _
ByVal lnghPic As Long, _
ByVal lnghPal As Long, _
ByVal lngPicType As Long) As IPictureDisp
Dim udtPicInfo As PIC_DESC, udtID_IDispatch As GUID
Dim objPicture As IPictureDisp
With udtID_IDispatch
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
With udtPicInfo
.lngSize = Len(udtPicInfo)
.lngType = PICTYPE_BITMAP
.lnghPic = lnghPic
.lnghPal = lnghPal
End With
Call OleCreatePictureIndirect(udtPicInfo, udtID_IDispatch, 0&, objPicture)
Set Create_Picture = objPicture
End Function


Sub UserForm_Initialize()
Dim objPicture As IPictureDisp
Call EmptyClipboard
'Admin setzen
Dim ADM As Worksheet, ADMB As Worksheet
Set ADM = Workbooks(admin_datei).Sheets("bt_admin")
Set ADMB = Workbooks(pl_menu).Sheets("tb_a_anzeigen")
Dim MAllg As Worksheet
Set MAllg = Workbooks(pl_menu).Sheets("adm_einst")
Dim MName As String, bname As String, BBereich As String
Dim BRange As Range
MName = ADMB.Range("D8").Value 'Mappenname
bname = ADMB.Range("E8").Value 'Blattname
BBereich = ADMB.Range("G8").Value 'Bereich
'Bereich festlegen
Set BRange = Range("A1:D5") 'Workbooks(MName).Sheets(bname).Range(BBereich)
BRange.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
Set objPicture = Paste_Picture
If Not objPicture Is Nothing Then
UserForm1.Image1.Picture = objPicture
Else
MsgBox "Error - Sheet can't show in Userform", vbCritical, "Error"
End If
End Sub


Danke im Voraus.
MFG
Steffen Schmerler

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Grafik in Userform funktioniert nicht
24.09.2008 21:30:33
Ramses
Hallo
Das ist ein EXCEL-Forum,... kein Forum für Hellseher :-)
Du solltest schon sagen WAS nicht funktioniert.
Gruss Rainer
Beispielmappe anbei, denn folgendes geht nicht...
24.09.2008 21:42:19
SteffenS
der aufruf der Grafik:
Das Objekt objPicture ist nothing
Aus Diesem Grund erscheint der Fehler
MsgBox "Error - Sheet can't show in Userform", vbCritical, "Error"
Unter Excel 2003 geht das aber.
Eine Beispielarbeitsmappe findet Ihr hier:
https://www.herber.de/bbs/user/55638.xlsm
Habt Ihr eine Idee was es sein kann.
Noch offen: E2007 ist gefragt...
24.09.2008 21:49:00
Ramses
Hallo
Sorry,. ich habe leider kein E2007, aber nun kann jemand der E2007 hat sich des Problems mal annehmen und mal testen
Gruss Rainer
Anzeige
eines habe ich herausgef., aber ist keine Lösu
24.09.2008 22:06:19
SteffenS
Das kopieren geht.
Denn wenn ich den Bereich per PasteSpecial einfüge geht es.
Leider weiß ich aber sonst nicht weiter.
Danke Euch nochmal
Steffen
Hat noch jemand ne Idee?
25.09.2008 09:11:12
SteffenS
ich habe mal im Netz geschaut, da hatte noch niemand das Problem.
Danke Euch nochmals
Steffen Schmerler
AW: Hat noch jemand ne Idee?
27.09.2008 10:06:00
Tino
Hallo,
hier eine alternative. (Beispiel)
Benötigt
Userform1, Anzeige: Name= Image1
Bereich kannst du in der Zeile "Set MeinBereich = Range("A1:D8")" anpassen!
Dialog UserForm1
Option Explicit 
 
Private Sub UserForm_Initialize() 
 Call BildErstellen 
End Sub 
Private Sub BildErstellen() 
Dim SaveName As String 
Dim MeinBereich As Range 
Dim SaveFullName As String 
Dim Hi As Integer, Wi As Integer 
Set MeinBereich = Range("A1:D8") 
 
SaveFullName = _
IIf(Right$(ThisWorkbook.Path, 1) = "\", _
ThisWorkbook.Path & "MeinBild.jpg", _
ThisWorkbook.Path & "\MeinBild.jpg") 
    
 Application.ScreenUpdating = False 
   Workbooks.Add 
   ActiveSheet.Name = "JPEG_Container" 
   Charts.Add 
   ActiveChart.ChartType = xlColumnClustered 
   ActiveChart.SetSourceData Source:=Worksheets(1).Range("A1") 
   ActiveChart.Location Where:=xlLocationAsObject, Name:="JPEG_Container" 
   ActiveChart.ChartArea.ClearContents 
    
   Hi = MeinBereich.Height   'adjustment for gridlines 
   Wi = MeinBereich.Width    'adjustment for gridlines 
   MakeAndSizeChart ih:=Hi, iv:=Wi 
    
   MeinBereich.CopyPicture Appearance:=xlScreen, _
   Format:=xlBitmap 
   ActiveChart.Paste 
   Application.CutCopyMode = False 
    
   ActiveChart.Export Filename:=LCase(SaveFullName), FilterName:="JPEG" 
   ActiveWorkbook.Close False 
  Application.ScreenUpdating = True 
 UserForm1.Image1.Picture = LoadPicture(SaveFullName) 
 Kill SaveFullName 
 Set MeinBereich = Nothing 
End Sub 
Private Sub MakeAndSizeChart(ih As Integer, iv As Integer) 
Dim Hincrease As Single, Vincrease As Single 
Dim Obnavn As String 
    Obnavn = Trim$(Mid(ActiveChart.Name, Len(ActiveSheet.Name) + 1)) 
    Hincrease = ih / ActiveChart.ChartArea.Height 
    ActiveSheet.Shapes(Obnavn).ScaleHeight Hincrease, _
    msoFalse, msoScaleFromTopLeft 
    Vincrease = iv / ActiveChart.ChartArea.Width 
    ActiveSheet.Shapes(Obnavn).ScaleWidth Vincrease, _
    msoFalse, msoScaleFromTopLeft 
End Sub 
 
 


Gruß Tino

www.VBA-Excel.de


Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige