Страницы: 1
RSS
Отображение состояния переменной VBA на панели быстрого доступа
 
Имею следующую последовательность в VBA:

объявляю глобальную переменную
Public  NewMaket As Range

выполняю некую процедуру в которой этот NewMaket задается.

затем (после распития чая) запускаю другую процедуру или третью в которой  этот диапазон используется.

Если во время чая или выполнения процедуры произошел reset проекта vba, то ессно переменная становится nothing. Конечно состояние переменной проверяется в процедурах, но хочется наглядности, а именно: иметь кнопку на панели, которая бы отражала состояние переменной и меняла бы иконку. Пришел, глянул на панель и запустил в случае чего этой кнопкой первую процедуру.

Алсо. Аналогичная задача стоит в аутлуке, где объявляется
Private WithEvents ItemsT As Outlook.Items
Аутглюк вообще гад, может вообще втихаря сбросить переменную и обработка писем остановилась. (Функционала "правил" в аутлуке мне не хватает для обработки).


Офис 2010
Изменено: Лузер™ - 15.01.2015 11:43:38
Bite my shiny metal ass!      
 
Лузер, а панель в каком офисе? 2003 или выше?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Блин!
Опять забыл. 2010
(проапдейтил псто)
Bite my shiny metal ass!      
 
Тут варианта два:
1) перестать пить чай;
2) перед уходом на чай, сохранять (например, в реестре, через SaveSetting) параметры диапазона (имя книги, имя листа, адрес диапазона)
и после чаепития воссоздавать переменную по сохранённым значениям
 
Игорь, а с аутлуком что делать?

Да и сохранять адрес/лист/книгу можно прям в ячейке, к чему реестр...
Смысл в том, чтобы видеть висит переменная в памяти или нет.
Bite my shiny metal ass!      
 
периодический ontime
с проверками и восстановлением переменных.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Вариант: значение переменной в статус баре
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Ох не люблю я онтайм.
В таком бесконечном цикле его надо его отменять, а то эксель не закроешь. Точнее закроешь. но он снова откроется.

К тому же если проект остановился, то в стастус баре зависает последнее значение. т.е. переменная уже нафинг, а он $A$10
в аутглюке и онтайма нет.
Bite my shiny metal ass!      
 
Ёк-Мок, у меня всё время "Nothing" показывает. Таймер запускал, кнопку "показать" жал.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, там закомментировано присвоение диапазона :)
Bite my shiny metal ass!      
 
Лузер, для того, чтобы оперативно видеть значение переменной - надо отслеживать все процедуры, которые могут его изменить. Или хотя бы отловить событие, которое может привести к изменению этой переменной. Это если OnTime не использовать(что действительно не очень хорошо в принципе).
Далее уже для панели надо использовать функции обратного вызова(типа getText) для изменения текста контрола. Или статус бар использовать(что тоже не всегда хорошо, т.к. он еще и для служебных целей предназначен, а так будет только значение переменной отображать).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist пишет: чтобы оперативно видеть значение переменной - надо отслеживать все процедуры, которые могут его изменить.
Процедуры его не меняют. Происходит reset проекта vba - это как если нажать на квадратик в редакторе (который типа стоп) - в меню он так и называется Reset.
Бывает, что макрос аварийно завершается, но сообщение об ошибке (которое с End, Debug и пр.) не вылезает.
Цитата
для панели надо использовать функции обратного вызова(типа getText) для изменения текста контрола
Ткните, плз, где почитать? И чтобы иконку тоже менять  :)
Bite my shiny metal ass!      
 
Цитата
Лузер™ пишет: Ткните, плз, где почитать?
http://msdn.microsoft.com/en-us/library/ms406046.aspx?ppud=4
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Вот, накидал тестовый проект. Картинки вместе с файлом должны лежать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо!

Как работает  не понимаю  :)  
Точнее как запускается. Если нажать на Reset, а потом на кнопку, то ругается на MyRibbon.InvalidateControl (control.ID)
После Reset значение на ленте все равно остается True  :(  
Похоже я хочу слишком многого   8-0  

Правильно я понимаю, что Sub change_label и Sub change_image это типо событий? И возникают они после (перед?) MyRibbon.InvalidateControl (control.ID)?
Нафига нужны функции WBInitialize и repaintRibbon? Точнее я не вижу их вызовов.
Bite my shiny metal ass!      
 
Цитата
Лузер™ пишет: Нафига нужны функции 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
There is no knowledge that is not power
Страницы: 1
Читают тему
Наверх