2016-05-05 8 views
0

Ich denke, das ist eine einfache, aber da ich sehr neu in VBA bin, kann ich es nicht herausfinden.Öffnen von externen .pptx und .xlsx einmal und Ausführen mehrerer Unterprogramme auf ihnen

Ich habe einen Code, der entworfen wurde, um Daten aus einer dritten Excel-Tabelle zu kopieren und in mehrere Diagramme einer PowerPoint-Präsentation einzufügen.

Dieser Codecode oben öffnet die PowerPoint-Präsentation und die Excel-Tabelle. dir_pptx und dir_xlsx sind die entsprechenden Dateipfade.

Set ObjPPT = CreateObject("PowerPoint.Application") 
Set ObjPresentation = ObjPPT.Presentations.Open("" & dir_pptx & "") 
Workbooks.Open Filename:=dir_xlsx 

Der Punkt ist, dass dieser Prozess in ~ 6 unabhängige subs unterteilt ist (und es hat so sein, ich weiß nicht, es ändern wollen), so jedes Mal muss ich die Präsentation aktualisieren muss ich laufen sub1, speichern/schließen beide .pptx und .xlsx Dateien, führen sub2, speichern/schließen, laufen sub3, speichern/schließen und so weiter, weil sonst sub2 die Dateien erneut und aktualisiert sie sich öffnet, um die Änderungen zu verwerfen ich bereits in sub1 gemacht.

Meine Frage: wie diesen Code für die erste Überprüfung ändern, ob die Dateien bereits geöffnet sind und 1. Wenn sie nicht sind, öffnen Sie es; 2. Wenn dies der Fall ist, öffnen Sie sie nicht erneut und führen Sie die Routine mit diesen aus.

Antwort

0

Diese Top-Level-Objekte werden nicht automatisch in einer Sammlung verwaltet (anders als beispielsweise alle Worksheet-Objekte in den Auflistungsarbeitsblättern).

Sie können Ihre eigene Sammlung von Objekten aufzubauen und zu pflegen und sie später verwenden ...

(ungetestet) Erweiterung des Code-Schnipsel wie dieser ...

Set myObjCol = New Collection 

Set ObjPPT = Nothing 
For Each myObj In myObjCol 
    If myObj.Name = "Microsoft PowerPoint" Then 'Already have PPT 
     Set ObjPPT = myObj 
     Exit For 
    End If 
Next myObj 
If ObjPPT Is Nothing Then 
    Set ObjPPT = CreateObject("PowerPoint.Application") 'Create PPT 
    myObjCol.Add ObjPPT 
End If 

Set ObjPresentation = Nothing 
For Each myObj In myObjCol 
    If myObj.Name = Filename Then 'The file is already open 
     Set ObjPresentation = myObj 
     Exit For 
    End If 
Next myObj 
If ObjPresentation Is Nothing Then 'Open the file 
    Set ObjPresentation = ObjPPT.Presentations.Open(PathName & Filename) 
    myObjCol.Add ObjPresentation 
End If 

'... other code 

In anderen Teilen aussehen würde Wenn die Datei geschlossen und die Anwendung beendet wird, müssen Sie die Methode .Remove der Sammlung des Codes verwenden.

0

Ein anderer Ansatz: (Achtung: Aircode Ahead)

Function PresentationObject() as Object 

Dim objPPTApp as object 
Static objPresentation as Object 

If objPresentation is Nothing then 

Set objPPTApp = CreateObject("PowerPoint.Application") 
Set objPresentation = ObjPPTApp.Presentations.Open("" & dir_pptx & "") 

End if 

Set PresentationObject = objPresentation 

End Function 

Dann in Gebrauch ist, rufen Sie die Funktion und nicht direkt auf die Objektvariable bezieht, der die Präsentation enthält.

+0

Vielen Dank @SteveRindsberg. Es ist ziemlich wie ich will, aber leider funktioniert es nicht. Als ich unter 2 lief, wurde die PPTX wieder als "nur Lesen" Datei geöffnet, just wie mein aktuelles Problem. – AYJK

+0

Welche Syntax haben Sie damit verwendet? Legen Sie ObjPresentation = PresentationObject in Ihrer Hauptunterroutine fest, was funktionieren soll. –

+0

Stimmt, vielleicht fange ich nichts. Das ist was ich mache: 'Sub1': 1.Ihr Code + xlsx Opener, den ich in meiner Frage erwähne 2. Verfahren zum Kopieren/Einfügen von xlsx und pptx Dateien durch' Workbooks (xlsx_name) .Sheets (1). Aktiviere '' Setze ObjSlide = ObjPresentation.Slides (slds (i)) '3. End sub. Für die nächsten Subs ist der Prozess ziemlich gleich. – AYJK

Verwandte Themen