Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.07.2011
Сообщений: 22
1

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

25.07.2007, 19:43. Показов 3780. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Используя событие Workbook_Open() создаю дополнительный пункт в конце стандартного меню. При закрытии книги удаляю.



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


0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2007, 19:43
Ответы с готовыми решениями:

Двумерный массив заполняется рандомом, вывести его только в том случае если сумма элементов массива будет = 0
вот мой вариант может нужно что-то подправить. var sum:integer; begin sum:=0; for...

Как сделать чтобы объект создавался только один раз?
Пытаюсь сделать объект (класс), который будет вести лог. Как сделать, чтобы инициирование...

Как сделать так, чтобы после нажатия на пункт меню страница прокручивалась до якоря и меню закрывалось?
Привет всем, у меня есть html код страницы со вставками javascript кода. Имеется два javascripta,...

Сделать так, чтобы можно было нажать на кнопку только в случае, если выбран один из Checkbox'ов
Нужна помощь. Есть на форме 2 checkbox и кнопка, нужно чтобы мы могли нажать на кнопку в случае...

8
SHMEL
25.07.2007, 19:48 2
А примерный код могно глянуть?
Может с условием поиграть?
0 / 0 / 0
Регистрация: 25.07.2011
Сообщений: 22
25.07.2007, 20:06  [ТС] 3
вот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
0
SHMEL
25.07.2007, 20:20 4
А если вообще ее не удалять?! или нужно очень?
0 / 0 / 0
Регистрация: 25.07.2011
Сообщений: 22
25.07.2007, 20:28  [ТС] 5
Если открыть две книги, с таким кодом и разными именами, то появятся два одинаковых пункта. А мне надо при открытии второй, да и всех последующих книг, если пункт уже есть, то не добавлять его.
0
0 / 0 / 1
Регистрация: 11.10.2010
Сообщений: 363
25.07.2007, 21:56 6
Кривовато, но работать будет:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
С уважением,
0
0 / 0 / 0
Регистрация: 25.07.2011
Сообщений: 22
25.07.2007, 22:23  [ТС] 7
спасибо babken76

я решил по другому

в событии Workbook_Open() до тго как добавить, просто сбрасываю по умолчанию
Visual Basic
1
Application.CommandBars("Worksheet Menu Bar").Reset
и убираю удаление
Visual Basic
1
2
3
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    objCmdBrPopup.Delete
End Sub
вместо него добавляю
Visual Basic
1
2
3
4
5
6
7
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
таким образом при открытии второй и последующих книг данного типа пункт "Баланс" будет только один. При закрытии всех книг данного типа, либо при переключении на книги другого типа пункта не будет видно.
0
rufus
27.07.2007, 17:26 8
babken76, я немного модифицировал твой код и хотел оформить его в виде надстройки. Но я столкнулся с проблемой. Из текущей книги не видны процедуры надстройки. Как можно побороть это?

Вот мой код.

Надстройка CreateCustomMenu.xla:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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".

В чем дело?
rufus
27.07.2007, 19:00 9
Сам разобрался
Оказывается, надо сначала загрузить надстройку, если она еще не загружена:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
' Проверка, загружена ли надстройка. Если нет, загружаем ее.
Sub AddInCheck()
    On Error Resume Next    ' turn off error checking
    Set wbMyAddin = Workbooks("CreateCustomMenu.xla")
    lastError = Err
    On Error GoTo 0        ' restore error checking
    If lastError <> 0 Then
        ' the add-in workbook isn't currently open. Manually open it.
        Set wbMyAddin = Workbooks.Open("CreateCustomMenu.xla")
    End If
End Sub
А вызывать процедуры надстройки из основной книги можно так:
Visual Basic
1
    Workbooks("CreateCustomMenu.xla").Application.Run "CreateMenuIfNotExist", "test2", arrTest1Submenus()
27.07.2007, 19:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2007, 19:00
Помогаю со студенческими работами здесь

Как сделать, чтобы Окрашивался выбранный пункт меню, в который перешёл
Есть готовое меню. Как сделать, чтобы при переходе по Выбранному пункту меню, он был окрашен....

Как сделать, чтобы при наведении на пункт меню двигалась стрелка
Здравствуйте! Подскажите пожалуйста, как сделать такое меню, чтобы при нажатии на пункт меню...

Переменной k логического типа присвоить значение true в том случае, если массив n целых чисел упорядочен по возрастанию, i значение false если нет
Условие задачи: Переменной k логического типа присвоить значение true в том случае, если массив n...

Border у body работает только в том случае если у него установлено значение float
Резиновый сайт ширина которого от 960 до 1280. По середине лого, ширина которого 100%. Дальше идет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru