2015-07-23 4 views
0

У меня есть функция PowerPoint VBA, которая открывает презентации, копирует слайды в активную презентацию, а затем закрывает исходную презентацию. Он отлично работал в 2010 году, но не смог в 2013 году (все в Windows 7), если он пытается открыть одну и ту же презентацию более одного раза. Мне кажется, что после выдачи команды presentation.close окно закрывается, но файл остается заблокированным до тех пор, пока код VBA не завершится. Поэтому, если код пытается снова открыть этот файл, он возвращает ошибку: «Метод« Открыть »объекта« Презентации не удались »Макрос PowerPoint 2013 сохраняет файл открытым после закрытия команды

Вот упрощенная форма функции, которую я запускаю, которая ведет себя одинаково. В PowerPoint 2010 у меня был тест коллеги, и он работает нормально. У меня также есть коллега, проверяющий его в 2013 году, чтобы убедиться, что это не что-то с моей конкретной установкой.

Sub testopen() 

Dim ppFile As Presentation 
Dim i As Integer 

Const fpath = "C:\test.pptx" 

For i = 1 To 2 
    Set ppFile = Application.Presentations.Open(fpath) 
    ppFile.Close 
    Set ppFile = Nothing 
Next i 

End Sub 

Файл test.pptx - это просто пустая презентация. В режиме отладки я вижу, что файл открывается и закрывается в первом цикле, затем во втором цикле команда open завершается с ошибкой, и я вижу в проводнике Windows, что скрытый временный файл все еще существует, показывая, что файл все еще открыт, пока я не выйду код VBA. Я также проверил, что файл открыт, добавив функцию для проверки статуса открытия файла.

Я потратил, вероятно, час на поиски в googling и не могу найти никаких других описаний этой проблемы. Я уверен, что смогу реализовать обходной путь, но это сводит меня с ума, что я не могу найти никаких других сообщений о кажущейся такой простой проблеме. Любые предложения приветствуются! Благодарю.

+0

Это может произойти, если файл, который вы открываете, находится в папке, которая синхронизирована ... т.е. папке с Dropbox и т.п. –

+0

Эй Стив, я могу воспроизвести это с любой презентацией в любой папке с PPT 2013/2016. Похож на ошибку. –

+0

The Presentations.Count по-прежнему показывает, что файл открыт без Windows. Если вызывается NewWindow, он откроет окно презентации. –

ответ

0

Установка файла в режиме «Только для чтения» устраняет проблему. Команда открытия теперь:

Set ppFile = Application.Presentations.Open(fpath, msoTrue) 

Кроме того, сохранение файла перед его закрытием разрешило проблему. Для этого добавьте:

ppFile.Save 

Интересно, что я уже попытался установить свойство сохраненного в True (ppFile.Saved = msoTrue), который не работает. Спасибо Майклу за его предложение по сценарию VBS. Это работает, и я никогда не запускал внешний скрипт VBS, поэтому я узнал что-то новое. В этом случае я предпочел бы придерживаться решения VBA.

0

Лучший способ, которым я достиг этого, - просто создать файл VBS и в файле VBS вызывать нужный код VBA. Это немного больше хлопот, чем написать код VBA, но это решение, которое сработало для меня.

Например, в файле VBS:

Dim args, objPP 

Set args = WScript.Arguments 
Set objPP = CreateObject("Powerpoint.Application") 

objPP.Open "C:\path\to\file.ppx" 
objPP.Visible = True 

objPP.Run "The_Macro" 

objPP.Save 
objPP.Close(0) 
objPP.Quit 

Или еще лучше, иметь весь код в файл VBS и иметь его скопировать нужные слайды.

Надеюсь, это поможет вам достичь вашего результата.

+0

Это работало для меня, но я бы подумал, что это скорее обходное решение, чем решение. Я тоже спросил об этом в другом месте, и это лучшее предложение, которое я получил. Я дам ему еще один-два дня, чтобы другие ответили и приняли это как решение, если я не могу придумать строгое решение на основе VBA. Благодаря! –