【问题标题】:VBA from Ribbon in PowerPoint only works once after using SaveAs / SaveCopyAsPowerPoint 中功能区中的 VBA 仅在使用 SaveAs / SaveCopyAs 后工作一次
【发布时间】:2015-02-03 01:01:44
【问题描述】:

我的 PowerPoint 功能区出现异常行为。

我创建了一个带有功能区的 pptm 文件,用于快速链接到 2 个 vba 代码。 一种是将数据从 xls 文件复制到图表。另一种是将演示文稿的副本另存为 pptx 文件和 pdf 文件 (savecopyas),并使用 Outlook 发送电子邮件。

只要我只保存 pdf 文件,一切都会顺利进行。如果我还创建了 pptx 文件(或其他命名的 pptm 文件),则 vba 脚本仅在第一次运行 - 之后两个操作的功能区不再工作。提示找不到vba代码。

我经历了什么?

1) 只要未启动电子邮件代码,xls 代码就可以按您喜欢的频率运行。

2) 没有警告说 pptx 文件将不再包含任何 vba 代码(这就是 Excel 会告诉你的)

3) 如果我添加将 pptm 保存为 pptx 的最后一行,则模块将保留在 pptx 中,直到它关闭。在这种 pptx 文件的情况下,功能区命令可以正常工作 - 只要您愿意。

4) 从一个按钮手动启动 pptm 中的电子邮件 vba 代码始终运行顺畅,无论启动频率如何。

我在网上只发现了 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 = "test@gmail.com"
 .Subject = "Test"
 .Body = "Hallo "
 .Attachments.Add Send_2
 .Attachments.Add Send_1
 .Send
End With

Set olApp = Nothing

End Sub

【问题讨论】:

    标签: vba error-handling powerpoint ribbon save-as


    【解决方案1】:

    如果您希望 VBA 宏工作,您需要以 .pptm(启用宏)格式保存演示文稿。默认情况下,pptx 没有/运行 VBA 代码。

    【讨论】:

    • @Eugene 所说的。而且由于您是通过代码而不是用户活动来保存 PPTX,它不会询问您是要保存为 PPTM 还是丢失代码,它只是按照您的指示去做。你是程序员;您应该知道保存为 PPTX 将删除代码。
    • @Steve,抱歉不准确,我想要一份没有宏的活动演示文稿的副本。因此我使用 SaveCopyAs。活动演示文稿保留带有宏的原始 pptm 文件。问题是:为什么功能区不再工作了? SaveAs pptx 只是一种尝试——让我感到困惑的是,功能区仍然在工作。
    • “为什么功能区不再工作了?SaveAs pptx 只是一种尝试 - 让我感到困惑的是功能区然后继续工作”这让我很困惑,@Mario。功能区不再工作,但功能区仍在工作? ;-) 但我可能见过这样的事情:您将带有宏的演示文稿保存为 PPTX,但宏继续起作用;在这种情况下,因为内存中的内容是原始的 PPTM,尽管 PPT 现在称它为 PPTX。但是,当您关闭然后重新打开 PPTX 时,宏将停止工作。
    • 顺便说一下,将代码作为插件 (PPAM) 分发可能会更好。
    • @Steve 如果我使用功能区上方的代码,它将第一次工作。电子邮件已发送,我打开了带有原始未更改 pptm 文件的 PPT。但是,如果我再次单击功能区图标,我会收到一条错误消息,并且只能手动启动宏。如果我在使用功能区启动宏后添加带有 saveas 功能的最后一行并打开一个 pptx 文件,那么我可以使用功能区并一遍又一遍地启动宏 - 这对我来说是不合逻辑的。
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多