2016-05-05 2 views
0

Я думаю, это просто, но, поскольку я очень новичок в VBA, я не могу понять это.Открывая внешние .pptx и .xlsx один раз и запуская несколько подпрограмм на них

У меня есть код, который был предназначен для копирования данных из третьей таблицы Excel и вставки его в несколько графиков презентации Power Point.

Этот мир кода выше открывает презентацию Power Point и электронную таблицу Excel. dir_pptx и dir_xlsx - соответствующие пути к файлам.

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

Дело в том, что этот процесс делится на ~ 6 независимых сабвуферов (и это должно быть, как это, я не хочу, чтобы изменить его), так что каждый раз, когда я должен обновить презентацию, я должен запустить sub1, сохранить/закрыть оба .pptx и .xlsx файлы, запускать sub2, сохранить/закрыть, запустить sub3, сохранить/закрыть и так далее, потому что в противном случае sub2 снова открывает файлы и обновлять его, отменив изменения я уже сделанные в sub1.

Мой вопрос: как изменить этот код для первой проверки, если файлы уже открыты, и 1. Если это не так, откройте его; 2. Если это так, не открывайте его снова и не используйте процедуру, использующую их.

ответ

0

Эти объекты верхнего уровня не сохраняются в коллекции автоматически (в отличие, скажем, все объекты Worksheet находятся в листе коллекций).

Вы можете создавать и поддерживать свой собственный набор объектов и использовать их позже ...

(непроверенные) расширение фрагмент кода будет выглядеть следующим образом ...

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 

В других частях кода, когда файл закрыт и приложение завершено, вам нужно будет использовать метод коллекции .Remove.

0

Другой подход: (Внимание: AirCode впереди)

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 

Затем используется вызов функции, а не обращаясь непосредственно к объектной переменной, которая содержит презентацию.

+0

Спасибо @SteveRindsberg. Это похоже на то, что я хочу, но, к сожалению, это не работает. Когда я запустил sub 2, pptx снова был открыт как файл только для чтения, как моя текущая проблема. – AYJK

+0

Какой синтаксис вы использовали? Set objPresentation = PresentationObject в вашей основной подпрограмме - это то, что должно работать. –

+0

Правда, может быть, я ничего не поймаю. Это то, что я делаю: 'Sub1': 1. Ваш код + xlsx, который я упоминаю в своем вопросе 2. Процедуры копирования/вставки, активирующие файлы xlsx и pptx с помощью' Workbooks (xlsx_name). Таблицы (1). Активировать '' Установить ObjSlide = ObjPresentation.Slides (slds (i)) '3. End sub. Для следующих подсистем процесс практически такой же. – AYJK

Смежные вопросы