Страница 1 из 1
Прицепить к кнопке в панели инструментов программу?
Добавлено: 27 дек 2004, 18:46
Circus
Добрый день, уважаемые!
Хочу вот запускать несколько прог. кнопками в новой панели инструментов.
Проблема - программы были макросами, хранящимися в самих файлах. Для унификации решил перенести их в новую надстройку, там они работают прекрасно. Редактор ВБ их видит отлично.
Но их перестали видеть все кнопки!
Итак, есть кнопка в панели инструментов. Есть программа на ВБ, написанная в редакторе но вставленная в файл надстройки. Как сделать так, что бы она пускалась нажатием этой кнопки?
Первое ощущение - кнопки и иная лабуда видит МАКРОСЫ, а код на ВБ - не видит. Заранее спасибо!
Добавлено: 27 дек 2004, 23:01
Naeel Maqsudov
Какое приложение? (Word, Excel...)
Что вы понимаете под надстройкой?
В Excel, например, файл .XLA является надстройкой. При инициализации надстройка добавляет свои кнопки/пункты меню. И все замечательно работает.
В Word для централизованного хранения макросов удобно использовать шаблоны, так как панель инструментов может быть сохранена в шаблоне и будет автоматически появляться при активации окна с документом, основанном на данном шаблоне. Чрезвычайно удобно.
В... Короче, что надо?

Добавлено: 28 дек 2004, 12:21
Circus
Эксел.
Ага, понятно. Механизм приблизительно ясен. Просто не работает механизм "подключения" макроса к кнопке. Что бы работало в том случае, если код лежит в надстройке, нужно прописывать кнопки в самом коде.
Тогда такой вопрос. В хелпе все это есть наверняка, только я добираюсь до него ночью - и тяжело с англ. а с ВБ совсем плохо.
Как прописать просто кнопку (напр. из "Формы") я понял, а как прописать (т.е. создать или описать имя ее) в коде кнопку из панели инструментов?
Спасибо за ответ, Наиль, вы подарите мне ночь спокойного сна!
Добавлено: 28 дек 2004, 15:53
Naeel Maqsudov
В модуль ThisWorkbook добавляем:
Код: Выделить всё
Dim mnu, btn As CommandBarButton
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call unregister
End Sub
Private Sub Workbook_Open()
Call register
End Sub
Private Sub register()
On Error Resume Next
Set mnu = Application.CommandBars("Tools").Controls.Add(msoControlButton, 2950)
mnu.Caption = "run the qwe"
mnu.OnAction = ThisWorkbook.Name & "!qwe"
Set btn = Application.CommandBars("Standard").Controls.Add(msoControlButton, 2950)
btn.Caption = "run the qwe"
btn.OnAction = ThisWorkbook.Name & "!qwe"
End Sub
Private Sub unregister()
On Error Resume Next
mnu.Delete
btn.Delete
End Sub
В модуль, например, Модуль1 кладем самое главное

- наш нужный макрос
Сохраняем это как обычную книгу и еще как надстройку.
Регистрируем надстройку (меню Сервис/Надстройки).
Теперь после включения надстройки бует появляться кнопка на стендартной панели инструментов и пункт в меню Сервис для запуска макроса QWE из нашей надстройки.
При отключения надстройки все удаляется.
Во время отладки у Вас накопится много лишних кнопок...

Прийдется удалять. Дело в том что при правке исходников значения глобальных переменных теряются и удаление кнопок не бует происходить нормамльно.
Чтобы в штатном режиме такого не происходило, перед сохранением надстройки исходники проекта лучше закрыть паролем, иначе при случайной правке получим как рах этот эффект.
Можно поступпить по другому:
Так как рабочие листы надстроек все равно не видны, то .Name добавленной кнопки можно сохранять в ячейку листа, а потом удалять кнопку, обратившись к ней по имени.
Добавлено: 28 дек 2004, 16:52
Circus
Спасибо, Наиль!
Добавлено: 29 дек 2004, 01:39
Naeel Maqsudov
Рано благодарите.
Хоть все работает, но весь этот изолретенный мною велосипед никуда не годится.
процедуру register надо изменить так
Код: Выделить всё
Private Sub register()
Dim Btn As CommandBarButton
On Error Resume Next
Set btn = Application.CommandBars("Tools").Controls.Add(msoControlButton, 2950,,,True)
btn.Caption = "run the qwe"
btn.OnAction = ThisWorkbook.Name & "!qwe"
Set btn = Application.CommandBars("Standard").Controls.Add(msoControlButton, 2950,,,True)
btn.Caption = "run the qwe"
btn.OnAction = ThisWorkbook.Name & "!qwe"
End Sub
А процедуру unregister и глобальные переменные btn и mnu вообще убрать нафиг.
Фишка в следубщем:
Application.CommandBars("Standard").Controls.Add(msoControlButton, 2950
,,,True)
Создает временную кнопку. Т.е. когда надстройка грузится она должна добавлять ВРЕМЕННУЮ кнопку, которая существует только на эотот сеанс MSExcel.
Добавлено: 29 дек 2004, 16:33
Circus
::

)) отлично!
Только что делать с кучей кнопок ..... ::

)))
Не готов подробно рассказать о результатах - скажу только, что зацепка очень пригодилась. Правда, я полез по зацепке в хелп и наваял 2-й вариант - он добавляет не строки в "Сервис", а собственную панель с кнопками. Но не доделал, сморило.
Ночкой попробую Ваш.
Кстати, где территориально находитесь?