powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
25 сообщений из 25, страница 1 из 1
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230133
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню:
Файл Правка Вид Вставка Формат Сервис Таблица Окно Справка Меню1 Меню2
и можно между пунктами меню Справка и Меню1 сделать пробелы, чтобы оно было чуть встороне
И главное, создать так, чтобы это меню было с одного пункта, то есть не раскрывающееся, на цифру 1 повесить горячую клавишу, то есть Альт + 1
Спасибо
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230255
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub test()
    Dim ctl As CommandBarControl
    Dim strTag As String
    
    strTag = "MyControl"
    
    On Error Resume Next
    Application.CommandBars( 1 ).FindControl(Type:=msoControlPopup, Tag:=strTag, Recursive:=True).Delete
    On Error GoTo  0 
    Set ctl = Application.CommandBars( 1 ).Controls.Add(Type:=msoControlPopup, Temporary:=True)
    With ctl
        .Caption = "Меню&1"
        .Tag = strTag
        .BeginGroup = True
        .TooltipText = "Мое меню"
        .OnAction = "Dummy"
    End With
End Sub

Sub dummy()
    MsgBox "Hello world!"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230266
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL), спасибо, соль вопроса: создать меню следом за стандартными пунктами меню
и
между пунктами меню Справка и Меню1 сделать пробелы,
Код: plaintext
чтобы оно было чуть встороне
там места ещё навалом
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230314
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня и в Справке все добавляется следом . Вот с пробелом:

Код: plaintext
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.
Sub test()
    Dim ctlMenu As CommandBarControl
    Dim ctlSpace As CommandBarControl
    Dim strTagMenu As String
    Dim strTagSpace As String
    
    strTagMenu = "MyControl"
    strTagSpace = "MySpace"
    
    With Application.CommandBars( 1 )
        On Error Resume Next
        .FindControl(Type:=msoControlPopup, Tag:=strTagMenu, Recursive:=True).Delete
        .FindControl(Type:=msoControlButton, Tag:=strTagSpace, Recursive:=True).Delete
        On Error GoTo  0 
        Set ctlSpace = .Controls.Add(Type:=msoControlButton, Temporary:=True)
    End With
    
    With ctlSpace
        .Tag = strTagSpace
        .Enabled = False
        .Width =  200 
    End With
    
    Set ctlMenu = Application.CommandBars( 1 ).Controls.Add(Type:=msoControlPopup, Temporary:=True)
    With ctlMenu
        .Caption = "Menu&1"
        .Tag = strTagMenu
        .TooltipText = "My menu"
        .OnAction = "Dummy"
    End With
End Sub

Sub dummy()
    MsgBox "Hello world!"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230323
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, не учел что Index главного меню в Word отличается от Excel:

Код: plaintext
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.
Option Explicit

Sub test()
    Dim ctlMenu As CommandBarControl
    Dim ctlSpace As CommandBarControl
    Dim strTagMenu As String
    Dim strTagSpace As String
    
    strTagMenu = "MyControl"
    strTagSpace = "MySpace"
    
    With Application.CommandBars("Menu Bar")
        On Error Resume Next
        .FindControl(Type:=msoControlPopup, Tag:=strTagMenu, Recursive:=True).Delete
        .FindControl(Type:=msoControlButton, Tag:=strTagSpace, Recursive:=True).Delete
        On Error GoTo  0 
        Set ctlSpace = .Controls.Add(Type:=msoControlButton, Temporary:=True)
        Set ctlMenu = .Controls.Add(Type:=msoControlPopup, Temporary:=True)
    End With
    
    With ctlSpace
        .Tag = strTagSpace
        .Enabled = False
        .Width =  300 
    End With
    
    With ctlMenu
        .Caption = "Menu&1"
        .Tag = strTagMenu
        .TooltipText = "My menu"
        .OnAction = "Dummy"
    End With
End Sub

Sub dummy()
    MsgBox "Hello world!"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230354
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL), спасибо
не понятно лишь назначение строк:
Код: plaintext
1.
.Tag = strTagSpace
.Tag = strTagMenu
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230377
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то не думал, что проблемы будут с добавлением 2, 3 меню, думал просто отсупы
1 й кнопки - .Width = 100
2 й кнопки - .Width = 150
3 й кнопки - .Width = 200
и всё, а нет, в чём хитрость??
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230392
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрючто-то не думал, что проблемы будут с добавлением 2, 3 меню, думал просто отсупы
1 й кнопки - .Width = 100
2 й кнопки - .Width = 150
3 й кнопки - .Width = 200
и всё, а нет, в чём хитрость??

здесь всё понял, сделал, осталось
не понятно лишь назначение строк:

.Tag = strTagSpace
.Tag = strTagMenu
??????
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230399
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не врубился с отступами, три пункта меню
что так делаю отступы
.Width = 100
.Width = 100.5
.Width = 101
или
.Width = 100
.Width = 110
.Width = 120
Отступы одинаковы, почему??????7
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230447
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) назначение строк

Код: plaintext
1.
.Tag = strTagSpace
.Tag = strTagMenu

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

Код: plaintext
1.
.FindControl(Type:=msoControlPopup, Tag:=strTagMenu, Recursive:=True).Delete
.FindControl(Type:=msoControlButton, Tag:=strTagSpace, Recursive:=True).Delete

2) смысл решения в том, что для пробела используется отключенная кнопка нужной ширины. Т.е. общее кол-во контролов = кол-во меню + кол-во пробелов:

Код: plaintext
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.
Option Explicit

Sub test()
    Dim strTagMenu As String
    Dim strTagSpace As String
    Dim i As Long
    
    strTagMenu = "MyControl"
    strTagSpace = "MySpace"
    
    With Application.CommandBars("Menu Bar")
        On Error Resume Next
        For i =  1  To  3 
            .FindControl(Type:=msoControlPopup, Tag:=strTagMenu, Recursive:=True).Delete
            .FindControl(Type:=msoControlButton, Tag:=strTagSpace, Recursive:=True).Delete
        Next i
        On Error GoTo  0 
        For i =  1  To  3 
            With .Controls.Add(Type:=msoControlButton, Temporary:=True)
                .Tag = strTagSpace
                .Enabled = False
                .Width = IIf(i =  1 ,  200 ,  5 )
            End With
            With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
                .Caption = "Menu&" & i
                .Tag = strTagMenu
                .TooltipText = "My menu " & i
                .OnAction = "Dummy"
            End With
        Next i
    End With
    
End Sub

Sub dummy()
    MsgBox "Hello world!"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230451
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще немного упростить:

Код: plaintext
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

Sub test()
    Dim strTag As String
    Dim i As Long
    
    strTag = "MyControl"
    
    With Application.CommandBars("Menu Bar")
        On Error Resume Next
        For i =  1  To  3 
            .FindControl(Type:=msoControlPopup, Tag:=strTag, Recursive:=True).Delete
            .FindControl(Type:=msoControlButton, Tag:=strTag, Recursive:=True).Delete
        Next i
        On Error GoTo  0 
        For i =  1  To  3 
            With .Controls.Add(Type:=msoControlButton, Temporary:=True)
                .Tag = strTag
                .Enabled = False
                .Width = IIf(i =  1 ,  200 ,  5 )
            End With
            With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
                .Caption = "Menu&" & i
                .Tag = strTag
                .TooltipText = "My menu " & i
                .OnAction = "Dummy"
            End With
        Next i
    End With
    
End Sub

Sub dummy()
    MsgBox "Hello world!"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230618
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL), Спасибо как снежный ком, тепеь не понятно
в строке
.Width = IIf(i = 1, 200, 5)
IIf - чо означает, думал ошиблись с If спутали, а нет всё верно??
i = 1 что означает и почему после прохождения в цикле где i=2 после этой строки i не становится равно 1, а также остаётся равна согласно циклу??
200 что означает??
5 что означает??
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230619
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вот что хотел спросить в строке .OnAction = "Dummy"
если я её напишу ко всем пунктам меню потом можно и как в процедуре распаралелить, то есть, как то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub dummy()
  
If Нажали меню  1  Theh
.....
ElseIf  Нажали меню  2  Then
.....
ElseIf  Нажали меню  3  Then
....
End If

End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230628
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрю,

лучше на каждый пункт свой "Dummy"
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230633
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диклевич Александр, понял
Вот я ещё забыл, как то же натыкался на галочку стандартное меню показывать выше остальных, где она, кто помнит?
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230644
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё в блоке
Код: plaintext
1.
2.
3.
4.
For i =  1  To  3 
             'удаляет ранее созданные меню
            .FindControl(Type:=msoControlPopup, Tag:=strTag, Recursive:=True).Delete
            .FindControl(Type:=msoControlButton, Tag:=strTag, Recursive:=True).Delete
        Next i

Зря мне кажется до 3х цикл, надо наверное Фор Еах, я в них не силён, подправьте пжл
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230864
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович ЭндрюЗря мне кажется до 3х цикл, надо наверное Фор Еах, я в них не силён, подправьте пжл
Нет, не зря. For Each Next значительно замедлит цикл т.к. в добавок к рекурсивному поиску будет перебор всех контролов
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230870
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович ЭндрюKL (XL), Спасибо как снежный ком, тепеь не понятно
в строке
.Width = IIf(i = 1, 200, 5)
IIf - чо означает, думал ошиблись с If спутали, а нет всё верно??
i = 1 что означает и почему после прохождения в цикле где i=2 после этой строки i не становится равно 1, а также остаётся равна согласно циклу??
200 что означает??
5 что означает??
Это эквивалент функции IF с тем же синтаксисом, что и функция рабочего листа.

Если i = 1, то 200, в противном случае 5

иными словами: первый пробел - 200, остальные - 5
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230875
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрюи вот что хотел спросить в строке .OnAction = "Dummy"
если я её напишу ко всем пунктам меню потом можно и как в процедуре распаралелить, то есть, как то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub dummy()
  
If Нажали меню  1  Theh
.....
ElseIf  Нажали меню  2  Then
.....
ElseIf  Нажали меню  3  Then
....
End If

End Sub


Можно так. Можно присваивать имя процедуры для .OnAction из массива:

Код: plaintext
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.
Option Explicit

Sub test()
    Dim strTag As String
    Dim i As Long
    Dim arrProcs As Variant
    
    strTag = "MyControl"
    arrProcs=Array("Dummy1","Dummy2","Dummy3")

    With Application.CommandBars("Menu Bar")
        On Error Resume Next
        For i =  1  To  3 
            .FindControl(Type:=msoControlPopup, Tag:=strTag, Recursive:=True).Delete
            .FindControl(Type:=msoControlButton, Tag:=strTag, Recursive:=True).Delete
        Next i
        On Error GoTo  0 
        For i =  1  To  3 
            With .Controls.Add(Type:=msoControlButton, Temporary:=True)
                .Tag = strTag
                .Enabled = False
                .Width = IIf(i =  1 ,  200 ,  5 )
            End With
            With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
                .Caption = "Menu&" & i
                .Tag = strTag
                .TooltipText = "My menu " & i
                .OnAction = arrProcs(i- 1 )
            End With
        Next i
    End With
    
End Sub

Можно вообще не использовать цикл (он был лишь для наглядности) и все "захардкодить" (от hard-code) :)
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230887
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL), спасибо, всё ясно как белый день
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37230926
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой подчищенный вариант (все параметры задаются до того, как создавать кнопки):

Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
Option Explicit

Sub test()
    Dim strTag As String
    Dim i As Long
    Dim arrCaptions As Variant
    Dim arrProcs As Variant
    Dim arrSpaces As Variant
    Dim cnt As Long

    strTag = "MyControl"
    arrCaptions = Array("Menu&1", "Menu&2", "Menu&3")
    arrProcs = Array("ProcOne", "ProcTwo", "ProcThree")
    arrSpaces = Array( 200 ,  10 ,  10 )
    cnt = UBound(arrProcs)

    With Application.CommandBars("Menu Bar")
        On Error Resume Next
        For i =  0  To cnt *  2  +  1 
            .FindControl(Type:=msoControlPopup, Tag:=strTag, Recursive:=True).Delete
        Next i
        On Error GoTo  0 
        For i =  0  To cnt
            With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
                .Tag = strTag
                .Enabled = False
                .Width = arrSpaces(i)
            End With
            With .Controls.Add(Type:=msoControlPopup, Temporary:=True)
                .Caption = arrCaptions(i)
                .Tag = strTag
                .OnAction = arrProcs(i)
            End With
        Next i
    End With
End Sub

Sub ProcOne()
    MsgBox "Proc 1"
End Sub

Sub ProcTwo()
    MsgBox "Proc 2"
End Sub

Sub ProcThree()
    MsgBox "Proc 3"
End Sub
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37231285
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL), всё же подумал, для другого скрипта
>Нет, не зря. For Each Next значительно замедлит цикл т.к. в добавок к рекурсивному поиску будет перебор всех контролов
Как перебрать все меню со вложениями и без них и загнать в цикл, от них интерисует только
.Caption =
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37231289
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не ну отступы это загадка, что так делаешь
.Width = IIf(i = 1, 1, 0), что так .Width = 0
эффект один
???????
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37232629
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал я код пробежаться по всем меню, без фор еахов, они мне не поддаются :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CommandBars_Menu_Bar_Controls_Count = ActiveDocument.CommandBars("Menu Bar").Controls.Count
    For j =  1  To CommandBars_Menu_Bar_Controls_Count
    Name_CommandBars_Menu_Bar_Controls = ActiveDocument.CommandBars("Menu Bar").Controls(j).Caption
    TooltipText_CommandBars_Menu_Bar_Controls = ActiveDocument.CommandBars("Menu Bar").Controls(j).TooltipText
    On Error Resume Next
    OnAction_CommandBars_Menu_Bar_Controls = ActiveDocument.CommandBars("Menu Bar").Controls(j).OnAction
    'ошибка 438 Object doesn't support this property or method  Объект не поддерживает это свойство или метод
    If Err.Number =  438  Then OnAction_CommandBars_Menu_Bar_Controls = ""
    On Error GoTo  0 
    Selection.TypeText Text:=j & " " & Name_CommandBars_Menu_Bar_Controls & " " & TooltipText_CommandBars_Menu_Bar_Controls & " " & OnAction_CommandBars_Menu_Bar_Controls & Chr( 13 )
    Next
1 &Файл
2 &Правка
3 &Вид
4 Вст&авка
5 Фор&мат
6 С&ервис
7 &Таблица
8 Де&йствие
9 &Окно
10 &Справка
11
12 &1 Настройки Окрыть форму настроек, Alt + 1 Меню_настройки
13
14 &2 Ф Окрыть Ф, Alt + 2 Меню_Ф
15
16 &3 К Окрыть К, Alt + 3 Меню_К

Странности пункт 8 Действие – Отродясь его не было???
эту строку, сначала так запускал
'.Width = 0
потом так
.Width = 0
всё равно получаются пробелы – 11, 13, 15 пункт меню???? Как их убрать?? точнее как ими управлять?? чтобы я понимал что происходит
...
Рейтинг: 0 / 0
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
    #37232632
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, а как добится чтобы все вложенные сюда попадали???
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]