Powerpoint VBA / Macro:如果未选择任何形状,则禁用功能区上的(灰色)按钮

时间:2013-08-19 11:51:30

标签: vba powerpoint ribbon powerpoint-vba

我在Powerpoint中有一个宏,它为我提供了一个Shape的信息。如果没有选择形状,则绕过错误我插入错误掩码。但是,这非常烦人。

因此可以将按钮灰显,例如没有选择形状。这样用户就会有机会点击它。

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

1 个答案:

答案 0 :(得分:1)

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

Here is an example使用功能区扩展性在运行时自定义功能区。如你所见,这并不容易。我将在下面的选项2中显示这一点。

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

<强>更新

  

是否有设置会使您的所有按钮灰显无效。

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

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

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

Selection.ShapeRange

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

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

您的代码中存在多个错误。

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

http://pastebin.com/SpG0Rtqq

<强> 2。您的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 宏包含错误。您省略了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子例程,然后测试当前选择是否为Shape。

EnabledBtInfo

最后,另一个标准代码模块使用此代码来控制Button的可见性/启用。请注意,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 是此按钮的VBA Hook,它会在刷新功能区之前测试Selection是否为形状:

EnabledBtInfo

选择形状后,将启用放大镜图标:

enter image description here

如果未选择形状,则禁用按钮:

enter image description here

最后,当选择多个形状时:

enter image description here