Anzeige
Archiv - Navigation
1932to1936
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

PNG kopieren und in PP-Präsi einfügen

PNG kopieren und in PP-Präsi einfügen
24.06.2023 19:20:55
bibo

Hallo Zusammen,

ich habe noch nie in ein Forum geschrieben, aber ich und ChatGPT wissen nicht mehr weiter. Habe keine große Ahnung vom Programmieren bis auf die zwei Vorlesungen im Ingenieursstudium und nutze VBA immer in Kombination mit Internet-Seiten und ChatGPT.

Ich versuche einen bestimmten Tabellenabschnitt aus einer geöffneten Excel Arbeitsmappe zu kopieren (.CopyPicture) und diesen dann als png in eine geöffnete PowerPoint Datei auf einer bestimmten Folie einzufügen. Der Vorgang klappt auch regelmäßig, jedoch wird mir manchmal (ohne für mich erkennbare Regelmäßigkeit) eine Fehlermeldung entweder in Bezug auf das Einfügen des Bildes aus dem Zwischenspeicher oder (seltener) hinsichtlich des kopiervorgangs angezeigt. Wenn man dann, nach dem Klick auf "Debuggen" einfach wieder auf das "Play"-Symbol im VBA Editor klickt, läuft das Programm meist ohne Probleme weiter.

Der problematische Code:

ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlBitmap
pptSlideNum.Shapes.PasteSpecial DataType:=ppPastePNG

(pptSlideNum ist ist die vorher definierte Powerpoint Folie)

Habe es schon auf viele unterschiedliche Wege versucht, aber der Code hat bisher am besten funktioniert

Die Fehelrmeldung lautet: Laufzeitfehler '-2147188160 (80048240)':
Slide.Paste : Invalid request. Clipboard is empty or contains data which may not be pasted here.

Der Code ist eine Logik eingebettet, die variabel je nach dem wie viele Zeilen die zu kopierende Tabelle hat, neue PowerPoint Folien erzeugt und immer 19 Zeilen der Tabelle nacheinander kopiert und auf die neu erzeugten PowerPoint Folien einfügt. Der "problematische" Code kommt demnach in verschiedenen If abfragen und Schleifen öfter vor.

Ich habe leider keine Ahnung mehr wie ich das Problem lösen kann.

Ich hoffe hier kann mir jemand weiterhelfen

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PNG kopieren und in PP-Präsi einfügen
24.06.2023 19:39:09
Ulf
Hi
kann mir gut vorstellen, dass dein Code schneller arbeitet, als das System Zeit hat um die Grafik zu erstellen/wandeln/in Zwischenablage zu stellen
testweise könntest du nach jedem Vorgang das Clipboard mit Code wie diesem 'löschen'

Option Explicit
Public Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As LongPtr
Public Declare PtrSafe Function EmptyClipboard Lib "user32" () As LongPtr
Public Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr

Public Function ClearClipboard()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Function

Sub deineRoutine()
'....
ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlBitmap
pptSlideNum.Shapes.PasteSpecial DataType:=ppPastePNG
    Call ClearClipboard
'....
'evtl Abfragen, ob leer mit Paste in Excel bspw
End Sub
hth


Anzeige
AW: PNG kopieren.. weitere Vorschläge
24.06.2023 23:53:03
Ulf
Die Deklarationen sollten besser so aussehen

Public Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Public Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Public Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Public Function ClearClipboard() As Boolean
    On Local Error Resume Next
    Dim lngRet As Long
    lngRet = 0
    lngRet = OpenClipboard(lngRet)
    If lngRet = 1 Then
        lngRet = lngRet Or EmptyClipboard()
        lngRet = lngRet Or CloseClipboard()
    End If
    ClearClipboard = lngRet = 1
End Function
und statt
ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlBitmap
pptSlideNum.Shapes.PasteSpecial DataType:=ppPastePNG
würde ich bei gleichem Ergebnis (skalierbar ohne grössere Artefakte inPP)
ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlPicture
pptSlideNum.Shapes.PasteSpecial
verwenden, vorausgesetzt du willst die Bilder in PP nicht als PNG speichern, Windoof verwendet bei o.a. Vorgehensweise intern EMF, was enorm Speicher spart, optisch gleichwertig und ebenso skalierbar ist. Have it a try
biba


Anzeige
AW: PNG kopieren.. weitere Vorschläge
25.06.2023 12:02:54
Bibo
Hallo Ulf,

vielen Dank für die schnelle Rückmeldung. Damit hätte ich so schnell nicht gerechnet.

Ich habe deine Lösung schon ausprobiert. Dabei habe ich den oberen Block (Option Explicit ... End Function) in ein eigenes Modul eingefügt und " Call ClearClipboard" entsprechend deiner Darstellung in den bestehenden Code unter alle "Copy Paste" Anweisungen eingefügt. Ich hoffe das war so richtig.

Leider tritt der Fehler immer noch auf. Dazu noch eine Information: Ich habe vor den beiden gegebenen Zeilen noch den Code "Application.CutCopyMode = False" eingefügt in der Hoffnung, dass der Zwischenspeicher geleert wird. Das hat jedoch auch nicht geholfen, den Fehler zu vermeiden. Vielleicht verursacht das irgendwelche Probleme...
Müsste deine Function "ClearClipboard" nicht eigentlich vor den beiden Zeilen anstatt danach ausgeführt werden?

Für eine weitere Rückmeldung wäre ich dankbar.

Gruß
Bibo


Anzeige
AW: PNG kopieren.. weitere Vorschläge
25.06.2023 14:21:30
Ulf
Hi Bibo
zum Kopieren würde ich zuerst testen:
1

ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlPicture
pptSlideNum.Shapes.PasteSpecial
Call ClearClipboard
DoEvents:DoEvents
2

Call ClearClipboard
DoEvents:DoEvents
ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlPicture
pptSlideNum.Shapes.PasteSpecial
3

ActiveWorkbook.Sheets("Name des Sheets").Range("Zellebereich der kopiert werden soll").CopyPicture Appearance:=xlScreen, Format:=xlPicture
pptSlideNum.Shapes.PasteSpecial
dim i as long
Call ClearClipboard
for i= 0 to 10000
    DoEvents
next
4
Taskmanager öffnen, den Code nach CopyPicture unterbrechen (Stop) und den verfügbaren Speicher überprüfen, es sei denn du hast eine i7 mit 16+GB RAM
hth
Bitte Rückmeldung


Anzeige
AW: PNG kopieren.. weitere Vorschläge
25.06.2023 17:11:08
Bibo
Hallo Ulf,

auch dir nochmals danke für die Rückmeldung.

Deine Vorschläge habe ich alle ausprobiert. Leider sind die Fehlermeldungen trotzdem aufgetreten. Die Arbeitsspeicherauslastung war immer relativ gering. (Laptop hat einen i5-Prozessor und 8GB RAM)

Ich habe eine Kombination aus den Vorschlägen von dir und Karl-Heinz ausprobiert.



 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                
                
         
           On Error Resume Next
              Do
                 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                 If Err.Number = 0 Then Exit Do
                 Err.Clear
              Loop
                       
               
            
           On Error Resume Next


              Do
                  pptSlideNum.Shapes.PasteSpecial
                  If Err.Number = 0 Then Exit Do
                  Err.Clear
               Loop
'
                
      Call ClearClipboard
                
      For i = 0 To 10000
      DoEvents
      Next

  
Habe diesen Code 3 mal ohne Fehlerauftreten durchführen können. Ich weiß nicht, ob er jetzt behoben ist aber das kann man ja bei diesem unregelmäßig auftretenden Problem wohl nie wirklich sagen.

Ich danke euch vielmals für die Hilfe. Falls die Fehler erneut auftreten melde ich mich hier nochmal.
Die Experten haben ChatGPT, dann doch noch einiges voraus.

Mit besten Grüßen
Bibo


Anzeige
AW: PNG kopieren.. weitere Vorschläge
25.06.2023 20:29:10
Ulf
thx für die Rückmeldung, unbedacht bisher (und würde ich so einstellen, wenn man das Clipboard nur in normalem Umfang nutzt):

hth
Ulf


AW: PNG kopieren und in PP-Präsi einfügen
24.06.2023 21:34:03
volti
Hallo Bibo,

das Kopieren via CopyPicture hat manchmal Probleme (kenne ich von Mailerstellung). Könnte hier auch sein, probiere daher mal u.a. Code aus.

Falls das Clipboard-Löschen (Ulf's Vorschlag) und dieses nicht hilft, gäbe es noch die Möglichkeit, das Clipboard vor dem Einfügen auf den richtigen Inhalt zu prüfen.
Stichwort: IsClipboardFormatAvailable
Dann kannst Du Dich ja nochmal melden.

Code:


On Error Resume Next Do ActiveWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture _ Appearance:=xlScreen, Format:=xlBitmap WSh2.Range(sBer).CopyPicture Appearance:=xlScreen, Format:=xlBitmap If Err.Number = 0 Then Exit Do Err.Clear Loop pptSlideNum.Shapes.PasteSpecial DataType:=ppPastePNG

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz



Anzeige
AW: PNG kopieren und in PP-Präsi einfügen
25.06.2023 12:22:23
Bibo
Hallo Karl-Heinz,

besten Dank für die schnelle Rückmeldung.

Wozu ist die Zeile " WSh2.Range(sBer).CopyPicture Appearance:=xlScreen, Format:=xlBitmap" zuständig? Das verstehe ich nicht so ganz.

Ich hoffe du kannst mir da noch einen Tipp geben.

Gruß
Bibo


AW: PNG kopieren und in PP-Präsi einfügen
25.06.2023 14:01:13
Bibo
Hallo nochmal,

ich habe deinen Code wie folgt eingefügt:

 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture

 On Error Resume Next
    Do
       excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
              If Err.Number = 0 Then Exit Do
              Err.Clear
    Loop
    pptSlideNum.Shapes.PasteSpecial
Nun wird keine Fehlermeldung mehr ausgegeben, jedoch wird (ohne erkennbare Regelmäßigkeit) einfach auf manchen Folien kein Bild eingefügt. Vermutlich sind das diejenigen Bilder bei denen im "Copy Paste" Vorgang eine Fehlermeldung auftreten würde.
Habe ich den Code vielleicht falsch implementiert? Müsste man die " pptSlideNum.Shapes.PasteSpecial"- Anweisung vielleicht in den Loop schreiben?

Außerdem habe ich das Folgendes ausprobiert, was aber leider auch zu den selben Ergebnissen führt:

 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                   
                     On Error Resume Next

                        Do
                          excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                           If Err.Number = 0 Then Exit Do
                           Err.Clear
                        Loop
                        
                        pptSlideNum.Shapes.PasteSpecial
    
                   On Error Resume Next
                   
                   If Err.Number > 0 Then
                        Do
                            pptSlideNum.Shapes.PasteSpecial
                           If Err.Number = 0 Then Exit Do
                           Err.Clear
                        Loop
                    End If
Über eine Rückmeldung würde ich mich freuen.

Mit besten Grüßen
Bibo


Anzeige
AW: PNG kopieren und in PP-Präsi einfügen
25.06.2023 15:29:08
volti
Hallo Bibo,

sorry, ich hatte beim Kopieren meines Musters vergessen, einen Teil meines eigenen Codes herauszunehmen.
Aber Du hast es ja dann erkannt, dass es doppelt war.

Es geht hier eigentlich nur darum, einen evtl. auftretenden Fehler beim Kopieren abzufangen. Dazu wird der Kopierbefehl einfach in die Fehlerschleife eingebettet.
Der Kopierbefehl gehört dann natürlich nur einmalig in die Do-Schleife, den vor der Schleife kannst Du weglassen.

Beim Einfügen hast Du diese Fehlerschleife noch mal eingebaut. Ich denke, hier ist es nicht sinnvoll.
Warum kein Bild eingefügt wird, kann ich nicht sagen.

Probiere doch mal mit folgendem Code, was die Funktion bei den einzelnen Kopiervorgängen ausspuckt und ob bei leerer Zwischenablage eine evtl. Wiederholung helfen würde.
Wenn die Zwiscehnablage nicht leer ist, aber trotzdem kein Bild kommt, ist es u.U. ein anderes Problem. Ansonsten ist es schwierig per Ferndiagnose das herauszufinden.

BTW: "Application.CutCopyMode = False" leert ja auch die Zwischenablage, ist aber m.E. an Excel gebunden, so als würde ich "OpenCliboard Application.hwnd" machen.
Ob's 'nen Unterschied macht oder die Leerung überhaupt notwendig ist, kann ich nicht beurteilen. Ich kopiere meist ohne vorherige Leerung.

Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" ( _
        ByVal wFormat As Long) As Long

Sub test()
'  OpenClipboard 0& ' ggf. Application.hwnd
'  EmptyClipboard
'  CloseClipboard
  
  On Error Resume Next
  Do
     excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
     If Err.Number = 0 Then Exit Do
     Err.Clear
  Loop
  If IsClipboardFormatAvailable(3) > 0 Then 'Text=1, xlBitMap=2, xlPicture=3
     pptSlideNum.Shapes.PasteSpecial
  Else
     MsgBox "nix Picture in Clipboard"
  End If
End Sub
Gruß KH


Anzeige
AW: PNG kopieren und in PP-Präsi einfügen
25.06.2023 17:07:50
Bibo
Hallo Karl Heinz,

nochmals danke für die Rückmeldung.

Ich habe eine Kombination aus den Vorschlägen von dir und Ulf ausprobiert.



 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                
                
         
           On Error Resume Next
              Do
                 excelWorkbook.Sheets("Sheet").Range("Kopierbereich").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                 If Err.Number = 0 Then Exit Do
                 Err.Clear
              Loop
                       
               
            
           On Error Resume Next


              Do
                  pptSlideNum.Shapes.PasteSpecial
                  If Err.Number = 0 Then Exit Do
                  Err.Clear
               Loop
'
                
      Call ClearClipboard
                
      For i = 0 To 10000
      DoEvents
      Next

  
Habe diesen Code 3 mal ohne Fehlerauftreten durchführen können. Ich weiß nicht, ob er jetzt behoben ist aber das kann man ja bei diesem unregelmäßig auftretenden Problem wohl nie wirklich sagen.

Ich danke euch vielmals für die Hilfe. Falls die Fehler erneut auftreten melde ich mich hier nochmal.
Die Experten haben ChatGPT, dann doch noch einiges voraus.

Mit besten Grüßen
Bibo

Anzeige

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige