Создание нового меню
Модератор: Naeel Maqsudov
Как сделать, чтобы при открытии файла в Excel на панели инструментов (там где "файл", "правка", "вид"...) появлялось пользовательское меню с подменю, которым присвоены макросы, а при при завершении работы с Excel удалялось автоматически?
-
- Сообщения: 17
- Зарегистрирован: 16 ноя 2007, 13:00
- Откуда: Ekaterinburg
- Контактная информация:
Нужно программно создать это меню - по какому-то событию типа Open, а потом так же программно удалить - наверное, по событию книги Close или Deactivate. Старик Уокенбах об этом писал. Код работает для Экселя 2003 - для 2007-го, как я понял, нет.aks_sv писал(а):Как сделать, чтобы при открытии файла в Excel на панели инструментов (там где "файл", "правка", "вид"...) появлялось пользовательское меню с подменю, которым присвоены макросы, а при при завершении работы с Excel удалялось автоматически?
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
[quote="packer"]Нужно программно создать это меню - по какому-то событию типа Open, а потом так же программно удалить - наверное, по событию книги Close или Deactivate. Старик Уокенбах об этом писал. Код работает для Экселя 2003 - для 2007-го, как я понял, нет.
Спасибо, буду разбираться. Только коментарии у Вас в какой-то кодировке, ничего не разобрать.
Спасибо, буду разбираться. Только коментарии у Вас в какой-то кодировке, ничего не разобрать.
создать собственную панель инструментов
меню можно создать руками и положить в вашу панель инструментов,
эту панель вложить в книгу,
в книге написать макрос на удаление этой панели при закрытии
правда... ваше меню будет не в одном ряду с меню файл,правка, вставить.
а на панельке пониже.
меню можно создать руками и положить в вашу панель инструментов,
эту панель вложить в книгу,
в книге написать макрос на удаление этой панели при закрытии
правда... ваше меню будет не в одном ряду с меню файл,правка, вставить.
а на панельке пониже.
-
- Сообщения: 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
Packer!
Спасибо, все красиво и доходчиво
Спасибо, все красиво и доходчиво
еще два примера для комплекта...
- Вложения
-
- Add_Delete_menu.zip
- (13.7 КБ) 85 скачиваний
Avsha,
PS
В Add_Delete_menu_Panel.xls где коды панели "закопаны"?
Благодарю." писал(а):еще два примера для комплекта...
PS
В Add_Delete_menu_Panel.xls где коды панели "закопаны"?
to aks_sv
как я раньше упомянал...
"меню можно создать РУКАМИ и положить в вашу панель инструментов"
думаю, это одно из преимуществ для тех кто не очень знаком с VBA,
что меню/панель можно создавать без использования макросов через режим Настройка
как я раньше упомянал...
"меню можно создать РУКАМИ и положить в вашу панель инструментов"
думаю, это одно из преимуществ для тех кто не очень знаком с VBA,
что меню/панель можно создавать без использования макросов через режим Настройка
Avsha,
А кто подскажет где взять для макросов иконки - имеющихся в настройках маловато?
Как РУКАМИ сделать панель я знал, только не знал, как ее удалить после закрытия файла - теперь с Вашей помощью знаю. Но все равно первый вариант мне нравится больше:" писал(а):думаю, это одно из преимуществ для тех кто не очень знаком с VBA,
что меню/панель можно создавать без использования макросов через режим Настройка
Всем большое спасибо." писал(а):правда... ваше меню будет не в одном ряду с меню файл,правка, вставить.
а на панельке пониже.
А кто подскажет где взять для макросов иконки - имеющихся в настройках маловато?