Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
24.04.2024, 09:55:11

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 761 Пользователей
Последний пользователь: Halfdoor
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Неверное срабатывание события SpinButton1_Change
Страниц: [1]   Вниз
Печать
Автор Тема: Неверное срабатывание события SpinButton1_Change  (Прочитано 2904 раз)
0 Пользователей и 1 Гость смотрят эту тему.
belaev.s
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


belaev.s@mail.ru
Просмотр профиля E-mail
« : 22.01.2021, 12:13:05 »

Впервые столкнулся с подобной проблемой. Сразу оговорюсь: всё нижесказанное относится к UserForm в Ворде. Но, полагаю, что в данном случае нет принципиальной разницы Ворд это или Эксель.
Излагаю суть. Есть UserForm, содержащая различные элементы (Соntrols), в том числе единственный  счетчик SpinButton. При активации Формы (UserForm_Activate) всем элементам последовательно задаются начальные  значения . В том числе это происходит и с SpinButton - ему тоже  задается некое начальное значение.
В дальнейшем элементами можно управлять. Для этого под каждый прописана соответствующая процедура реагирования на Click или Change, кому как говорится , что положено. Все элементы (а их более 3-х десятков) ведут себя нормально, то есть, после активации всей формы и передачи им начальных значений "тихо" ждут своего часа.
Но только SpinButton проявляет норов. При активации формы он самопроизвольно отрабатывает процедуру SpinButton_Сhange, опережая все операторы процедуры активации Формы. А стартует его  процедура SpinButton_Сhange в тот момент, когда в процедуре Активации Формы  счетчику SpinButton задается начальное значение.
В чем дело - не могу разобраться. Значение счетчику задаю так:
SpinButton1.Value = 12  
В этот момент и запускается его процедура обработки:

Private Sub SpinButton1_Change()
Label2.Caption = "Размер: " &  SpinButton1.Value                   ' это индикация показаний счетчика в виде текста
FtSize = SpinButton1.Value                                                    ' текущее значение счетчика записывается в переменную FtSise
Label1.Font.Size = SpinButton1.Value                                     '  c помощью счетчика  задается размер шрифта тексту в информационном окне Label1
NullCodeF                                                                            ' выполняется некая общая процедура обработки данных
End Sub

Так почему же вдруг, ни с того , ни с сего запускается эта процедура, когда её не вызывают?
« Последнее редактирование: 22.01.2021, 12:59:11 от Дмитрий Щербаков(The_Prist) » Записан

Сергей Беляев
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #1 : 22.01.2021, 12:36:15 »

Вопрос не связан с темой. следует созать новую тему
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #2 : 22.01.2021, 12:57:53 »

Значение счетчику задаю так:
SpinButton1.Value = 12  
В этот момент и запускается его процедура обработки
я вот лично вообще не понял. Вы сами меняете значение SpinButton1 на 12, а потом удивляетесь почему срабатывает соответствующее событие? Тут логичнее был бы вопрос в точности до наоборот: почему событие не срабатывает, когда Вы меняете значение контрола. А так пока что все верно.
И да - тему надо создавать новую, а не пихать свои сообщения в старую, где тоже что-то про SpinButton1 обсуждается. Вопросы-то не связаны Улыбка Перенес в новую тему.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
belaev.s
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


belaev.s@mail.ru
Просмотр профиля E-mail
« Ответ #3 : 22.01.2021, 13:37:10 »

Благодарю за наставления. Впредь буду внимателен. Просто появился на форуме впервые и не совсем сориентировался. Мне-то казалось, что как раз и создал новую тему, а на деле - залез в старую.
По делу. А проблема-то решилась. Много дней бился. Решился пойти за советом... и тут же нашел ошибку. Если я правильно понимаю (а я не профи - просто любитель, и решаю чисто практические задачи для себя), дело было в том что изначально, при создании элемента "Счетчик" ему в свойствах было задано значение "8", а при активации формы ему же пытался "навязать" иное значение - "12". Вот он отрабатывал свою процедуру. Но мне-то казалось, что изначально  было выставлено одинаковое значение. Где-то упустил, значит, был твердо уверен в "одинаковости". Наткнулся случайно, пытаясь "снести" упрямый счетчик напрочь.
Вот такие казусы случаются порой. Может, кому и пригодится этот опыт. А значения все равно надо задавать при активации Формы, иначе они считытываются с индексом "-1", то есть , "значение не выбрано". Потому и пытался задавать значение счетчику при активации Формы, да и всем остальным элементам.
« Последнее редактирование: 22.01.2021, 13:44:29 от belaev.s » Записан

Сергей Беляев
belaev.s
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


belaev.s@mail.ru
Просмотр профиля E-mail
« Ответ #4 : 27.01.2021, 00:05:09 »

В продолжение темы:
Всё оказалось гараздо сложнее. В единичном случае вроде бы решение нашлось. Но далее образовалась очень большая проблема. При попытке программно задавать значения элементам управления - в одной процедуре, сразу нескольким элементам - на  первом же элементе  осуществлялся переход  на его персональную процедуру обработки ( ..._ Click ,  либо   ..._ Change) и вся основная процедура к чёрту, то есть  - не выполняется. Отключаешь первый элемент, со вторым та же история, и так далее.
Без лишних слов и эмоций: решение нашлось в интернете после о-очень долгих поисков. Вот оно. В коде формы, в самом начале прописываем:

Код: (vb)
Public StopEvents As Boolean

Далее, в каждой процедуре-обработчике элемента пишем  в самом начале нечто подобное:

Private Sub CheckBox2_OC_Click()
    If StopEvents Then Exit Sub         ' выход, если активен режим программного изменения
                                                     ' далее идёт код обработки события
     ...
End Sub

или, другой вариант:

Private Sub  ComboBox1_Change()
    If StopEvents Then Exit Sub         ' выход, если активен режим программного изменения
                                                     ' далее идёт код обработки события
     ...
End Sub

В основной процедуре, где этим элементам значения задаются программно,  сначала включаем, а в конце отключаем этот самый   StopEvents:

Private Sub SetParametrs ()
    StopEvents = TRUE            ' чтобы  не включались самопроизвольно процедуры обработки изменяемых элементов    
    ' Программно задаем новые значения элементам:
    CheckBox2.Vale = False
    ComboBox1.Text = "Verdana"
    ...
    ...    
    StopEvents = FALSE                      ' а теперь возвращаем элементам "свободу действий", можно задавать значения "в ручном режиме"
End Sub

Комментарий администратора Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума

Ответ найден по этому адресу: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=70103&MID=s

« Последнее редактирование: 27.01.2021, 08:52:44 от Дмитрий Щербаков(The_Prist) » Записан

Сергей Беляев
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru