gpt4 book ai didi

vba - 在运行时自定义 PowerPoint 功能区

转载 作者:行者123 更新时间:2023-12-04 00:59:37 31 4
gpt4 key购买 nike

我正在开发 PowerPoint 加载项,并希望在加载项应用程序运行时暂时禁用某些功能区控件。

我开发了一个解决方案,可以在启用加载项时按预期工作,但这还不够,因为它禁用了一些常用的控件,如 SlideMaster、SlideSorter 等。

我正在使用 PowerPoint 2010。

这是一个格式良好的示例 XML:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabView">
<group idMso="GroupMasterViews" getVisible="GetVisible"/>
</tab>
</tabs>
</ribbon>
</customUI>

这是一个示例回调,取自 this SO answer :
Sub GetVisible(control As IRibbonControl, ByRef returnedVal As Boolean)
If TrapFlag Then
returnedVal = False ' control is hidden
Else:
returnedVal = True ' control is not hidden
End If
End Sub

当我导航到 View功能区,一条警报通知我:

The macro cannot be found or has been disabled because of your security settings.



大概这是指 GetVisible宏?我的宏设置是:
  • 启用所有宏(不推荐)
  • 信任对 VBA 项目对象模型的访问

  • 到目前为止,我一直在努力解决我发现的问题,但到目前为止无法实现建议。大多数答案都是针对 Excel 的。我还没有真正找到任何特定于 PowerPoint 的内容,但我认为将代码从一个应用程序移植到另一个应用程序应该不是非常困难,因为我已经在 VBA 中为许多其他事情做过这件事。

    我也试过 this方法,但 SetCustomUIApplication 的 PowerPoint 中不可用或 Presentation级别,也许它是唯一的或仅适用于 Visual Studio?

    最佳答案

    经过相当多的反复试验,我相信我有一个实用的解决方案,尽管有些事情我不确定,我将在下面描述。

    我已经在一个 PPTM 文件中测试了这个,它带有一个子程序来控制公共(public) TrapFlag变量,它决定是否隐藏/禁用某些控件。我还在应用程序启动时设置了此标志的 PPAM 中对此进行了测试,不是 加载加载项时。

    这允许我在运行时操作 RibbonUI。

    这是 XML:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>`
    <customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <commands>
    <command idMso="ViewSlideSorterView" getEnabled="EnableControl"/>
    <command idMso="ViewNotesPageView" getEnabled="EnableControl"/>
    <command idMso="ViewSlideShowReadingView" getEnabled="EnableControl"/>
    <command idMso="ViewSlideMasterView" getEnabled="EnableControl"/>
    <command idMso="ViewHandoutMasterView" getEnabled="EnableControl"/>
    <command idMso="ViewNotesMasterView" getEnabled="EnableControl"/>
    <command idMso="WindowNew" getEnabled="EnableControl"/>
    </commands>
    <ribbon startFromScratch="false">
    <tabs>
    <tab idMso="TabView">
    <group idMso="GroupMasterViews" getVisible="VisibleGroup"/>
    <group idMso="GroupPresentationViews" getVisible="VisibleGroup"/>
    </tab>
    </tabs>
    </ribbon>

    这是从 CustomUI Editor 应用程序生成的 VBA 回调,根据我的要求进行了修改。
    Option Explicit
    Public TrapFlag As Boolean
    Public Rib As IRibbonUI
    Public xmlID As String

    Public Sub SetFlag()
    Dim mbResult As Integer
    mbResult = MsgBox("Do you want to disable some controls on the Ribbon?", vbYesNo)
    If mbResult = vbYes Then
    TrapFlag = True
    Else:
    TrapFlag = False
    End If
    End Sub

    'Callback for customUI.onLoad
    Sub RibbonOnLoad(ribbon As IRibbonUI)
    'MsgBox "onLoad"
    Set Rib = ribbon
    End Sub

    'I use this Callback for disabling some Controls:
    ' ViewSlideSorterView
    ' ViewNotesPageView
    ' ViewSlideShowReadingView
    ' ViewSlideMasterView
    ' ViewHandoutMasterView
    ' ViewNotesMasterView
    ' WindowNew
    Sub EnableControl(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running.
    'MsgBox ("GetEnabled for " & control.Id)
    'Debug.Print control.Id & " enabled = " & CStr(returnedVal)
    Call RefreshRibbon(control.Id)
    End Sub

    'I use this Callback for disabling/hiding some tab groups:
    ' GroupMasterViews
    ' GroupPresentationViews
    Sub VisibleGroup(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running.
    'MsgBox "GetVisible for " & control.Id
    'Debug.Print control.Id & " enabled = " & CStr(returnedVal)
    Call RefreshRibbon(control.Id)
    End Sub

    Sub RefreshRibbon(Id As String)
    xmlID = Id
    'MsgBox "Refreshing ribbon for " & Id, vbInformation
    If Rib Is Nothing Then
    MsgBox "Error, Save/Restart your Presentation"
    Else
    Rib.Invalidate
    End If
    End Sub

    一些不确定性
  • 我仍然不完全确定某些 Ron deBruin 的代码做了什么(here),或者是否有必要。我做了一些测试,但我不确定公共(public)变量 xmlID在这种情况下是必要的。他以某种我无法理解的方式使用了它。
  • 此外,我无法在标签 group 上使用相同的回调。正如我
    command 上使用在 XML 中,所以我使用标签 getEnabled为了
    命令,但我必须使用 getVisible为团体。这些
    绑定(bind)到回调函数 EnableControlVisibleGroup , 分别。无论如何,VisibleGroup好像
    禁用组,因此在功能上是相同的。
  • 我也相信getEnabled标签将阻止对我禁用的那些命令的热键和编程访问。
  • 关于vba - 在运行时自定义 PowerPoint 功能区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664489/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com