如何在PowerPoint VBA中模拟ThisPresentation?

7
我希望能够从一个PowerPoint插件文件中访问文档属性(保存为“PowerPoint Add-in(*.ppa)”的演示文稿),并从插件本身的VBA代码中读取存储插件版本号的自定义文档属性,以便在对话框中显示。在Word和Excel中,我可以使用ThisDocument和ThisWorkbook来实现此目的,它们都返回对包含运行代码的文档的引用。然而,在PowerPoint中没有ThisPresentation等效项。对于标准的PowerPoint演示文稿或模板,我可以使用ActivePresentation。但是,这种方法对于插件不起作用。有什么想法吗?请不要建议将版本号放在其他地方 :-)
3个回答

2

和其他人一样,我也期望在PowerPoint中有一个ThisPresentation对象。我想到了另一种方法来完成它,而不需要硬编码文件名。显然,任何代码片段都需要知道如何区分项目之间的差异。我选择使用项目名称来实现这一点(在项目资源管理器中默认名称为“VBAProject”):它没有被用于其他任何事情,没有用户会更改它,如果它受保护,他们也不能。

这是我的代码(将MyProject更改为您自己的项目名称):

Function ThisPresentation() As Presentation
Dim p As Presentation

For Each p In Presentations
    If p.VBProject.Name = "MyProject" Then
        Set ThisPresentation = p
        Exit Function
    End If
Next
End Function

1
如果您加载了一个插件(.ppa),它不会显示在“演示文稿”集合中... - Gary McGill
@Gary:不知道呢...我刚刚做了我的第一个PowerPoint宏 :-) - macnerd
@Gary:我自己在.pptm文件中使用过这个。直到上周我从未制作过PowerPoint宏(我有很多其他VBA经验),所以我对VBA中所有特定于PowerPoint的内容都不熟悉。但是,在PowerPoint 2010中,它确实像魅力一样工作。不过有一件事...插件不是演示文稿。为什么期望/希望ThisPresentation对象而不是ThisAddIn对象之类的东西呢? - macnerd
就像我在问题中所说的那样,对于启用宏的演示文稿,您不需要费这么大的劲 - 只需使用“ActivePresentation”即可。 - Gary McGill
一个插件不是演示文稿。为什么期望/希望有一个ThisPresentation对象而不是一个ThisAddIn对象或其他对象呢?在Word中,您通过将文档保存为插件来创建插件;它仍然表示为文档,并且可以通过ThisDocument访问。在Excel中也是如此(ThisWorkbook)。由于在PowerPoint中的过程相同(取一个演示文稿,保存为...),那么我会反过来问为什么会有所不同呢?无论如何,没有ThisAddin,所以这是一个无意义的问题。 - Gary McGill
显示剩余2条评论

1

2010年2月2日修订:清理答案,仅显示最终解决方案


这是完成所要求的方式,没有DLL。非常简单:
Sub ReturnPPAasPresentation()
    Dim p As Presentation
    Set p = Presentations("presentation1.ppa")
    Dim title As String, version As String
    version = p.CustomDocumentProperties("Version").Value
    title = p.BuiltInDocumentProperties("Title").Value
    MsgBox "Version: " & version & " of " & title, vbOKOnly, title
End Sub

感谢您的回复。不幸的是,我认为这并不能解决我的特定问题。它涵盖了各种情况,但没有一个插件需要获取自身引用的情况。即使使用Addins (myName)也只会给我一个对AddIn对象的引用,这并不能让我访问插件的文档属性等。尽管如此,还是很感谢您的尝试! - Gary McGill
1
这个插件确实有文档属性,因为你仍然可以通过Windows资源管理器获取并设置这些属性。但是,我得出结论,无法通过代码(或至少不能通过VBA对象模型)访问它。谢谢你的尝试,但我认为是时候放弃了。 - Gary McGill
当然,了解部署问题。DSO源代码是用C++编写的,但也许可以移植到VBA中,以便驻留在您的PPA中。 - Todd Main
好的,这可以做到,非常简单。只需假设PPA可以成为演示文稿集合的一部分,你就做到了。以上是最终修订! - Todd Main
1
这个不起作用。在Excel中,ThisWorkbook指的是运行代码的工作簿或加载项。即使用户已经重命名了工作簿或加载项,它也会返回正确的工作簿或加载项。在ThisDocument中,Word也是如此。但是PowerPoint非常缺乏这种功能。 - Jon Peltier
显示剩余4条评论

-1

感谢macnerd nerd提供的一般想法,但增加了OP请求的AddIn功能。不幸的是,AddIns没有VBProject名称,因此不太健壮:

Function ThisPresentation(project_name As String) As Object
Dim p As Object

all_presentations = Array(Application.AddIns, Application.Presentations)
For Each pArray In all_presentations
    For Each p In pArray
        Debug.Print p.FullName
        If InStr(p.FullName, project_name) > 0 Then
            Set ThisPresentation = p
            Exit Function
        End If
    Next
Next
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接