Проблема с обработкой клика на "кнопке". (CommandB

Программирование на Visual Basic for Applications
Ig
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 30.04.2005 (Сб) 12:37
Откуда: Far East

Проблема с обработкой клика на "кнопке". (CommandB

Сообщение Ig » 16.05.2005 (Пн) 13:16

"Все изивилины заплел", но никак не могу разобраться... :cry:
В общих чертах...
Имеется книга Excel, в которой (после запуска, разумеется) нужно автоматически, спустя некое время, периодически обновлять данные.
Прикрутил на панель инструментов свою с: CommandBarComboBox, для выбора из списка или ввода своего значения периода обновления, и CommandBarButton. Кнопку сделал триггером (нажал - зафиксировалась).
Замысел таков: выбрал в ComboBox-е период, нажал кнопку - пошел таймер, периодически запускающий основную процедуру. Кнопку отжал: процедура автоматического обновления (если была запущена, то после завершения, если был период ожидания, то сразу) остановилась.
Замысел замыслом, но проблема в создании обработчика события клика на кнопке. Кнопку нажал, таймер стартует, процедура запускается, таймер стартует... и далее по кругу, а кнопку наглухо заклинивает. :cry:

Код (вернее та его часть, что на модуле с основной процедурой) примерно следующий:

Код: Выделить всё
Public AutoRefrBttn As CommandBarButton ' перекл-е режимов работы
Public RefrPerCbBx As CommandBarComboBox ' период обновления

Sub SwtchMode()
With AutoRefrBttn
If .State = msoButtonUp Then
  .Caption = " [ Автом. ] "
  .State = msoButtonDown
  pt = TmRsm
  DataRefr pt
ElseIf .State = msoButtonDown Then
  .Caption = " [ Ручн. ] "
  .State = msoButtonUp
End If
End With
End Sub
'
' Автоматическое обновление данных с заданным интервалом
Private Sub DataRefr(pt As Integer)
Dim TmrStrt
If pt = Empty Then Exit Sub
TmrStrt = Timer
With AutoRefrBttn
  Do While Timer < TmrStrt + pt _
   Or .State = msoButtonUp
   DoEvents
' <здесь что-то надо воткнуть?>
  Loop
  MaineSub
' <и здесь, наверное?>
DataRefr pt
End With
End Sub
'
' Ф-ия пересчета времени обновления
Function TmRsm()
Dim strRfrPer As String
Dim bytChNr As Byte
strRfrPer = RefrPerCbBx.Text
bytChNr = Asc(Mid(strRfrPer, 1, 1))
If bytChNr > 47 And bytChNr < 58 Then
TmRsm = CDec(strRfrPer) * 60
Else
MsgBox "Неправильно задан период", vbExclamation, _
  "Внимание"
End If
End Function


Вопрос: можно ли сделать "триггером" одну CommandBarButton (если да, то как правильно обрабатывать клик на ней)? Или придется извращаться и "лепить" два "батона" - "сиамских близнеца" "косящих" под "триггер" - пока один (одна) честно показывает свой "фейс", второй (вторая) "прикидывается ветошью" под первой и "не отсвечивает". 8)
(Ентот варьянт я уже попробовал, если правильно подобрать размер текста, чтобы не было дерганья при "пересменке", то трудно заметить подвох. Есть правда еще вариант: запускать таймер и процедуру из ComboBox-a. Тогда "заклинивает" уже его, а кнопка нормально отрабатывает. Но это уже не по-нашенски :wink: - уж совсем как-то "в обход" 8) ).
"Нормальные герои всегда идут в обход..."

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 13:27

Таймер в бесконечном цикле не есть хорошо, гарантирую наличие багов при закрытии файла. Советую перейти на событийные алгоритмы (API SetTimer или метод Application.OnTime).
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 13:28

А для фиксации текущего статуса используй Static или Public переменную (bButtonMode например).
Lasciate ogni speranza, voi ch'entrate.

Ig
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 30.04.2005 (Сб) 12:37
Откуда: Far East

Сообщение Ig » 16.05.2005 (Пн) 15:07

Таймер в бесконечном цикле не есть хорошо, гарантирую наличие багов при закрытии файла. Советую перейти на событийные алгоритмы (API SetTimer или метод Application.OnTime).


Спасибо, alibek, что наставил на путь истинный.
Вот же плин... Самое смешное, что я про сей метод (Application.OnTime) знаю и даже по-первоначалу была мысля его использовать, но почему-то решил, что с таймером будет проще. :alien: А все видать потому, что: не ищем Мы легких путев. :scratch:
И переменные енти я юзаю... 8)

А вот насчет API, к сожалению я с ним пока не шибко знаком, да и опять же... нам бы чего потяжельше 8) .
Еще раз спасибо. :salut:
"Нормальные герои всегда идут в обход..."

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 15:08

API SetTimer в использовании простая, но ей нужен VBA6 (т.е. офис от XP и выше). На младших версиях только OnTime.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.05.2005 (Пн) 15:20

Таки нет, Тёмыч показывал AddressOf для пятого :) Я применял, работает :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 15:34

Так он это тебе показывал, а я не видел, потому и занудствую :)
А как там? Через внешнюю DLL?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.05.2005 (Пн) 15:53

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 16:12

Прозевал я этот топик :)
(оправдываясь) И функция вообще недокументированная!
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron