独立启用/禁用功能区控件

时间:2016-12-15 14:04:07

标签: excel-vba ribbon vba excel

我一直在寻找解决方案,而最接近的解决方案是Ron de Bruin example,但它并没有涵盖我需要的东西。

我想做的事实上是两件事

示例:我有4个按钮。

Group1和tab1上的Button1

Group1和tab1上的Button2

Group2和tab2上的Button3

Group2和tab2上的Button4

  1. 当单击功能区控件“Button1”时,它将运行一些代码并在结尾处禁用“Button1”。

  2. 当单击功能区控件“Button2”时,它将运行一些代码并检查“Button3”和“button4”并设置相反的属性。

  3. 如果button3为true,则变为false。

    如果button4为false,则变为true。

    您能否提供一些解决此问题的指导

2 个答案:

答案 0 :(得分:4)

好的,所有按钮都有GetEnabled个事件,所以当功能区激活/更新时 - 事件被触发! (简单)。

此事件的回调函数如下所示:

Sub Button_GetEnabled(control As IRibbonControl, ByRef enabled)
'(enabled = true to enable)
    enabled = EnableButtons
End Sub

让我们开始吧!在具有回调函数的模块中,您需要一个全局(全局到回调)布尔值smth,如EnableButtons

当功能区加载时,此代码示例将设置标志触发到True

Private Sub OnRib_Load(ribbonUI As IRibbonUI)
    Set MyRibbonUI = ribbonUI
    EnableButtons = True
End Sub

在每个按钮上,您需要回复上述GetEnabled事件。

之后 - 所有按钮都启用了!那么我们可以在这做什么呢?让我们看看OnAction回调到你想要的按钮:

Sub Button_Click(control As IRibbonControl)
     EnableButtons = False
     MyRibbonUI.Invalidate
     'do some stuff - buttons disabled
     EnableButtons = True
     MyRibbonUI.Invalidate
End Sub

所以Invalidate方法“更新”所有控件。您可以尝试InvalidateControl所需的控件(由于性能,这是一种比Invalidate更优选的方式),但我认为更优雅的方法是仅在您想要的按钮上放置回调和事件!

因此,最后,您需要引用功能区,布尔标志和_GetEnabled事件。

More here

答案 1 :(得分:2)

Commonsense提供的解释帮助我为所提出的修订问题建立最终解决方案。感谢

Option Explicit

Public MyRibbonUI As IRibbonUI
Public EnableButton1 As Boolean
Public EnableButton2 As Boolean
Public EnableButton3 As Boolean
Public EnableButton4 As Boolean


Public Sub OnRib_Load(ribbon As IRibbonUI)
'
' Code for onLoad callback. Ribbon control customUI
'
Set MyRibbonUI = ribbon
    EnableButton1 = True
    EnableButton2 = True
    EnableButton3 = True
    EnableButton4 = False

End Sub


Public Sub Button_GetEnabled(control As IRibbonControl, ByRef Enabled)
'
' Code for getEnabled callback. Ribbon control button
'
Select Case control.ID

    Case "Button1"
        Enabled = EnableButton1
    Case "Button2"
        Enabled = EnableButton2
    Case "Button3"
        Enabled = EnableButton3
    Case "Button4"
        Enabled = EnableButton4

End Select

End Sub

Public Sub Button1_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
EnableButton1 = False
MyRibbonUI.InvalidateControl ("Button1")


End Sub
Public Sub Button2_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
If EnableButton3 = False Then
    EnableButton3 = True
Else
    EnableButton3 = False
End If

MyRibbonUI.InvalidateControl ("Button3")

If EnableButton4 = False Then
    EnableButton4 = True
Else
    EnableButton4 = False
End If

MyRibbonUI.InvalidateControl ("Button4")

End Sub
Public Sub Button3_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'

End Sub
Public Sub Button4_onAction(control As IRibbonControl)
'
' Code for onAction callback. Ribbon control button
'
End Sub