gpt4 book ai didi

vba - Excel VBA Ribbon getEnabled 代码运行时未调用

转载 作者:行者123 更新时间:2023-12-02 08:50:38 24 4
gpt4 key购买 nike

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

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

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

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

Sub test()

ribbon.Invalidate
DoEvents
Sleep (5000)

End Sub

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

有什么方法可以强制激活功能区。无效吗?

::编辑 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

最佳答案

我不知道这是否比你的丑陋一些,但是......

'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 调用。代码同样丑陋,但用户界面对于用户来说并不那么奇怪。

关于vba - Excel VBA Ribbon getEnabled 代码运行时未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22071347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com