Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
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

Snipping-Tool aus Excel steuern mit VBA

Snipping-Tool aus Excel steuern mit VBA
28.08.2023 20:38:21
Peter Kloßek
Liebe Excel-Gemeinde,

ich versuche, einen Teil des Excel-Arbeitsblattes in eine PowerPoint-Folie zu kopieren. Nach vielen Versuchen habe ich herausgefunden, dass dies ganz problemlos mit dem Snipping-Tool klappt - natürlich nur händisch, ohne VBA. Meine Frage: Hat jemand eine Idee, den Ausschnitt einer Excel-Tabelle per VBA mit dem Snipping-Tool aus Excel heraus in den Zwischenspeicher zu befördern? Das Einfügen in die Folie geht ganz einfach mit SendKeys ^V. Die Kopierfunktion von Excel nutzt mir leider nichts, da dies zu Chaos in der PowerPoint-Folie führt. Auch wenn man eine Excel-Tabelle in die Folie einbettet, kommt es zu Problemen, z. B. mag PowerPoint gewisse Formeln nicht. Außerdem ist die Handhabung kompliziert, und das Schlimmste: Die PowerPoint-Datei wird fürchterlich an Volumen dadurch aufgebläht (mit einigen Folien läßt sie sich nicht mal mehr als E-Mail-Anhang versenden!). Man müsste einen Bereich auf dem Arbeitsblatt angeben können, der dann vom Snipping-Tool übertragen wird. Vielen Dank im Voraus für Eure Vorschläge. Eine Musterdatei stelle ich nicht bei, da hier keine Excel-Funktionen - bis auf die Übergabe an Snipping-Tool - zur Debatte stehen.

Mit freundlichem Gruß
Peter Kloßek

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Snipping-Tool aus Excel steuern mit VBA
28.08.2023 23:19:44
volti
Hallo Peter,

für die Steuerung des Snippingtools per VBA habe ich gerade keine Lösung oder finde sie gerade nicht.
Falls auch niemand anderes hier helfen kann, nachfolgend mal ein Lösungsansatz, mit dem man Bildschirmausschnitte in die Zwischenablage kopieren kann.

Die Sub CopyScreen kopiert den Bereich mit den angegebenen Koordinaten in die Zwischenablage.

Falls diese Koordinaten einmal händisch ermittelt wurden, ist das Problem damit schon gelöst, auch innerhalb von Excel kann ein fester Bereich schon angegeben werden. Bei Verschiebung von Excel werden diese automatisch umgerechnet.
Die Angabe eines Range sollte auch funktionieren.
Um einen Bereich mittels Mausclick festlegen zu können, bedarf es noch einer entsprechenden Programmierung. Da würde ich noch eine gewisse Zeit für benötigen, wenn gewünscht.
Ansonsten, teste es einfach mal aus.....

Option Explicit

' Einen Bildausschnitt vom Desktop in die Zwischenablage kopieren
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As LongPtr) As LongPtr
Private Declare PtrSafe Function CreateCompatibleBitmap Lib "gdi32" ( _
ByVal hdc As LongPtr, ByVal nWidth As Long, ByVal nHeight As Long) As LongPtr
Private Declare PtrSafe Function SelectObject Lib "gdi32" ( _
ByVal hdc As LongPtr, ByVal hObject As LongPtr) As LongPtr
Private Declare PtrSafe Function BitBlt Lib "gdi32" (ByVal hDestDC As LongPtr, _
ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As LongPtr, ByVal xSrc As Long, _
ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare PtrSafe Function DeleteDC Lib "gdi32" (ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function ReleaseDC Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal hdc As LongPtr) As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Declare PtrSafe Function SetClipboardData Lib "user32" ( _
ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function ClientToScreen Lib "user32" ( _
ByVal hwnd As LongPtr, lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Const SRCCOPY = &HCC0020

Sub CopyScreen(Left As Long, Top As Long, Width As Long, Height As Long)
' Sub kopiert einen Bildschirmausschnitt in die Zwischenablage, KHV 2012
Dim srcDC As LongPtr, trgDC As LongPtr, hBMP As LongPtr, hwnd As LongPtr, Farbe As Long

srcDC = GetDC(GetDesktopWindow())
trgDC = CreateCompatibleDC(srcDC) ' Device Context erstellen
hBMP = CreateCompatibleBitmap(srcDC, Width, Height) ' Bildausschnitt zuordnen
SelectObject trgDC, hBMP ' Bild auswählen
BitBlt trgDC, 0, 0, Width, Height, srcDC, Left, Top, SRCCOPY ' Pixel kopieren
OpenClipboard 0&: EmptyClipboard ' Zwischenablage öffnen
SetClipboardData 2, hBMP: CloseClipboard ' Bild rein und Zwischenablage schließen
DeleteDC trgDC: ReleaseDC hBMP, srcDC ' Device Context schließen
End Sub


' ################ Aufrufmöglichkeiten #################
Sub KopiereBildausschittAbsolut()
' Angabe von Direktkoordinaten absolut
CopyScreen 100, 100, 800, 800
End Sub

Sub KopiereBildausschittExcel()
' Angabe von Direktkoordinaten im Excelfenster
' Koordinaten werden von Excel auf den Bildschirm umgerechnet
Dim PT As POINTAPI

PT.x = 10: PT.y = 10
ClientToScreen Application.hwnd, PT
SetForegroundWindow Application.hwnd
CopyScreen PT.x, PT.y, 800, 800
End Sub


Sub KopiereBildausschittMousePos()
' Angabe von der Koordinaten per Mausposition
' Koordinaten werden von Excel auf den Bildschirm umgerechnet
Dim PT As POINTAPI

GetCursorPos PT
ClientToScreen Application.hwnd, PT
SetForegroundWindow Application.hwnd
CopyScreen PT.x, PT.y, 800, 800
End Sub


Sub KopiereBildausschittBereich()
' Angabe von der Koordinaten per Mausposition
' Koordinaten werden von Excel auf den Bildschirm umgerechnet
Dim PT1 As POINTAPI, PT2 As POINTAPI

With ActiveWindow
PT1.x = .PointsToScreenPixelsX(Range("B11").Left)
PT1.y = .PointsToScreenPixelsY(Range("B11").Top)
PT2.x = .PointsToScreenPixelsX(Range("G88").Left) - PT1.x
PT2.y = .PointsToScreenPixelsY(Range("G88").Top) - PT1.y
End With
SetForegroundWindow Application.hwnd
CopyScreen PT1.x, PT1.y, PT2.x, PT2.y
End Sub


Gruß
Karl-Heinz

Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 02:21:41
Peter Kloßek
Hallo Karl-Heinz,

danke für Deinen Lösungsvorschlag. Ich sehe viele Deklarationen, jedoch keine Function für "CopyScreen". Ich habe mal den ganz kurzen Sub getestet und bekam sofort die Fehlermeldung "keine Funktion vorhanden". Ich habe jetzt aber noch einen Beitrag von Martin Beck in Herbers Forum gefunden - nur ganz wenige Befehle - und es funktioniert.

Hallo Swen,

Sub Foto2()
Worksheets(1).Range("A1:D7").CopyPicture Appearance:=xlScreen, Format:=xlBitmap
Worksheets(2).Paste Destination:=Worksheets(2).Cells(1, 1)
End Sub

kopiert den Bereich A1:D7 aus der ersten Tabelle als Graphik in die zweite Tabelle.
Gruß
Martin Beck

Für mich kommt eigentlich nur die 1. Zeile in Frage, die Einfügung geht ganz einfach mit SendKeys ^v.

Mit freundlichem Gruß
Peter Kloßek

Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 08:53:50
volti
Hallo Peter,

das Thema ist ja erfolgreich abgeschlossen, das ist gut.

Die von mir vorgeschlagene Lösung kopiert analog eines Snippingtools einen Bildschirmbereich in die Zwischenablage.
Der Bereich ist dabei völlig unabhängig von Fenstern und Objekten.

Die hier im Forum vorgeschlagenen, gängigen Kopiermethoden kopieren markierte Objekte oder Excel-Bereiche, offensichtlich für Deine Belange ja auch gerade richtig.

Das Tool funktioniert unter 32/64-Bit (VBA7). Die Fehlermeldung "keine Funktion vorhanden" kann ich nicht nachvollziehen.

Einen schönen Tag noch
Karl-Heinz
Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 02:28:14
onur
Was für einem "Swen" antwortest du hier ?
"Gruß, Martin Beck " ? Häääääh ?
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 02:35:41
Peter Kloßek
Hallo onur,

ich habe den Beitrag von Martin Beck an Sven im Excel-Forum zitiert.

Mit freundlichem Gruß
Peter Kloßek
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 02:49:54
onur
Ziemlich dreist, mehrere Foren mit dem selben Problem zu beauftragen! Machst du das mit Taxis oder Pizzadiensten auch so?
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 06:12:52
Oberschlumpf
onur, zuerst zitiere ich dich: "Ziemlich dreist, mehrere Foren mit dem selben Problem zu beauftragen!"

jetzt zitiere ich Peter aus seinem Beitrag vom 29.08 um 02:21:41 Uhr: "Ich habe jetzt aber noch einen Beitrag von Martin Beck in Herbers Forum gefunden"

Los, Onur, komm und finde den, nee, nich den, sondern deinen Fehler....hahahahaha
Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 06:16:58
Oberschlumpf
schulligung, aber der musste raus
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 06:23:23
onur
Hast Recht, ich habe den Text offenbar nicht komplett gelesen,
Aber er hat offenbar auch meinen Beitrag noch nicht mal getestet, denn das ziteierte Makro ist fast das Selbe wie meine Lösung.
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 06:28:08
Oberschlumpf
Moin!

Jep, stimmt, deine Idee ist sehr ähnlich...hatte ich auch erst später gesehen.

Ciao
Thorsten
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 06:30:41
Oberschlumpf
na ja, aber er hatte dir ja doch noch geantwortet...und wieso er deine Idee nich getestet hat = vielleicht war er zu intensiv mit Suche nach der "Martin-Idee" beschäftigt
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 07:02:28
Peter Kloßek
Guten Morgen onur,

ich war längere Zeit mit dem Vorschlag von volti beschäftigt und der Suche im Internet. Erst eine ganze Weile später ging ich wieder in das aktualisierte Excel-Forum. Zu diesem Zeitpunkt hatte ich die Lösung, so dass ein Test Deiner Lösung nicht mehr erforderlich war. Nochmals vielen Dank für Deine Antwort und noch einen schönen Tag.

Mit freundlichem Gruß
Peter Kloßek
Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 01:01:40
onur
Wieso nicht ohne "Snipping Tool"?
SO kannst du z.B. einen bestimmten Bereich als Bild kopieren und woanders einfügen:
Private Sub CommandButton1_Click()

Dim rngImage
Set rngImage = Range("A1:I10")
rngImage.CopyPicture Appearance:=xlScreen, Format:=xlPicture
Range("J1").PasteSpecial
End Sub
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 01:10:24
Daniel
Hi

Wenn's nicht verlinkt sein muss:

Zellbereich kopieren und mit Inhalte einfügen als Grafik/Bildkopie einfügen.
Das Bild kannst du dann kopieren und in PP einfügen.
Der Recorder ist dein Freund.

Gruß Daniel
Anzeige
Snipping-Tool aus Excel steuern mit VBA
29.08.2023 02:30:49
Peter Kloßek
Hallo Onur und Daniel,

danke für Eure Beiträge. Ich habe inzwischen auch im Internet eine Lösung gefunden. Vergl. meine Nachricht an volti (Karl-Heinz). Damit ist das Thema erledigt.

Mit freundlichem Gruß
Peter Kloßek

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige