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

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

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

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

Теперь после включения надстройки бует появляться кнопка на стендартной панели инструментов и пункт в меню Сервис для запуска макроса 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-й вариант - он добавляет не строки в "Сервис", а собственную панель с кнопками. Но не доделал, сморило.
Ночкой попробую Ваш.

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