VBA с ленты в PowerPoint работает только один раз после использования SaveAs/SaveCopyAs

У меня странное поведение ленты PowerPoint.

Я создал файл pptm с лентой для быстрой ссылки на 2 кода vba. Один из них — копирование данных из xls-файла на график. Другой сохраняет копию презентации в виде файла pptx и файла pdf (savecopyas) и отправляет электронное письмо с Outlook.

Все работает гладко, пока я сохраняю только файл PDF. Если я также создаю файл pptx (или файл pptm с другим именем), сценарий vba запускается только в первый раз, после чего лента для обоих действий больше не работает. Выдает ошибку о том, что код vba не найден.

Что я испытал?

1) xls-код запускается сколько угодно раз, пока не запущен email-код.

2) Нет предупреждения о том, что файл pptx больше не будет содержать никакого кода vba (это то, что вам скажет Excel)

3) Если я добавлю последнюю строку, которая сохраняет pptm как pptx, модули сохранятся в pptx, пока он не будет закрыт. Команды ленты работают правильно в этом случае файла pptx - так часто, как вам нравится.

4) Запуск кода электронной почты vba в pptm вручную с кнопки работает все время гладко, независимо от того, как часто он запускается.

Я нашел только 2-3 похожих вопроса/ошибки в Интернете без объяснений или только обходные пути.

Есть ли кто-нибудь, кто может объяснить и помочь мне в этом странном поведении?

С уважением,

Марио

Вот код:

Sub Email(ByVal control As IRibbonControl)

Dim Send_Email, olApp As Object
Dim Send_1, Send_2 As String

With ActivePresentation
.SaveCopyAs _
    FileName:=ActivePresentation.Path & "\" & "Test" & ".pptx", _
    FileFormat:=ppSaveAsOpenXMLPresentation
End With

With ActivePresentation
.SaveCopyAs _
    FileName:=ActivePresentation.Path & "\" & "Test" & ".pdf", _
    FileFormat:=ppSaveAsPDF
End With

Send_1 = ActivePresentation.Path & "\" & "Test" & ".pptx"
Send_2 = ActivePresentation.Path & "\" & "Test" & ".pdf"

Set olApp = CreateObject("Outlook.Application")

Set Send_Email = olApp.CreateItem(0)

With Send_Email
 .To = "[email protected]"
 .Subject = "Test"
 .Body = "Hallo "
 .Attachments.Add Send_2
 .Attachments.Add Send_1
 .Send
End With

Set olApp = Nothing

End Sub

person Mario Hofer    schedule 04.12.2014    source источник


Ответы (1)


Если вы хотите, чтобы макрос VBA работал, вам нужно сохранить презентацию в формате .pptm (с поддержкой макросов). По умолчанию pptx не имеет/не запускает код VBA.

person Eugene Astafiev    schedule 05.12.2014
comment
Что сказал @Eugene. И поскольку вы сохраняете PPTX с помощью кода, а не действий пользователя, он не спрашивает вас, хотите ли вы сохранить как PPTM или потерять код, он просто делает то, что вы ему говорите. Вы программист; предполагается, что вы ЗНАЕТЕ, что сохранение в формате PPTX удалит код. - person Steve Rindsberg; 05.12.2014
comment
@Steve, извините за неточность, мне нужна копия активной презентации без макросов. Поэтому я использую SaveCopyAs. Активная презентация сохраняет исходный файл pptm с макросом. Вопрос: Почему лента больше не работает? Сохранить как pptx было просто попыткой — меня озадачивает то, что лента продолжает работать. - person Mario Hofer; 06.12.2014
comment
Почему лента больше не работает? Сохранить как pptx было просто попыткой - меня озадачивает то, что лента продолжает работать. Это меня смущает, @Mario. Лента больше не работает, но лента продолжает работать? ;-) Но я мог видеть что-то подобное: вы сохраняете презентацию с макросами как PPTX, но макросы продолжают работать; в данном случае, потому что в памяти находится исходный PPTM, хотя теперь PPT называет его PPTX. Однако макросы перестанут работать, когда вы закроете, а затем снова откроете PPTX. - person Steve Rindsberg; 06.12.2014
comment
Кстати, вам может быть гораздо лучше распространять свой код в виде надстройки (PPAM). - person Steve Rindsberg; 06.12.2014
comment
@Steve Если я использую код выше, лента будет работать с первого раза. Электронное письмо отправлено, и у меня открыт PPT с исходным неизмененным файлом pptm. Однако, если я снова нажму на значок ленты, я получу сообщение об ошибке и смогу запустить макрос только вручную. Если я добавлю последнюю строку с функцией сохранения и открою файл pptx после запуска макроса с лентой, тогда я смогу использовать ленту и запускать макрос снова и снова - и это нелогично для меня. - person Mario Hofer; 07.12.2014