5

希望有人可以帮助我一些VBA代码。我使用 VBA 循环将 Excel 图表、文本框和表格粘贴到 Powerpoint 模板中。但是,因为我不能确定用户是否会安装 Powerpoint 对象库,所以我不能将 Dim PPTApp 用作 Powerpoint.Application 类型语法。

我使用对象。它工作得很好。除了一件:关闭Powerpoint。

代码:

Dim oPPTPres As Object  ' Late binding: This is a PowerPoint.Presentation but we cannot assume that the Microsoft PowerPoint 11 library will be loaded in the workbook that this module has been copied to.
Dim oPPTShape As Object ' Late binding: This is a PowerPoint.Shapebut we cannot assume that the Microsoft PowerPoint 11 library will be loaded in the workbook that this module has been copied to.


PPTFile = Range("PPTFile").value ' Read PowerPoint template file name
Set oPPTPres = GetObject(PPTFile): oPPTPres.Application.Visible = msoTrue ' Switch to or open template file

. . . .

strNewPresPath = Range("OutputFileName").value
oPPTPres.SaveAs strNewPresPath
' Range("PPTFile").value = strNewPresPath
ScreenUpdating = True
oPPTPres.Close 'Closes presentation but not Powerpoint
oPPTPres.Application.Quit 'No noticeable effect

活动演示文稿将关闭,但 Powerpoint 本身保持打开状态(没有打开文件窗口)。然后,因为它是打开的,所以当下一个运行时(我有一个循环将循环并连续执行许多这些构建),它会打开模板以及最新构建的 Powerpoint 文件,创建系统锁定问题。

有任何想法吗?

非常感谢您的帮助!

4

4 回答 4

6

我不完全确定您的代码为什么不起作用。我尝试oPPTPres = Nothing按照建议进行设置,但也没有用。但是,以下方式 PowerPoint 在我的计算机上关闭

Dim oPPTPres As Object  ' Late binding: This is a PowerPoint.Presentation but we cannot assume that the Microsoft PowerPoint 11 library will be loaded in the workbook that this module has been copied to.
Dim oPPTShape As Object ' Late binding: This is a PowerPoint.Shapebut we cannot assume that the Microsoft PowerPoint 11 library will be loaded in the workbook that this module has been copied to.
Dim oPPTApp As Object

Set oPPTApp = CreateObject("PowerPoint.Application")
oPPTApp.Visible = True

Set oPPTPres = oPPTApp.Presentations.Open(PPTFile)

...

oPPTPres.Close
Set oPPTPres = Nothing
oPPTApp.Quit
Set oPPTApp = Nothing
于 2012-08-28T18:06:34.237 回答
4

JMP,

Sean 在从内存中删除对象方面是正确的,但您需要确保释放对您的 powerpoint 对象的所有直接引用,以防您将指向您的 powerpoint 的指针存储在其他变量中。然而,值得注意的是,这不会杀死应用程序并停止线程 - 它只会释放您的应用程序变量。

Paul B 关闭 powerpoint 的方法应该可以正常工作,并且这篇SO 文章有一个软方法和一个蛮力方法来关闭应用程序(如果它们保留在内存中)。

我在我的机器上通过 Excel 对这个简单的暴力破解方法进行了调整和测试,结果它立即杀死了 Powerpoint 应用程序:

Sub ForcePowerpointExit()


Dim BruteForce As String
BruteForce = "TASKKILL /F /IM powerpnt.exe"

Shell BruteForce, vbHide

End Sub

因此,这为您提供了杀死应用程序的另一种选择。

于 2012-08-28T18:08:52.393 回答
1

我相信所有其他海报至少部分正确。Paul B. 的答案在大多数情况下应该有效。

唯一需要注意的是,如果您的 powerpoint VBA 代码直接从用户表单或用户表单直接引用的对象调用。

在这种情况下,仍有一个对象引用等待从内存中删除。

将所有 VBA PowerPoint 代码移动到一个模块并在启动自动化(PowerPoint)代码之前隐藏用户窗体。

于 2013-05-19T23:19:48.940 回答
0

Set oPPTPres = Nothing应该删除 Excel 对该对象的引用,并(希望)将其从内存中释放

于 2012-08-28T17:58:09.277 回答