Создание нового меню

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

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

aks_sv
Сообщения: 53
Зарегистрирован: 30 окт 2007, 06:38

Как сделать, чтобы при открытии файла в Excel на панели инструментов (там где "файл", "правка", "вид"...) появлялось пользовательское меню с подменю, которым присвоены макросы, а при при завершении работы с Excel удалялось автоматически?
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

aks_sv писал(а):Как сделать, чтобы при открытии файла в Excel на панели инструментов (там где "файл", "правка", "вид"...) появлялось пользовательское меню с подменю, которым присвоены макросы, а при при завершении работы с Excel удалялось автоматически?
Нужно программно создать это меню - по какому-то событию типа Open, а потом так же программно удалить - наверное, по событию книги Close или Deactivate. Старик Уокенбах об этом писал. Код работает для Экселя 2003 - для 2007-го, как я понял, нет.
Sub CreateMenu()
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim Submenuitem As CommandBarButton

' Óäàëåíèå ìåíþ, åñëè òàêîâîå ñóùåñòâóåò
Call DeleteMenu

' Ïîèñê ìåíþ Ñïðàâêà
Set HelpMenu = CommandBars(1).FindControl(Id:=30010)

If HelpMenu Is Nothing Then
' Äîáàâëåíèå ìåíþ â êîíåö ñòðîêè ìåíþ
Set NewMenu = CommandBars(1).Controls.Add _
(Type:=msoControlPopup, _
temporary:=True)
Else
' Äîáàâëåíèå ìåíþ ïåðåä ìåíþ Help
Set NewMenu = CommandBars(1).Controls.Add _
(Type:=msoControlPopup, _
Before:=HelpMenu.Index, _
temporary:=True)
End If

' Äîáàâëåíèå ïîäïèñè
NewMenu.Caption = "&Áþäæåò"

' Ïåðâûé ýëåìåíò ìåíþ
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "&Ââåäåíèå äàííûõ..."
.FaceId = 162
.OnAction = "Macro1"
End With

' Âòîðîé ýëåìåíò ìåíþ
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "&Ãåíåðàöèÿ îò÷åòà..."
.FaceId = 590
.OnAction = "Macro2"
End With

' Òðåòèé ýëåìåíò ìåíþ
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlPopup)
With MenuItem
.Caption = "Ïðîñìîòð &äèàãðàìì"
.BeginGroup = True
End With

' ×åòâåðòûé ýëåìåíò ìåíþ
Set Submenuitem = MenuItem.Controls.Add _
(Type:=msoControlButton)
With Submenuitem
.Caption = "Åæåìåñÿ÷íîå èçìåíåíèå"
.FaceId = 420
.OnAction = "Macro3"
End With

' SECOND SUBMENU ITEM
Set Submenuitem = MenuItem.Controls.Add _
(Type:=msoControlButton)
With Submenuitem
.Caption = "Îò÷åò çà &ãîä"
.FaceId = 422
.OnAction = "Macro4"
End With

End Sub
aks_sv
Сообщения: 53
Зарегистрирован: 30 окт 2007, 06:38

[quote="packer"]Нужно программно создать это меню - по какому-то событию типа Open, а потом так же программно удалить - наверное, по событию книги Close или Deactivate. Старик Уокенбах об этом писал. Код работает для Экселя 2003 - для 2007-го, как я понял, нет.

Спасибо, буду разбираться. Только коментарии у Вас в какой-то кодировке, ничего не разобрать.
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

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

правда... ваше меню будет не в одном ряду с меню файл,правка, вставить.
а на панельке пониже.
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

aks_sv писал(а):
Спасибо, буду разбираться. Только коментарии у Вас в какой-то кодировке, ничего не разобрать.
Весь код примера из книги Уокенбаха ниже в верной кодировке.
MSDN читать об объекте CommandBarControl. .OnAction = "Macro2" - привязка макроса к эл-ту меню.
Основное - правильно процедуру прикрутить к обработчику события. Т.к. книг может быть Эксельных открыто много, лучшим вар-том будет создавать-убирать меню по событию Этой_Книги Активэйт-Деактивэйт - чтобы в остальных открытых книгах этот пункт меню не мешался. По этой же причине лучше создавать меню программно, а не вручную.
Sub CreateMenu()
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim Submenuitem As CommandBarButton

' Удаление меню, если таковое существует
Call DeleteMenu

' Поиск меню Справка
Set HelpMenu = CommandBars(1).FindControl(Id:=30010)

If HelpMenu Is Nothing Then
' Добавление меню в конец строки меню
Set NewMenu = CommandBars(1).Controls.Add _
(Type:=msoControlPopup, _
temporary:=True)
Else
' Добавление меню перед меню Help
Set NewMenu = CommandBars(1).Controls.Add _
(Type:=msoControlPopup, _
Before:=HelpMenu.Index, _
temporary:=True)
End If

' Добавление подписи
NewMenu.Caption = "&Бюджет"

' Первый элемент меню
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "&Введение данных..."
.FaceId = 162
.OnAction = "Macro1"
End With

' Второй элемент меню
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "&Генерация отчета..."
.FaceId = 590
.OnAction = "Macro2"
End With

' Третий элемент меню
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlPopup)
With MenuItem
.Caption = "Просмотр &диаграмм"
.BeginGroup = True
End With

' Четвертый элемент меню
Set Submenuitem = MenuItem.Controls.Add _
(Type:=msoControlButton)
With Submenuitem
.Caption = "Ежемесячное изменение"
.FaceId = 420
.OnAction = "Macro3"
End With

' SECOND SUBMENU ITEM
Set Submenuitem = MenuItem.Controls.Add _
(Type:=msoControlButton)
With Submenuitem
.Caption = "Отчет за &год"
.FaceId = 422
.OnAction = "Macro4"
End With

End Sub
Sub DataEntryMacro()
MsgBox "Привет! Это макрос введения данных"
End Sub
Sub Macro1()
MsgBox "Этот макрос не выполняет полезных функций."
End Sub
Sub Macro2()
MsgBox "Этот макрос не выполняет полезных функций."
End Sub
Sub Macro3()
MsgBox "Этот макрос не выполняет полезных функций."
End Sub
Sub Macro4()
MsgBox "Этот макрос не выполняет полезных функций."
End Sub


Sub DeleteMenu()
On Error Resume Next
CommandBars(1).Controls("Бюджет").Delete
End Sub
aks_sv
Сообщения: 53
Зарегистрирован: 30 окт 2007, 06:38

Packer!
Спасибо, все красиво и доходчиво
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

еще два примера для комплекта...
Вложения
Add_Delete_menu.zip
(13.7 КБ) 85 скачиваний
aks_sv
Сообщения: 53
Зарегистрирован: 30 окт 2007, 06:38

Avsha,
&quot писал(а):еще два примера для комплекта...
Благодарю.
PS
В Add_Delete_menu_Panel.xls где коды панели "закопаны"?
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

to aks_sv

как я раньше упомянал...
"меню можно создать РУКАМИ и положить в вашу панель инструментов"

думаю, это одно из преимуществ для тех кто не очень знаком с VBA,
что меню/панель можно создавать без использования макросов через режим Настройка
aks_sv
Сообщения: 53
Зарегистрирован: 30 окт 2007, 06:38

Avsha,
&quot писал(а):думаю, это одно из преимуществ для тех кто не очень знаком с VBA,
что меню/панель можно создавать без использования макросов через режим Настройка
Как РУКАМИ сделать панель я знал, только не знал, как ее удалить после закрытия файла - теперь с Вашей помощью знаю. Но все равно первый вариант мне нравится больше:
&quot писал(а):правда... ваше меню будет не в одном ряду с меню файл,правка, вставить.
а на панельке пониже.
Всем большое спасибо.
А кто подскажет где взять для макросов иконки - имеющихся в настройках маловато?
Ответить