2014-02-27 100 views
5

我有一個運行了很長時間(可能幾天,它執行數據採集)的Excel VBA宏。它最初是爲Excel 2003編寫的,並具有自定義工具欄和菜單。 我最近使用RibbonXML將其更新爲使用Ribbon界面。Excel VBA功能區getEnabled在代碼運行時不會調用

當宏運行我想禁用某些界面元素(如「開始測試」),並讓其他人(如「停止測試」按鈕。)

我的問題是,電話到ribbon.invalidate只處理宏代碼已經運行完成。

你可以很容易地看到一個簡單的測試程序

Sub test() 

ribbon.Invalidate 
DoEvents 
Sleep (5000) 

End Sub 

在碳帶的debug.print「getEnabled」這種效果回調將看到僅在5秒睡眠結束付諸行動。

有什麼辦法可以強制使用ribbon.Invalidate可以在那裏激活嗎?

::編輯1 ::

我創建了一個小的演示工作簿ilustrate問題: 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 

回答

0

我不知道這是任何比你有什麼不太難看,但是......

'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將調用這個實際工作。代碼同樣醜陋,但用戶界面對用戶來說並不陌生。

+0

謝謝,我確實想知道允許代碼實際停止,並排隊這樣的定時程序,但我擔心它可能最終以不可預知的方式行事。但是現在我知道別人有這個想法,我至少說服了它並不是完全瘋了,我可能會放棄它。 – bodgesoc

相關問題