我在 Powerpoint 中有一个宏,可以为我提供形状信息。如果没有选择任何形状,为了绕过错误,我插入了一个错误掩码。但是,这很烦人。
因此,如果没有选择形状,是否可以使按钮变灰。这样用户甚至有机会点击它。
自定义 UI XML: http: //pastebin.com/T6NQ8WF8
我在 Powerpoint 中有一个宏,可以为我提供形状信息。如果没有选择任何形状,为了绕过错误,我插入了一个错误掩码。但是,这很烦人。
因此,如果没有选择形状,是否可以使按钮变灰。这样用户甚至有机会点击它。
自定义 UI XML: http: //pastebin.com/T6NQ8WF8
假设您使用的是 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 无效。我在这里编辑它:
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: