Консультация № 66232
09.12.2006, 15:31
0.00 руб.
0 3 2
Здравствуйте! На рабочем листе много кнопок (Button1,Button2,Button3,Button4 и тд) встроенных в ячейки этого листа.
У всех этих кнопок один обработчик OnAction(срабатывает по нажатию на кнопку). Можно ли как-нибудь определить
какая из кнопок была нажата??


Приложение:
Sub Кнопка1_Щелкнуть()Dim c, btnStatic i As Longi = i + 1Set c = Excel.ActiveCellSet btn = ActiveSheet.Buttons.Add(c.Left, c.Top, c.Width, c.Height)btn.OnAction = "BtnOnClick"btn.Caption = "кнопка " & CStr(i)End Sub

Обсуждение

Неизвестный
11.12.2006, 10:07
общий
это ответ
Здравствуйте, Rewer8!
Почему бы не сделать на каждую кнопку свой маленький обработчик, а уже из него вызывть общий обработчик с аргументом, включающем индекс кнопки...
давно
Специалист
399094
201
11.12.2006, 12:27
общий
Потому что не знаю как
Неизвестный
13.12.2006, 12:34
общий
это ответ
Здравствуйте, Rewer8!
Если количество кнопок ограничено(допустим максимум 100 кнопок), то можно вручную(или каким скриптом) написать:
Sub BtnClk0()
Call BtnOnClick(0)
End Sub
Sub BtnClk1()
Call BtnOnClick(1)
End Sub
...
...
Sub BtnClk100()
Call BtnOnClick(100)
End Sub
и присваивать эти обработчики кнопкам при их создании в зависимости от индекса.
В Access я так писал прямо в модуль проекта из VBA во время выполнения, в Excel пока RunTime не получалось, только вручную.

Но может Вам отказаться от кнопок? И эмулировать их с помощью гиперссылок?
Создаете в нужной ячейке Hyperlink например на саму эту ячейку, с помощью шрифта, границ и заливки делаете ячейку похожей на кнопку,
и тогда в обработчике Worksheet_FollowHyperlink мы будем иметь непосредственно саму ссылку на которую нажали.
Есть недостаток, что при переходе по ссылке сбивается Selection, и если он Вам нужен то придется в Worksheet_SelectionChange сохранять последние Selection.
Я так делал до 300 чекбоксов на листе, уже несколько лет никто не жалуется.
Если что, пишите.
Успехов.
Форма ответа