Страницы: 1
RSS
Событие ComboBox1_Change при изменении ячейки?!
 
Добрый день,  
Странное поведение CB. Мне кажется из-за динамического диапазона (но он нужен). Как избежать данное явление? Спасибо.
 
Удалить Private Sub ComboBox1_Change
 
{quote}{login=PavelKs}{date=12.03.2012 12:36}{thema=Событие ComboBox1_Change при изменении ячейки?!}{post}(но он нужен){/post}{/quote}  
 
неудивительно то, что формула динамического диапазона пересчитывается при любом изменении на листе "Лист1" - там используется летцчая СМЕЩ()  
но то, что при этом происходит событие change для контрола - это интересно.  
 
а теперь - вернемся к цитате. зачем ОН НУЖЕН?  
как я понимаю, он нифига не работает так, как задумано - чтобы в комбобоксе выпадающий список автоматом обновлялся.  
введите в A6 на листе "Лист1" любую цифру - список в D1 изменится,а в комбобоксе - нет.  
 
так, может быть, и не стоит огород городить? :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Отказался от огорода, спасибо.
 
{quote}{login=ikki}{date=12.03.2012 01:25}{thema=Re: Событие ComboBox1_Change при изменении ячейки?!}{post}неудивительно то, что формула динамического диапазона пересчитывается при любом изменении на листе "Лист1" - там используется летцчая СМЕЩ()  
но то, что при этом происходит событие change для контрола - это интересно.{/post}{/quote}Александр, ComboBox1_Change дергается всякий раз, когда пересчитываются формулы (в т.ч. и при загрузке), потому что, как правильно Вы указали, в именованном диапазоне "цифра" использована "летучая" функция СМЕЩ, а в свойстве ComboBox1.ListFillRange стоит ссылка на этот диапазон.  
 
Чтобы и в этой ситуации список комбобокса обновлялся, достаточно такого кода:  
Private Sub ComboBox1_Change()  
 ComboBox1.ListFillRange = "цифра"  
End Sub
 
Точнее так:  
Private Sub ComboBox1_Change()  
 ComboBox1.ListFillRange = ""  
 ComboBox1.ListFillRange = "цифра"  
End Sub
 
Владимир, мне кажется луше так:  
 
Private Sub ComboBox1_Change()  
ComboBox1.ListFillRange = ComboBox1.ListFillRange  
End Sub  
ps/  
Это самый распространенный способ в access, для обновления контролов.
Спасибо
 
Владимир, Дмитрий, всё понятно, кроме одного - можно ли различить, когда возникло событие change - когда пользователь использовал комбобокс по прямому назначению или когда комбобокс "дёрнулся" из-за изменения летучего источника? :)  
 
с разбегу я чего-то не вижу такого способа...
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Private Sub ComboBox1_Click()  
 
End Sub  
 
как вариант, хотя я не люблю использовать элеметны activex на листе
Спасибо
 
Ан нет, только с глобальной переменной
Спасибо
 
{quote}{login=R Dmitry}{date=12.03.2012 06:26}{thema=}{post}Владимир, мне кажется луше так:  
Private Sub ComboBox1_Change()  
ComboBox1.ListFillRange = ComboBox1.ListFillRange  
End Sub  
{/post}{/quote}  
Спасибо, Дмитрий, так наверное лучше
 
{quote}{login=ikki}{date=12.03.2012 06:44}{thema=}{post}Владимир, Дмитрий, всё понятно, кроме одного - можно ли различить, когда возникло событие change - когда пользователь использовал комбобокс по прямому назначению или когда комбобокс "дёрнулся" из-за изменения летучего источника? :)  
с разбегу я чего-то не вижу такого способа...{/post}{/quote}  
Можно, как предлагал Дмитрий:  
Dim IsDrop As Boolean  
 
Private Sub ComboBox1_Change()  
 If IsDrop Then  
   MsgBox "ComboBox1_Change, Manually"  
 Else  
   MsgBox "ComboBox1_Change, Auto"  
   ComboBox1.ListFillRange = ComboBox1.ListFillRange  
 End If  
 IsDrop = False  
End Sub  
 
Private Sub ComboBox1_DropButtonClick()  
 If IsDrop Then IsDrop = False Else IsDrop = True  
End Sub  
 
А можно и немного хитрее :-)  
 
Private Sub ComboBox1_Change()  
 If CommandBars.FindControl(ID:=855).Enabled Then  
   MsgBox "ComboBox1_Change, Auto"  
 Else  
   MsgBox "ComboBox1_Change, Manually"  
 End If  
 ComboBox1.ListFillRange = ComboBox1.ListFillRange  
End Sub
 
Private Sub ComboBox1_DropButtonClick()  
IsDrop = not IsDrop  
End Sub  
?
Я сам - дурнее всякого примера! ...
 
Сергей, ну да, символы это сэкономит, но глючить будет так же, как и без экономии. Попробуйте раскрыть комбобокс, а потом подвигать клавишами со стрелкой вниз-вверх. Так что, вопрос Александр задал неспроста :-)  
 
А вот хитрый вариант с CommandBars.FindControl работает стабильно.
 
Да я пример не открывал:-) Просто на глаза попалось.
Я сам - дурнее всякого примера! ...
 
По задаче - зачем использовать динамический именованный диапазон, если все равно используются макросы. Макросом и определять диапазон. И не будет проблемы:-)
Я сам - дурнее всякого примера! ...
 
Сергей, по задаче с огородом - все верно.  
Но навеяло-то забавный вопрос.  
 
Кому интересно: хитрый вариант основан на том, что когда активирован комбобокс, то неактивны (Enabled=False) многие пункты меню, например, "Формат ячейки"
Страницы: 1
Читают тему
Наверх