Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bildschirmauschnitt vom Clipboard speichern

Bildschirmauschnitt vom Clipboard speichern
Nibio
Hallo Excell-Freunde,
wäre möglich ein Bildschirmauschnitt vom Zwischenablage per VBA direkt als Bild zu speichern (auf Festplatte) ? Egal welche Format, wichtig is das es nicht länger als 2 sekunde dauert.
Ich dachte das wäre einfach, denn das Bild befindet sich bereit in Clipboard! Das ist aber alles andere als einfach :-(
Vielen Dank im Voraus.
Gruß
Nibio
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 19:28:16
Nepumuk
Hallo,
du hast doch bis auf eine Zeile alles:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

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 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 Function Paste_Picture() As IPictureDisp
    
    Dim lngReturn As Long, lngCopy As Long, lngPointer As Long
    
    If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        
        lngReturn = OpenClipboard(Application.hWnd)
        
        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&)
            
        End If
    End If
End Function

Private Function Create_Picture( _
        ByVal lnghPic As Long, _
        ByVal lnghPal As Long) As IPictureDisp

    
    Dim udtPicInfo As PIC_DESC, udtID_IDispatch As GUID
    Dim objPicture As IPictureDisp
    
    With udtID_IDispatch
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
    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
        
        Call stdole.StdFunctions.SavePicture(objPicture, "C:\Test.bmp")
        
    Else
        
        MsgBox "Picture can't be saved", vbCritical, "File Error"
        
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 22:19:33
Nibio
wow, funktioniert super, ich weiß nicht wie ich dir danken soll.
Herzlichen Dank Nepumuk, spitze Leistung.
Gruß
Nibio
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 22:38:06
Nibio
Hallo Nepumuk,
ganz kurz, wäre jetzt vielleicht möglich die gröse in byte (belegte Speicherplatz) von den gespeichertes Bild in Zelle a1 zu übertragen? Ich meine das Bild test.bmp.
Sonst egal, ich werde es zu ein spätere Zeitpunk hier postieren.
Danke nochmal.
Gruß
Nibio
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 22:47:46
Nepumuk
Hallo,
nach dieser Zeile:
Call stdole.StdFunctions.SavePicture(objPicture, "C:\Test.bmp")
Diese einfügen:
Tabelle1.Cells(1, 1).Value = FileLen("C:\Test.bmp")
Das ist aber "nur" die Dateigröße, nicht der tatsächliche Speicherbedarf auf der Platte. Der ist immer etwas größer.
Gruß
Nepumuk
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 23:21:11
Nibio
Danke dir, eine Frage:
Alle screenshots die über den VBA Script gespeicher werden haben die selbe Größe, aber wenn ich die Bilder über Windows Paint speichere, dann sind die Größe unterschiedlich, jede Zahl entspricht eine andere Größe. Liegt das and die compression methode oder so? Wenn die Bilder immer gleich Größ sind, dann war das alles umsonst :-(.
Sorry die Störung, wen das nicht so einfach ist, dann lass es bitte sein, ich möchte deine Zeit nicht noch mehr vergolden. Auf jeden Fall vielen Dank.
Gruß
Nibio
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
18.08.2011 23:49:06
Nepumuk
Hallo,
das ist abhängig vom Format. .jpg, .gif und .png sind Kommpressionsmethoden für .bmp-Bilder und abhängig davon wie viele verschieden Farben drin sind. Je mehr Farbe desto größer die gepackte Datei. Wenn du alle Bilder als BMP speicherst sind alle gleich groß.
Gruß
Nepumuk
AW: Bildschirmauschnitt vom Clipboard speichern
19.08.2011 11:51:57
Nibio
Hallo Nepumuk,
muß ich in dem script einfach *.bmp mit *.jpg ersetzen?
Gruß
Nibio
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
19.08.2011 13:29:48
Nepumuk
Hallo,
da würden sich die Entwickler dieser Kompressionsmethode sicher bedanken, wenn das so einfach ginge. Du kannst doch auch nicht einfach bei einem .doc die Endung auf .bmp ändern und das Dokument wird 1 zu 1 als Bild geöffnet. Es gibt eine DLL die das kann, aber ich weiß nicht ob die kostenlos ist.
Gruß
Nepumuk
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
19.08.2011 13:41:04
Nibio
Hallo Nepumuk,
was ist ein DDL?
Gruß
Nibio
Erstens- DLL,zweitens..
19.08.2011 13:56:57
robert
Hi,
kannst du nicht eigenständig danach suchen?
Tante Google gibt dir sicher Auskunft ;-)
Gruß
robert
AW: Erstens- DLL,zweitens..
19.08.2011 14:11:51
Nibio
spart dir die Wörter
Anzeige
AW: Bildschirmauschnitt vom Clipboard speichern
19.08.2011 14:17:20
Nibio
Hallo Nepumuk,
ich wäre bereit für den Script auch zu bezahlen. Falls das möglich wäre, sag mir Bescheid.
Wenn nicht, Danke trotzdem.
Gruß
Nibio
AW: Bildschirmauschnitt vom Clipboard speichern
19.08.2011 16:08:48
Nibio
Hallo Nepumuk,
Danke.
Auf diese Seite war ich auch schon, nur ich bin kein Prrogrammierer, ich verstehe nichts davon, ich kann nur das Makrorecorder nutzen sonst nicht.
Gruß
Nibio
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Bildschirmausschnitt vom Clipboard speichern


Schritt-für-Schritt-Anleitung

Um ein Bildschirmausschnitt vom Clipboard in Excel zu speichern, kannst du folgenden VBA-Code verwenden. Dieser speichert ein Bild aus der Zwischenablage direkt als Datei auf deiner Festplatte.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu: Klicke auf Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Option Explicit

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 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 Function Paste_Picture() As IPictureDisp
    Dim lngReturn As Long, lngCopy As Long, lngPointer As Long

    If IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        lngReturn = OpenClipboard(Application.hWnd)

        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&)
        End If
    End If
End Function

Private Function Create_Picture( _
    ByVal lnghPic As Long, _
    ByVal lnghPal As Long) As IPictureDisp
    Dim udtPicInfo As PIC_DESC, udtID_IDispatch As GUID
    Dim objPicture As IPictureDisp

    With udtID_IDispatch
        .Data1 = &H20400
        .Data4(0) = &HC0
        .Data4(7) = &H46
    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
        Call stdole.StdFunctions.SavePicture(objPicture, "C:\Test.bmp")
    Else
        MsgBox "Picture can't be saved", vbCritical, "File Error"
    End If
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Führe das Makro Save_Picture aus, um das Bild aus der Zwischenablage zu speichern.

Häufige Fehler und Lösungen

  • Fehler: „Picture can't be saved“
    Mögliche Ursache: Es befindet sich kein Bild in der Zwischenablage. Stelle sicher, dass du zuerst einen Bildschirmausschnitt erstellt hast.

  • Fehler: Bild wird nicht gespeichert
    Überprüfe den Speicherort (z.B. C:\Test.bmp). Stelle sicher, dass dieser Pfad existiert und du die erforderlichen Berechtigungen hast.


Alternative Methoden

Wenn VBA nicht die gewünschte Lösung bietet, kannst du auch folgende Methoden nutzen:

  1. Snipping Tool: Nutze das Snipping Tool in Windows, um Screenshots zu erstellen und manuell zu speichern.
  2. Drittanbieter-Software: Es gibt verschiedene Programme, die speziell für das Speichern von Screenshots entwickelt wurden, z.B. Greenshot oder ShareX.

Praktische Beispiele

  • Speichern als JPG: Um ein Bild aus der Zwischenablage als JPG zu speichern, musst du eine externe Bibliothek verwenden, die das Bildformat unterstützt. Der oben angegebene VBA-Code speichert standardmäßig als BMP.

  • Größe des Bildes in Zelle A1 speichern: Ergänze den Code um folgende Zeile nach dem Speichern des Bildes:

Tabelle1.Cells(1, 1).Value = FileLen("C:\Test.bmp")

Damit wird die Dateigröße in Bytes in die Zelle A1 geschrieben.


Tipps für Profis

  • Optimierung der Bildgröße: Überlege, ob du das Bildkompressionsformat (z.B. JPG) nutzen möchtest, um Speicherplatz zu sparen. Das erfordert zusätzliche Programmierung oder die Nutzung von externen DLLs.

  • Automatisierung: Du kannst die Speicherung von Bildern aus der Zwischenablage automatisieren, indem du das Makro in regelmäßigen Abständen ausführst.


FAQ: Häufige Fragen

1. Kann ich das Bild auch in einem anderen Format speichern?
Ja, das Standardformat ist BMP. Um in ein anderes Format zu speichern, benötigst du zusätzliche Bibliotheken oder Tools.

2. Wie kann ich die Größe des gespeicherten Bildes anpassen?
Das Bild wird im Originalformat gespeichert. Um die Größe zu ändern, musst du das Bild nach dem Speichern mit einer Bildbearbeitungssoftware bearbeiten oder entsprechende Programmierung in VBA hinzufügen.

3. Ist die Nutzung von VBA sicher?
Ja, solange du VBA-Code von vertrauenswürdigen Quellen verwendest. Achte darauf, beim Download von externem Code vorsichtig zu sein.

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