Пользовательский пункт меню
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Пользовательский пункт меню Expand / Collapse
Автор
Сообщение
25.07.2007 15:43
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 01.04.2008 18:41
Сообщ.: 22, Visits: 162
Используя событие Workbook_Open() создаю дополнительный пункт в конце стандартного меню. При закрытии книги удаляю.

Как сделать, чтобы пункт меню создавался, только в том случае, если его еще нет, а если уже есть не создавался?

Сообщ. #914949
25.07.2007 15:48
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 27.07.2007 11:18
Сообщ.: 6, Visits: 28
А примерный код могно глянуть?

Может с условием поиграть? ;)

Незнаю че такое..

Сообщ. #914950
25.07.2007 16:06
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 01.04.2008 18:41
Сообщ.: 22, Visits: 162
вот код:


Option Explicit

Dim objCmdBrPopup As CommandBarPopup

Private Sub Workbook_Open()

Set objCmdBrPopup = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlPopup, , , , True)

With objCmdBrPopup
.Caption = "Баланс"
With .Controls
With .Add(Type:=msoControlButton)
.Caption = "Новый лист"
.OnAction = "AddNewSheet_Run"
End With

With .Add(Type:=msoControlButton)
.Caption = "Период"
.OnAction = "Period_Run"
End With

With .Add(Type:=msoControlButton)
.Caption = "Отчет"
.OnAction = "Report_Run"
End With

With .Add(Type:=msoControlButton)
.Caption = "Список поставщиков"
.OnAction = "ListC_Run"
End With
End With
End With

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
objCmdBrPopup.Delete
End Sub
Сообщ. #914952
25.07.2007 16:20
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 27.07.2007 11:18
Сообщ.: 6, Visits: 28
А если вообще ее не удалять?! ;) или нужно очень?

Незнаю че такое..
Сообщ. #914954
25.07.2007 16:28
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 01.04.2008 18:41
Сообщ.: 22, Visits: 162
Если открыть две книги, с таким кодом и разными именами, то появятся два одинаковых пункта. А мне надо при открытии второй, да и всех последующих книг, если пункт уже есть, то не добавлять его.
Сообщ. #914956
25.07.2007 17:56
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Кривовато, но работать будет:

Dim objCmdBrPopup As CommandBarPopup

Private Sub Workbook_Open()
flag = False
For Each bar In Application.CommandBars("Worksheet Menu Bar").Controls
If Not bar.BuiltIn Then
flag = True
End If
Next
If flag = False Then create_menu
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
objCmdBrPopup.Delete
End Sub
Sub create_menu()
Set objCmdBrPopup = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlPopup, , , , True)
With objCmdBrPopup
.Caption = "Áàëàíñ"
With .Controls
With .Add(Type:=msoControlButton)
.Caption = "Íîâûé ëèñò"
.OnAction = "AddNewSheet_Run"
End With
With .Add(Type:=msoControlButton)
.Caption = "Ïåðèîä"
.OnAction = "Period_Run"
End With
With .Add(Type:=msoControlButton)
.Caption = "Îò÷åò"
.OnAction = "Report_Run"
End With
With .Add(Type:=msoControlButton)
.Caption = "Ñïèñîê ïîñòàâùèêîâ"
.OnAction = "ListC_Run"
End With
End With
End With
End Sub


С уважением,
Сообщ. #914957
25.07.2007 18:23
Junior Member

Junior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior MemberJunior Member

участник
Last Login: 01.04.2008 18:41
Сообщ.: 22, Visits: 162
спасибо babken76

я решил по другому
в событии Workbook_Open() до тго как добавить, просто сбрасываю по умолчанию
Application.CommandBars("Worksheet Menu Bar").Reset

и убираю удаление

Private Sub Workbook_BeforeClose(Cancel As Boolean)
objCmdBrPopup.Delete
End Sub

вместо него добавляю

Private Sub Workbook_Activate()
Application.CommandBars("Worksheet Menu Bar").Controls("Баланс").Visible = True
End Sub

Private Sub Workbook_Deactivate()
Application.CommandBars("Worksheet Menu Bar").Controls("Баланс").Visible = False
End Sub

таким образом при открытии второй и последующих книг данного типа пункт "Баланс" будет только один. При закрытии всех книг данного типа, либо при переключении на книги другого типа пункта не будет видно.
Сообщ. #914958
27.07.2007 13:26
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 21.02.2008 23:24
Сообщ.: 7, Visits: 30
babken76,

я немного модифицировал твой код и хотел оформить его в виде надстройки. Но я столкнулся с проблемой. Из текущей книги не видны процедуры надстройки. Как можно побороть это?

Вот мой код.

Надстройка CreateCustomMenu.xla:

Dim objCmdBrPopup As CommandBarPopup

' Проверка, есть ли меню с именем sMenuName.
' Если нет, то создаем меню с именем sMenuName и подменю из массива arrSubmenus()
Public Sub CreateMenuIfNotExist(sMenuName, arrSubmenus())

flag = True

For Each bar In Application.CommandBars("Worksheet Menu Bar").Controls
If bar.Caption = sMenuName Then
flag = False
End If
Next

If flag = True Then Call create_menu(sMenuName, arrSubmenus())

End Sub

' Удаление меню, созданного при открытии этой книги.
Public Sub DeleteMenu(Cancel As Boolean)
If Not objCmdBrPopup Is Nothing Then
objCmdBrPopup.Delete
End If
End Sub

' Создание меню с именем sMenuName и подменю из массива arrSubmenus()
' arrSubmenus(0, i): название подменю
' arrSubmenus(1, i): ассоциированный макрос
' arrSubmenus(2, i): если = True, то начать новую группу
Sub create_menu(sMenuName, arrSubmenus())

Set objCmdBrPopup = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlPopup, , , , True)

With objCmdBrPopup
.Caption = sMenuName
For i = 0 To UBound(arrSubmenus, 2)
With .Controls
With .Add(Type:=msoControlButton)
.Caption = arrSubmenus(0, i) 'submenu name
.OnAction = arrSubmenus(1, i) 'submenu macro
.BeginGroup = arrSubmenus(2, i) 'begin a new group
End With
End With
Next i
End With

End Sub


Вызов из основной книги Excel:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeleteMenu(Cancel)
End Sub

Private Sub Workbook_Open()
Dim arrTest1Submenus()
ReDim arrTest1Submenus(2, 2)
arrTest1Submenus(0, 0) = "submenu 1"
arrTest1Submenus(1, 0) = "macro 1"
arrTest1Submenus(2, 0) = False
arrTest1Submenus(0, 1) = "submenu 2"
arrTest1Submenus(1, 1) = "macro 2"
arrTest1Submenus(2, 1) = False
arrTest1Submenus(0, 2) = "submenu 3"
arrTest1Submenus(1, 2) = "macro 3"
arrTest1Submenus(2, 2) = True
Call CreateMenuIfNotExist("test", arrTest1Submenus())
End Sub


В процедуре Workbook_Open() при вызове проц. CreateMenuIfNotExist выдается ошибка "Sub or function not defined".
В чем дело?
Сообщ. #914995