我在Powerpoint中有一个宏,它为我提供了一个Shape的信息。如果没有选择形状,则绕过错误我插入错误掩码。但是,这非常烦人。
因此可以将按钮灰显,例如没有选择形状。这样用户就会有机会点击它。
自定义UI XML: http://pastebin.com/T6NQ8WF8
答案 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无效。我在这里编辑了它:
<强> 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
选择形状后,将启用放大镜图标:
如果未选择形状,则禁用按钮:
最后,当选择多个形状时: