объявляю глобальную переменную Public NewMaket As Range
выполняю некую процедуру в которой этот NewMaket задается.
затем (после распития чая) запускаю другую процедуру или третью в которой этот диапазон используется.
Если во время чая или выполнения процедуры произошел reset проекта vba, то ессно переменная становится nothing. Конечно состояние переменной проверяется в процедурах, но хочется наглядности, а именно: иметь кнопку на панели, которая бы отражала состояние переменной и меняла бы иконку. Пришел, глянул на панель и запустил в случае чего этой кнопкой первую процедуру.
Алсо. Аналогичная задача стоит в аутлуке, где объявляется Private WithEvents ItemsT As Outlook.Items Аутглюк вообще гад, может вообще втихаря сбросить переменную и обработка писем остановилась. (Функционала "правил" в аутлуке мне не хватает для обработки).
Тут варианта два: 1) перестать пить чай; 2) перед уходом на чай, сохранять (например, в реестре, через SaveSetting) параметры диапазона (имя книги, имя листа, адрес диапазона) и после чаепития воссоздавать переменную по сохранённым значениям
Лузер, для того, чтобы оперативно видеть значение переменной - надо отслеживать все процедуры, которые могут его изменить. Или хотя бы отловить событие, которое может привести к изменению этой переменной. Это если OnTime не использовать(что действительно не очень хорошо в принципе). Далее уже для панели надо использовать функции обратного вызова(типа getText) для изменения текста контрола. Или статус бар использовать(что тоже не всегда хорошо, т.к. он еще и для служебных целей предназначен, а так будет только значение переменной отображать).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist пишет: чтобы оперативно видеть значение переменной - надо отслеживать все процедуры, которые могут его изменить.
Процедуры его не меняют. Происходит reset проекта vba - это как если нажать на квадратик в редакторе (который типа стоп) - в меню он так и называется Reset. Бывает, что макрос аварийно завершается, но сообщение об ошибке (которое с End, Debug и пр.) не вылезает.
Цитата
для панели надо использовать функции обратного вызова(типа getText) для изменения текста контрола
Ткните, плз, где почитать? И чтобы иконку тоже менять
Как работает не понимаю Точнее как запускается. Если нажать на Reset, а потом на кнопку, то ругается на MyRibbon.InvalidateControl (control.ID) После Reset значение на ленте все равно остается True Похоже я хочу слишком многого
Правильно я понимаю, что Sub change_label и Sub change_image это типо событий? И возникают они после (перед?) MyRibbon.InvalidateControl (control.ID)? Нафига нужны функции WBInitialize и repaintRibbon? Точнее я не вижу их вызовов.
Лузер™ пишет: Нафига нужны функции WBInitialize и repaintRibbon
WBInitialize - запускается при открытии книги и построения ленты. Это происходит один раз и вызов зашит в схему XML. repaintRibbon - сделана на всякий случай, чтобы можно было все контролы разом "пересчитать".
Цитата
Sub change_label и Sub change_image
это таки да, события. Прописывается их вызов опять же в схеме XML. Срабатывают они сразу после запуска файла(один раз) и после каждого вызова метода InvalidateControl в ChangeTestVar, т.к. по другому не получится назначить новый текст и картинку.
Проблему со сбросом Ribbon после нажатия на останов не знаю как решать. Как вариант можно попробовать обернуть в класс это дело.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Проблема с Ribbon решается так. 1) Сначала в процедуре, которая указана в onLoad, сохранить указатель на переменную ленту. 2) Перед инвалидацией проверить состояние переменной. Вот как-то так. И модуль класса необязателен. Вот как это работает в моей небольшой программе.
Стандарнтый модуль. Процедура CheckRibbon. Указатель сохраняется в именованный диапазон (необязательно в ячейку).
Код
Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (ByRef destination As Any, ByRef Source As Any, ByVal length As LongPtr)
#Else
Public Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (ByRef destination As Any, ByRef Source As Any, ByVal length As Long)
#End If
Public ribbon As IRibbonUI
Private is_ribbon_loaded As Boolean
Sub OnRibbonLoaded(ribbonUI As IRibbonUI)
Set ribbon = ribbonUI
Names("RibbonPointer").Value = ObjPtr(ribbon) ' <== Здесь сохраняем указатель на ленту в именованный диапазон.
is_ribbon_loaded = True
Call ActivateFLTab
End Sub
Sub ActivateFLTab()
If Val(Application.Version) > 12 Then
If is_ribbon_loaded Then
Call CheckRibbon
ribbon.ActivateTab "rxFL"
End If
End If
End Sub
Sub CheckRibbon()
If ribbon Is Nothing Then
#If VBA7 Then
Dim lPointer As LongPtr
lPointer = CLngPtr([RibbonPointer])
#Else
Dim lPointer As Long
lPointer = CLng([RibbonPointer])
#End If
CopyMemory ribbon, lPointer, LenB(lPointer)
End If
End Sub