【问题标题】:How to simulate ThisPresentation in PowerPoint VBA如何在 PowerPoint VBA 中模拟 ThisPresentation
【发布时间】:2009-09-24 15:25:17
【问题描述】:

我希望能够从加载项本身的一些 VBA 代码访问 PowerPoint 加载项文件(另存为“PowerPoint 加载项 (*.ppa)”的演示文稿)的文档属性。

如果有助于理解问题,我实际上要做的是读取存储加载项版本号的自定义文档属性,以便我可以在对话框中显示它。

使用 Word 和 Excel,我可以使用 ThisDocumentThisWorkbook 来执行此操作,它们都返回对包含运行代码的文档的引用。但是,PowerPoint 中没有 ThisPresentation 等效项。

对于标准的 PowerPoint 演示文稿或模板,我可以使用 ActivePresentation。但是,此方法不适用于加载项。

有什么想法吗?请不要建议我应该在哪里粘贴版本号:-)

【问题讨论】:

    标签: vba powerpoint


    【解决方案1】:

    和其他人一样,我希望 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
    

    【讨论】:

    • 如果您加载了加载项 (.ppa),它不会显示在 Presentations 集合中...
    • @Gary: 不知道...刚做了我的第一个 PowerPoint 宏 :-)
    • @Gary:我自己在 .pptm 文件中使用了它。直到上周,我从未制作过 PowerPoint 宏(我确实有很多其他 VBA 经验),所以我不熟悉 VBA 中的所有 PowerPoint 细节。但它确实像 PowerPoint 2010 中启用宏的常规演示文稿 (.pptm) 中的魅力一样。但有一件事......加载项不是演示文稿。为什么期望/希望使用 ThisPresentation 对象而不是 ThisAddIn 对象?
    • 正如我在问题中所说,对于启用宏的演示文稿,您无需费心费力 - 只需使用 ActivePresentation
    • “加载项不是演示文稿。为什么期望/希望使用 ThisPresentation 对象而不是 ThisAddIn 对象?” -- 在 Word 中,您通过获取文档并保存为加载项来创建加载项;它仍然表示为一个文档,您可以通过 ThisDocument 访问它。在 Excel (ThisWorkbook) 中也是如此。由于 PowerPoint 中的过程是相同的(进行演示,另存为...),那么我会转过头来说为什么会有所不同?无论如何,没有 ThisAddin,所以这是一个有争议的问题。
    【解决方案2】:

    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 对象的引用,这不会让我获得外接程序的文档属性等。不过,感谢您的尝试!
    • 加载项确实实际上具有文档属性,因为您仍然可以通过 Windows 资源管理器获取和设置属性。但是,我得出的结论是,根本不可能通过代码访问它(或者至少不能通过 VBA 对象模型)。感谢您的尝试,但我认为是时候放弃了。
    • 呃,是的,我可以在代码中定义常量 - 然后我可以使用 MsgBox 报告它,而不是创建一个文本框 :-) 但是,正如我在我的问题中所说,我'我对以不同的方式并不真正感兴趣——我更感兴趣的是理论上是否可以访问文档道具。 (我想我有我的答案 - 它不是)。
    • 知道了。我的盒子上没有在 Windows 资源管理器中公开的 PPT 文档属性 - 只有加载项属性(名称、类型等)和我想要设置的任何自定义属性。这与 COM 插件一致,其中 PPA 是相同的东西,只是文件扩展名不同。您的 PPT 文档属性(即 BuiltInProperties)是否在 Windows 资源管理器中具有“标题”、“主题”、“作者”、“打字员”等?如果是这样,您使用的是什么版本的 PPT 和 Windows - 只是我以前从未听说过,我很想知道。
    • 这不起作用。在 Excel 中,ThisWorkbook 是指运行代码的工作簿或加载项。即使用户已重命名工作簿或加载项,它也会返回正确的工作簿或加载项。在 ThisDocument 中,Word 执行相同的操作。 PowerPoint 严重缺乏此功能。
    【解决方案3】:

    总体想法归功于 macnerd nerd,但添加了 OP 要求的 AddIn 功能。不幸的是,插件没有 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
    

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多