0

我在 Powerpoint 中有一个宏,可以为我提供形状信息。如果没有选择任何形状,为了绕过错误,我插入了一个错误掩码。但是,这很烦人。

因此,如果没有选择形状,是否可以使按钮变灰。这样用户甚至有机会点击它。

自定义 UI XML: http: //pastebin.com/T6NQ8WF8

4

1 回答 1

1

假设您使用的是 2007+ 版本的 PowerPoint,操作功能区控件、按钮等的唯一方法是通过功能区可扩展性。可以在运行时使用 vba 挂钩来执行此操作,但它比在以前版本的 PowerPoint 中要困难得多,在以前的版本中,您可以只使用 VBA 来操作控件.Enabled.Visible属性。

下面是使用功能区可扩展性在运行时自定义功能区的示例。如您所见,这并不容易。我将在下面的选项 2 中展示这一点。

在这种情况下,您有一个错误情况,您可以.Type使用Selection.ShapeRange. 我认为尝试在运行时有条件地禁用此按钮(下面的选项 2)可能比它的价值更麻烦。

更新

是否有一个设置使您所有没有效果的按钮变灰。

不。宏“效果”,即使宏的结果是不执行任何操作。您要问的是是否有一个设置可以编译和解释您的宏,确定该宏是否执行“操作”(例如,操作形状,更改属性分配等),然后根据此确定禁用按钮. 没有这样的设置。

选项 1 -- 根本不显示 MsgBox;如果选择无效,则不执行任何操作

我将进行一些编辑以清理您的代码并使用更好的方法来避免该错误:

Sub Infos()

   Dim n as String
   Dim w as String
   Dim h as String
   Dim l as String
   Dim T as String

   With ActiveWindow.Selection.ShapeRange
   Select Case .Type
        Case 0
            'MsgBox ("No shape selected.")
            Exit Sub
        Case Else
            n = .Name
            w = .Width
            h = .Height
            l = .Left
            T = .Top

            MsgBox "Name: " & n & Chr$(CharCode:=13) & "Länge: " & w & _
                   Chr$(CharCode:=13) & "Höhe: " & h & Chr$(CharCode:=13) & _
                   "Linkeposition: " & l & Chr$(CharCode:=13) & "Höhenposition: " & T
    End Select
End Sub

选项 2 -- 使用应用程序事件处理程序并在运行时操作功能区

我提到这并不容易。我将示例文件上传到Google Docs Presentation1.pptm。这应该让你开始。你现在可以看到这种方法有多么困难。如果您正在创建 PPAM/加载项文件,您可能会遇到更多的注意事项和复杂性。祝你好运!

您的代码中有几个错误。

1. 当我签入自定义 UI 编辑器时,您的 XML 无效。我在这里编辑它:

http://pastebin.com/SpG0Rtqq

2. 您的Infos宏包含错误。如果选择多个形状,您也省略了该End With语句,您的n分配将失败(其余的将产生奇怪的结果)。您可以通过以下方式解决此问题:

n = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Name)
w = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Width)
h = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Height)
l = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Left)
T = IIf(.ShapeRange.Count > 1, "Multiple shapes", .ShapeRange(1).Top)

一旦你修复了这些组件......

添加一个名为 的模块mod_EventHandler,其中包含此代码。这将创建一个应用程序事件处理程序类对象cEventClass

Option Explicit
Public cPPTObject As New cEventClass
Public TrapFlag As Boolean

Sub TrapEvents()
'Creates an instance of the application event handler
If TrapFlag = True Then
   MsgBox "Relax, my friend, the EventHandler is already active.", vbInformation + vbOKOnly, "PowerPoint Event Handler Example"
   Exit Sub
End If
   Set cPPTObject.PPTEvent = Application
   TrapFlag = True
End Sub

Sub ReleaseTrap()
If TrapFlag = True Then
   Set cPPTObject.PPTEvent = Nothing
   Set cPPTObject = Nothing
   TrapFlag = False
End If
End Sub

因为我们需要这个类对象,所以在你的 PowerPoint 文件中添加一个类模块,命名为cEventClass. 在这个模块中,把这段代码放在下面。此代码强制刷新功能区。此过程隐式调用EnabledBtInfo子例程,然后测试当前选择是否为 Shape(s)。

Option Explicit
Public WithEvents PPTEvent As Application
Private Sub PPTEvent_WindowSelectionChange(ByVal Sel As Selection)
    'Force refresh of the "btInfo" button:
    RefreshRibbon "btInfo"
End Sub

最后,使用此代码控制按钮的可见性/启用的另一个标准代码模块。请注意,这EnabledBtInfo是此按钮的 VBA Hook,它会在刷新功能区之前测试选择是否为形状:

Option Explicit
Public Rib As IRibbonUI
Public xmlID As String

'Callback for customUI.onLoad
Sub RibbonOnLoad(ribbon As IRibbonUI)
    TrapEvents  'instantiate the event handler
    Set Rib = ribbon
End Sub

Sub EnabledBtInfo(control As IRibbonControl, ByRef returnedVal)
    'Check the ActiveWindow.Selection.ShapeRange
    returnedVal = (ActiveWindow.Selection.Type = ppSelectionShapes)
    Call RefreshRibbon(control.Id)
End Sub

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

选择形状时,会启用放大镜图标:

在此处输入图像描述

未选择形状时,按钮被禁用:

在此处输入图像描述

And finally, when multiple shapes are selected:

在此处输入图像描述

于 2013-08-19T14:16:15.187 回答