Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SavePicture

Forumthread: SavePicture

SavePicture
10.02.2009 19:59:00
Wolfgang
Hallo
Ich möchte gerne eine Grafik aus dem Zwischenspeicher
als Datei abspeichern.
Mit SavePicture sollte das auch möglich sein.
zb mit der Befehlszeile.
SavePicture ClipBoard.GetData(),"c:\Test.bmp"
Leider wird mir das Objekt StdPicture nicht angezeigt.
Ich habe schon in den Verweisen nachgeschaut aber nixt gefunden
was ich aktivieren kann.
Hat jemand ein Tip
gruß
Wolfgang
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SavePicture
10.02.2009 21:59:00
Wolfgang
Hallo Nepumuk
Danke für deine Antwort. Hab den Cod mal schnell überpflogen.
Ich denke ich komme damit klar.
Nur die oben genannte Programmzeile habe ich im Netz gefunden
Sieht ja sehr einfach aus .
Nur es Funktioniert nicht.
Gruß Wolfgang
Anzeige
AW: SavePicture
10.02.2009 22:13:45
Nepumuk
Hallo Wolfgang,
irgendwie kann ich mit deiner Antwort nichts anfangen.
Darum noch mal vorgekaut, vorverdaut und zum weitern Genuss vorzeitig ausgeschieden. Da ich aber nicht weiß, wie dein Bild ins Clipboard kommt, ohne Garantie für Bekömmlichkeit.
' **********************************************************************
' 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
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 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 Save_Picture()
    
    Dim objPicture As IPictureDisp
    
    Set objPicture = Paste_Picture
    
    If Not objPicture Is Nothing Then
        stdole.SavePicture objPicture, "D:\Eigene Dateien\Picture.bmp"
    Else
        MsgBox "Error - No picture in Clipboard", vbCritical, "Error"
    End If
    
End Sub

Gruß
Nepumuk
Anzeige
AW: SavePicture
11.02.2009 08:04:00
wolfgang
Hallo
Nepummuk
Danbke für die Antwort
gruß Wolfgang
;
Anzeige

Infobox / Tutorial

Grafiken mit VBA speichern: So funktioniert SavePicture


Schritt-für-Schritt-Anleitung

Um eine Grafik aus dem Zwischenspeicher mit VBA zu speichern, kannst du die SavePicture-Methode verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den Visual Basic for Applications (VBA) Editor in Excel. Dies kannst du durch Drücken von ALT + F11 erreichen.

  2. Füge ein neues Modul hinzu:

    • Rechtsklicke im Projektfenster auf "VBAProject (dein Arbeitsbuch)".
    • Wähle "Einfügen" > "Modul".
  3. Füge den folgenden Code in das Modul ein:

    Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (...)
    Private Declare Function CopyImage Lib "user32.dll" (...)
    Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (...)
    Private Declare Function OpenClipboard Lib "user32.dll" (...)
    Private Declare Function GetClipboardData Lib "user32.dll" (...)
    Private Declare Function CloseClipboard Lib "user32.dll" (...)
    
    ' Hier folgt der restliche Code für Paste_Picture und Create_Picture
    
    Public Sub Save_Picture()
       Dim objPicture As IPictureDisp
       Set objPicture = Paste_Picture
    
       If Not objPicture Is Nothing Then
           stdole.SavePicture objPicture, "D:\Eigene Dateien\Picture.bmp"
       Else
           MsgBox "Error - No picture in Clipboard", vbCritical, "Error"
       End If
    End Sub
  4. Passe den Speicherort an: Ersetze "D:\Eigene Dateien\Picture.bmp" durch den gewünschten Speicherort.

  5. Führe das Makro aus, während ein Bild im Zwischenspeicher ist.


Häufige Fehler und Lösungen

  • Fehler: "Error - No picture in Clipboard"

    • Lösung: Stelle sicher, dass tatsächlich ein Bild im Zwischenspeicher vorhanden ist. Du kannst dies überprüfen, indem du das Bild in ein anderes Programm wie Paint einfügst.
  • Fehler: StdPicture-Objekt nicht angezeigt

    • Lösung: Überprüfe, ob die nötigen Verweise im VBA-Editor aktiviert sind, insbesondere Microsoft Forms 2.0 Object Library.

Alternative Methoden

Wenn die SavePicture-Methode nicht funktioniert, kannst du auch andere Ansätze ausprobieren:

  • Nutze ein Screenshot-Tool: Füge das Bild manuell in Excel ein und mache dann einen Screenshot, den du abspeichern kannst.
  • Verwende die Windows-Zwischenspeicher-Funktion: Kopiere das Bild in die Zwischenablage und füge es direkt in ein Grafikbearbeitungsprogramm ein.

Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie du die Grafik aus dem Zwischenspeicher speichern kannst:

Sub Beispiel_SavePicture()
    ' Stelle sicher, dass ein Bild im Clipboard ist
    If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        Save_Picture
    Else
        MsgBox "Kein Bild im Zwischenspeicher."
    End If
End Sub

Tipps für Profis

  • Nutze olecreatepictureindirect: Diese Funktion kann helfen, die Bilddaten besser zu verarbeiten. Stelle sicher, dass du die richtigen Parameter übergibst.
  • Fehlerbehandlung implementieren: Füge On Error Resume Next und On Error GoTo 0 hinzu, um mögliche Fehler beim Zugriff auf das Clipboard zu handhaben.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass das Bild im Clipboard ist?
Du kannst das Bild in ein einfaches Grafikprogramm wie Paint einfügen, um zu prüfen, ob es im Clipboard vorhanden ist.

2. Funktioniert das nur in bestimmten Excel-Versionen?
Ja, die SavePicture-Methode und der VBA-Code funktionieren in den meisten modernen Excel-Versionen (2010 und neuer). Prüfe die Kompatibilität deiner verwendeten Funktionen.

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