Сделал вкладку MyTab с парой кнопок на ленте. Идея в том чтобы по умолчанию кнопка Stop была неактивной и становилась активной (доступной для нажатия) после запуска процесса назначеного на кнопку Start. В целом все довольно просто и работает. Но почему-то перестает работать когда добавляешь вызов другой процедуры после активации кнопки, например StatusBarProgress - кнопка Stop активируется только после завершения процедуры StatusBarProgress.
Public myRib As IRibbonUI Public myTag As String Public btnStopPressed As Boolean
'ribbon Sub RibbonOnLoad(ribbon As IRibbonUI) Set myRib = ribbon End Sub
Sub GetEnabledMacro(control As IRibbonControl, ByRef Enabled) If myTag = "Enable" Then Enabled = True Else If control.Tag Like myTag Then Enabled = True Else Enabled = False End If End If End Sub
Sub RefreshRibbon(Tag As String) myTag = Tag If myRib Is Nothing Then MsgBox "Error, Save/Restart your workbook" Else myRib.Invalidate End If End Sub
'buttons Sub btnStart(control As IRibbonControl) Call RefreshRibbon(Tag:="btnStopTag") Call StatusBarProgress End Sub
Sub btnStop(control As IRibbonControl) btnStopPressed = True Call RefreshRibbon(Tag:="") End Sub
'routine Sub StatusBarProgress() Dim iTask As Long Dim TotalTasks As Long Dim secondsPerTask As Integer Dim TimeStart As Double
secondsPerTask = 0.1 TotalTasks = 3000 TimeStart = Now
For iTask = 1 To TotalTasks DoEvents If btnStopPressed Then GoTo myEnd
Сделал вкладку MyTab с парой кнопок на ленте. Идея в том чтобы по умолчанию кнопка Stop была неактивной и становилась активной (доступной для нажатия) после запуска процесса назначеного на кнопку Start. В целом все довольно просто и работает. Но почему-то перестает работать когда добавляешь вызов другой процедуры после активации кнопки, например StatusBarProgress - кнопка Stop активируется только после завершения процедуры StatusBarProgress.
Public myRib As IRibbonUI Public myTag As String Public btnStopPressed As Boolean
'ribbon Sub RibbonOnLoad(ribbon As IRibbonUI) Set myRib = ribbon End Sub
Sub GetEnabledMacro(control As IRibbonControl, ByRef Enabled) If myTag = "Enable" Then Enabled = True Else If control.Tag Like myTag Then Enabled = True Else Enabled = False End If End If End Sub
Sub RefreshRibbon(Tag As String) myTag = Tag If myRib Is Nothing Then MsgBox "Error, Save/Restart your workbook" Else myRib.Invalidate End If End Sub
'buttons Sub btnStart(control As IRibbonControl) Call RefreshRibbon(Tag:="btnStopTag") Call StatusBarProgress End Sub
Sub btnStop(control As IRibbonControl) btnStopPressed = True Call RefreshRibbon(Tag:="") End Sub
'routine Sub StatusBarProgress() Dim iTask As Long Dim TotalTasks As Long Dim secondsPerTask As Integer Dim TimeStart As Double
secondsPerTask = 0.1 TotalTasks = 3000 TimeStart = Now
For iTask = 1 To TotalTasks DoEvents If btnStopPressed Then GoTo myEnd
Sub btnStart(control As IRibbonControl) Call RefreshRibbon(Tag:="btnStopTag") 'Call StatusBarProgress Application.OnTime Now, "StatusBarProgress" End Sub
[/vba]
нет никакого разумного объяснения этому.
просто, процедура, вызвавшая инвалидейт ленты, пока не завершит свое выполнение, не будет делать тот самый инвалидейт.
гипотезы оставлю при себе
[vba]
Код
Sub btnStart(control As IRibbonControl) Call RefreshRibbon(Tag:="btnStopTag") 'Call StatusBarProgress Application.OnTime Now, "StatusBarProgress" End Sub
[/vba]
нет никакого разумного объяснения этому.
просто, процедура, вызвавшая инвалидейт ленты, пока не завершит свое выполнение, не будет делать тот самый инвалидейт.
Но даже так оно все равно работает как-то нестабильно: 1) первый раз, после добавления кода - заработало (единоразово, см п2), но после сохранения и открытия файла перестало работать. 2) после успешной остановки кнопкой Stop и последующего повторного запуска Start, кнопка стоп уже не активируется..
Возможно есть еще идеи ?)
ps. офтоп, аргументы в процедуру в OnTime, внезапно, передаются неочевидным способом.
Спасибо за разделение моей боли
Но даже так оно все равно работает как-то нестабильно: 1) первый раз, после добавления кода - заработало (единоразово, см п2), но после сохранения и открытия файла перестало работать. 2) после успешной остановки кнопкой Stop и последующего повторного запуска Start, кнопка стоп уже не активируется..
Вроде разобрался. Такое нестабильное поведение возникает если открыт редактора vba и там выбран лист или модуль и тп. Если редактор потом закрыть, все работает как прежде.
Еще один вопрос, подскажите, пожалуйста, как запустить инвалидейт ленты, если бы код из StatusBarProgress не был бы отдельной процедурой, а был вставлен в btnStart, сразу после RefreshRibbon?
Вроде разобрался. Такое нестабильное поведение возникает если открыт редактора vba и там выбран лист или модуль и тп. Если редактор потом закрыть, все работает как прежде.
Еще один вопрос, подскажите, пожалуйста, как запустить инвалидейт ленты, если бы код из StatusBarProgress не был бы отдельной процедурой, а был вставлен в btnStart, сразу после RefreshRibbon?user0