运行代码时不调用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将调用,实际工作。 代码同样丑陋,但用户界面对用户来说并不陌生。