Прицепить к кнопке в панели инструментов программу?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Circus
Сообщения: 8
Зарегистрирован: 06 сен 2004, 19:52
Контактная информация:

Добрый день, уважаемые!
Хочу вот запускать несколько прог. кнопками в новой панели инструментов.
Проблема - программы были макросами, хранящимися в самих файлах. Для унификации решил перенести их в новую надстройку, там они работают прекрасно. Редактор ВБ их видит отлично.
Но их перестали видеть все кнопки!

Итак, есть кнопка в панели инструментов. Есть программа на ВБ, написанная в редакторе но вставленная в файл надстройки. Как сделать так, что бы она пускалась нажатием этой кнопки?

Первое ощущение - кнопки и иная лабуда видит МАКРОСЫ, а код на ВБ - не видит. Заранее спасибо!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Какое приложение? (Word, Excel...)
Что вы понимаете под надстройкой?

В Excel, например, файл .XLA является надстройкой. При инициализации надстройка добавляет свои кнопки/пункты меню. И все замечательно работает.

В Word для централизованного хранения макросов удобно использовать шаблоны, так как панель инструментов может быть сохранена в шаблоне и будет автоматически появляться при активации окна с документом, основанном на данном шаблоне. Чрезвычайно удобно.

В... Короче, что надо? :)
Circus
Сообщения: 8
Зарегистрирован: 06 сен 2004, 19:52
Контактная информация:

Эксел.
Ага, понятно. Механизм приблизительно ясен. Просто не работает механизм "подключения" макроса к кнопке. Что бы работало в том случае, если код лежит в надстройке, нужно прописывать кнопки в самом коде.

Тогда такой вопрос. В хелпе все это есть наверняка, только я добираюсь до него ночью - и тяжело с англ. а с ВБ совсем плохо.
Как прописать просто кнопку (напр. из "Формы") я понял, а как прописать (т.е. создать или описать имя ее) в коде кнопку из панели инструментов?

Спасибо за ответ, Наиль, вы подарите мне ночь спокойного сна!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

В модуль 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 кладем самое главное :) - наш нужный макрос

Код: Выделить всё

Sub qwe()
  MsgBox 123
End Sub
Сохраняем это как обычную книгу и еще как надстройку.

Регистрируем надстройку (меню Сервис/Надстройки).

Теперь после включения надстройки бует появляться кнопка на стендартной панели инструментов и пункт в меню Сервис для запуска макроса QWE из нашей надстройки.

При отключения надстройки все удаляется.

Во время отладки у Вас накопится много лишних кнопок... :)
Прийдется удалять. Дело в том что при правке исходников значения глобальных переменных теряются и удаление кнопок не бует происходить нормамльно.
Чтобы в штатном режиме такого не происходило, перед сохранением надстройки исходники проекта лучше закрыть паролем, иначе при случайной правке получим как рах этот эффект.

Можно поступпить по другому:

Так как рабочие листы надстроек все равно не видны, то .Name добавленной кнопки можно сохранять в ячейку листа, а потом удалять кнопку, обратившись к ней по имени.
Circus
Сообщения: 8
Зарегистрирован: 06 сен 2004, 19:52
Контактная информация:

Спасибо, Наиль!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Рано благодарите.
Хоть все работает, но весь этот изолретенный мною велосипед никуда не годится.

процедуру 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.
Circus
Сообщения: 8
Зарегистрирован: 06 сен 2004, 19:52
Контактная информация:

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

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

Кстати, где территориально находитесь?
Ответить