代码运行时未调用 Excel VBA 功能区 getEnabled

Posted

技术标签:

【中文标题】代码运行时未调用 Excel VBA 功能区 getEnabled【英文标题】:Excel VBA Ribbon getEnabled not called when code running 【发布时间】:2014-03-31 01:11:18 【问题描述】:

我有一个运行很长时间的 Excel VBA 宏(可能会运行数天,它会执行数据采集)。它最初是为 Excel 2003 编写的,具有自定义工具栏和菜单。 我最近将它更新为使用 RibbonXML 的功能区界面。

在宏运行时,我想禁用一些界面元素(例如“开始测试”),并启用其他元素(例如“停止测试”按钮。)

我遇到的问题是,对ribbon.invalidate 的调用仅在宏代码运行完成之后处理。

您可以通过一个简单的测试程序很容易地看到这种效果

Sub test()

ribbon.Invalidate
DoEvents
Sleep (5000)

End Sub

功能区“getEnabled”回调中的 debug.print 仅在 5 秒睡眠结束时才会被执行。

有什么方法可以强制一个ribbon.Invalidate 在那里激活吗?

:: 编辑 1 ::

我创建了一个小型演示工作簿来说明问题: http://www.bodgesoc.org/Button_Demo.xlsm

:: 编辑 2::

另一个论坛的成员找到了一个解决方案,尽管它有点难看。 我想这现在可以标记为“已回答”,但更优雅的解决方案将不胜感激。

Application.ScreenUpdating = False
Application.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",False)"
Application.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",True)"
Application.ScreenUpdating = True

【问题讨论】:

【参考方案1】:

我不知道这是否比你所拥有的更丑,但是......

'Callback for Run onAction
Sub Run_r(control As IRibbonControl)

    SetRunning "Run_r_procedure"
    DoEvents

End Sub

Sub Run_r_procedure()
    Dim T As Single

    Sheet1.Range("A10").Value = "Run pressed, button states changed, and ribbon invalidated. Waiting 5 seconds in loop"
    T = Timer
    Do While Timer - T < 5
        DoEvents
    Loop
    Sheet1.Range("A10") = ""

End Sub

然后在 SetRunning 中

Sub SetRunning(ByVal ProcToRun As String)

    Sheet1.Range("B1") = "Disabled"
    Sheet1.Range("B2") = "Disabled"
    Sheet1.Range("B3") = "Enabled"
    Sheet1.Range("B4") = "Enabled"
    Sheet1.Range("B5") = "Enabled"
    Sheet1.Range("B6") = "Enabled"
    Sheet1.Range("B7") = "Enabled"

    myRibbon.Invalidate
    myRibbon.InvalidateControl ("Run")

    Application.OnTime Now, ProcToRun

End Sub

因此,每个回调必须有两个过程 - 回调,然后是 SetRunning 将调用的执行实际工作的任何程序。代码同样丑陋,但 UI 对用户来说并不那么奇怪。

【讨论】:

谢谢,我确实想知道允许代码实际停止并排队这样的定时过程,但我担心它最终可能会以不可预测的方式运行。但现在我知道其他人有这个想法,我至少相信这不是完全疯了,我可能会试一试。

以上是关于代码运行时未调用 Excel VBA 功能区 getEnabled的主要内容,如果未能解决你的问题,请参考以下文章

从 VBA (Excel) 中的另一个函数调用一个函数

从 vba 代码调用 Excel 的工作表函数

使用范围变量时未定义 Excel vba 变量

如何在excel的vba中进行繁简转换

excel表格数据量很大时如何提高vba的效率

用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了