运行代码时不调用Excel VBAfunction区getEnabled

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

当macros运行时,我想禁用一些界面元素(如“启动testing”),并启用其他(如“停止testing”button)。

我遇到的问题是,只有macros代码运行完成才能处理对ribbon.invalidate的调用。

你可以用一个简单的testing程序很容易地看到这个效果

Sub test() ribbon.Invalidate DoEvents Sleep (5000) End Sub 

function区“getEnabled”callback中的debug.print将被视为仅在5秒睡眠结束时执行。

有什么办法强制一个ribbon.Invalidate被激活,然后呢?

::编辑1 ::

我已经创build了一个小的演示工作簿来解释这个问题: http : //www.bodgesoc.org/Button_Demo.xlsm

::编辑2 ::

一个不同的论坛的成员find了一个解决scheme,虽然这是一个稍微丑陋的。 我想这可以现在被标记为“回答”,但一个更优雅的解决scheme,将不胜感激。

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

我不知道这是不是比你有什么丑陋的,但…

 '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 

所以你必须有两个程序每个callback – callback,然后无论SetRunning将调用,实际工作。 代码同样丑陋,但用户界面对用户来说并不陌生。