Anzeige
Archiv - Navigation
1104to1108
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

Picture Paste auf Userform

Picture Paste auf Userform
Axel
Guten Morgen liebe Helfer!
Mal wieder an der Grenze meines Könnens:
ich habe einen Tabellenbereich (inklusive Formatierung etc) als .bmp im Zwischenspeicher.
Wenn ich jetzt im Eigenschaftenbereich einer Userform auf Picture klicke, kann ich diesen Zwischenspeicher pasten (ctrl+v), das .bmp wird prima in die Userform eingegliedert.
Genau diesen Schritt möchte ich gerne als Befehl innerhalb eines Makros, d.h. ohne aufwändigen Export eines Bildes in eine Datei/Excel-Sheet mit anschließendem "Reimport" auf die Userform.
Gibt's das?
Danke für Hilfe!
Gruß,
Axel

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Gibt's das? Nein! oT
02.10.2009 12:18:31
F1
F1
Das gibts doch gar nicht...! :)
02.10.2009 12:53:30
Axel
hmmm.
nur noch mal nachgefragt: ich will das nicht in eine laufende userform einbinden, sondern vorab bei der initialisierung der userform "aufkleben". d.h. der zwischenspeicher wird auch durch das makro gefüllt und soll dann eben in die userform pasten, bevor diese startet.
wo schreibt excel eigentlich das bild hin / speichert es für den folgendenen excelstart ab, wenn ich wie oben beschrieben die userform mit dem bild aus der zwischenablage beaufschlage...?
...Nepumuk weiß wie es geht?
02.10.2009 13:30:49
Axel
ich habe auch dies gefunden (alter beitrag von Nepumuk):
wenn ich mit meinem bescheidenen verständnis erfasst habe, worum es geht, sollte seine methode 2 meine antwort sein...
Hallo Richard,
in Tabellen eingefügte Bilder in ein Userform zu bringen kannst du mit drei Methoden.
1. Du kopierst die Bilder in ein ChartObject, exportierst sie auf die Festplatte, von der du sie in das Image lädst.
2. Du kopierst es, erstellst über die GDI32.dll ein virtuelles Bild, das du in dein Image laden kannst.
3. Du hast die Bilder in Imagecontrols in der Tabelle und kannst sie direkt zuweisen.
Die 3. Methode ist die einfachste:
Image1.Picture = Worksheets("Tabelle1").Shapes("Image1").OLEFormat.Object.Object.Picture
Gruß
Nepumuk
Anzeige
AW: ...Nepumuk weiß wie es geht?
02.10.2009 13:53:33
JogyB
Hi.
Die 3. Methode sieht gut aus, wieso aber das Ganze so kompliziert und nicht einfach:
Image1.Picture = Worksheets("Tabelle1").Image1.Picture
Gruss, Jogy
AW: Picture Paste auf Userform
03.10.2009 09:24:40
Nepumuk
Hallo Axel,
versuch es mal so:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

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

Public Sub Show_Range()
    
    Dim objPicture As IPictureDisp
    
    Call EmptyClipboard
    
    Tabelle1.Range("A1:C5").CopyPicture _
        Appearance:=xlScreen, Format:=xlBitmap
    
    Set objPicture = Paste_Picture
    
    If Not objPicture Is Nothing Then
        UserForm1.Picture = objPicture
    Else
        MsgBox "Error - Range can't show in Userform", vbCritical, "Error"
    End If
    
    UserForm1.Show
    
End Sub

Gruß
Nepumuk
Anzeige
Picture Paste Userform, Nepumuk?
05.10.2009 09:33:40
Axel
Guten Morgen Nepumuk,
vielen Dank, dass Du Dich gekümmert hast.
Dein Code ist für mich etwas zu hoch. Ich habe ihn im Einzelschrittmodus ausgeführt um etwas zu verstehen, aber wenn es um .dll und diese Tiefe von Function-Zusammenarbeit geht... ist das für mich als Hobby-Makrospieler etwas viel.
Meine Rückfrage hier:
das Makro arbeitet nicht wie es soll. Das Clipboard wird gefüllt (getestet mit Ctrl+v), aber in dieser Zeile
If lngPointer 0 Then Set Paste_Picture = Create_Picture(lngCopy, 0&, CF_BITMAP)
ist der lngPointer = 0. Anschließend ist
ObjPicture Is Nothing = true
in der letzten If-Abfrage. Hast Du eine Idee woran das liegen könnte?
Meine Umgebung: XP professional, Englisches Office2003 SP3, deutsche Tastaturbelegung
In jedem Fall schon mal Danke für Deine bisherige Hilfe,
Axel
Anzeige
AW: Picture Paste Userform, Nepumuk?
05.10.2009 10:47:35
Nepumuk
Hallo,
kann ich nicht nachvollziehen, bei mir funktioniert das einwandfrei. Hast du den Code mal in einer neuen Mappe getestet (Userform einfügen !!!)?
Gruß
Nepumuk
AW: Picture Paste Userform, Nepumuk?
05.10.2009 13:03:29
Axel
Hallo Nepumuk,
ja, eine neue Mappe zeigt den gleichen Fehler wie beschrieben. Deinen Code habe ich in ein "normales" Modul eingefügt, eine Userform1 ist vorhanden.
Muss ich evtl noch irgendwelche References aktivieren?
Ich werde mir Dein Makro in jedem Fall mal genauer ansehen, da kann ich viel lernen.
Inzwischen habe ich es doch über einen Export erledigt (wollte ich vermeiden, weil bei Netzwerkrechnern die Belegung der FestplattenBuchstaben und der vorhandnen Ordner nie perfekt zuverlässig ist).
Danke Dir nochmals,
Axel
Sub zeichnung_auslesen()
vFilePath = "..."
Workbooks.Open Filename:=vFilePath
Sheets(1).Range("A1:I8").CopyPicture Appearance:=xlScreen, Format:=xlPicture
If ActiveWorkbook.Name = ZeichnungsNummer & ".xls" Then
ActiveWorkbook.Close savechanges:=False
End If
Sheets(1).Select
Charts.Add
ActiveChart.Paste
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.ScaleWidth 1.42, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleHeight 1.42, msoFalse, msoScaleFromTopLeft
ActiveChart.ChartArea.Select
ActiveChart.Location Where:=xlLocationAsObject, Name:= sheets(1).name
ActiveSheet.ChartObjects(1).Activate
ActiveSheet.Shapes(1).ScaleWidth 1.63, msoFalse, msoScaleFromBottomRight
ActiveSheet.Shapes(1).ScaleHeight 0.79, msoFalse, msoScaleFromTopLeft
Worksheets(1).ChartObjects(1).Chart.Export Filename:="C:\Temp\999.gif", FilterName:="gif"
ActiveWindow.Visible = False
Selection.Delete
ZeichnBl1.Show
End Sub
Private Sub Userform_Initialize()
Dateiname = "C:\Temp\999.gif"
ZeichnBl1.Image1.Picture = LoadPicture(Dateiname)
End Sub

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige