Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню / 25 сообщений из 25, страница 1 из 1
23.04.2011, 13:57
    #37230133
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Подскажите, как при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню:
Файл Правка Вид Вставка Формат Сервис Таблица Окно Справка Меню1 Меню2
и можно между пунктами меню Справка и Меню1 сделать пробелы, чтобы оно было чуть встороне
И главное, создать так, чтобы это меню было с одного пункта, то есть не раскрывающееся, на цифру 1 повесить горячую клавишу, то есть Альт + 1
Спасибо
...
Рейтинг: 0 / 0
23.04.2011, 17:13
    #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
23.04.2011, 17:22
    #37230266
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
KL (XL), спасибо, соль вопроса: создать меню следом за стандартными пунктами меню
и
между пунктами меню Справка и Меню1 сделать пробелы,
Код: plaintext
чтобы оно было чуть встороне
там места ещё навалом
...
Рейтинг: 0 / 0
23.04.2011, 18:35
    #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
23.04.2011, 18:43
    #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
23.04.2011, 19:32
    #37230354
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
KL (XL), спасибо
не понятно лишь назначение строк:
Код: plaintext
1.
.Tag = strTagSpace
.Tag = strTagMenu
...
Рейтинг: 0 / 0
23.04.2011, 20:42
    #37230377
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
что-то не думал, что проблемы будут с добавлением 2, 3 меню, думал просто отсупы
1 й кнопки - .Width = 100
2 й кнопки - .Width = 150
3 й кнопки - .Width = 200
и всё, а нет, в чём хитрость??
...
Рейтинг: 0 / 0
23.04.2011, 21:17
    #37230392
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Ципихович Эндрючто-то не думал, что проблемы будут с добавлением 2, 3 меню, думал просто отсупы
1 й кнопки - .Width = 100
2 й кнопки - .Width = 150
3 й кнопки - .Width = 200
и всё, а нет, в чём хитрость??

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

.Tag = strTagSpace
.Tag = strTagMenu
??????
...
Рейтинг: 0 / 0
23.04.2011, 21:31
    #37230399
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
не врубился с отступами, три пункта меню
что так делаю отступы
.Width = 100
.Width = 100.5
.Width = 101
или
.Width = 100
.Width = 110
.Width = 120
Отступы одинаковы, почему??????7
...
Рейтинг: 0 / 0
23.04.2011, 22:49
    #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
23.04.2011, 22:52
    #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
24.04.2011, 08:50
    #37230618
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
KL (XL), Спасибо как снежный ком, тепеь не понятно
в строке
.Width = IIf(i = 1, 200, 5)
IIf - чо означает, думал ошиблись с If спутали, а нет всё верно??
i = 1 что означает и почему после прохождения в цикле где i=2 после этой строки i не становится равно 1, а также остаётся равна согласно циклу??
200 что означает??
5 что означает??
...
Рейтинг: 0 / 0
24.04.2011, 08:58
    #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
24.04.2011, 09:45
    #37230628
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Ципихович Эндрю,

лучше на каждый пункт свой "Dummy"
...
Рейтинг: 0 / 0
24.04.2011, 10:10
    #37230633
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Диклевич Александр, понял
Вот я ещё забыл, как то же натыкался на галочку стандартное меню показывать выше остальных, где она, кто помнит?
...
Рейтинг: 0 / 0
24.04.2011, 10:36
    #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
24.04.2011, 16:11
    #37230864
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
Ципихович ЭндрюЗря мне кажется до 3х цикл, надо наверное Фор Еах, я в них не силён, подправьте пжл
Нет, не зря. For Each Next значительно замедлит цикл т.к. в добавок к рекурсивному поиску будет перебор всех контролов
...
Рейтинг: 0 / 0
24.04.2011, 16:14
    #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
24.04.2011, 16:21
    #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
24.04.2011, 16:43
    #37230887
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
KL (XL), спасибо, всё ясно как белый день
...
Рейтинг: 0 / 0
24.04.2011, 17:33
    #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
25.04.2011, 04:59
    #37231285
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
KL (XL), всё же подумал, для другого скрипта
>Нет, не зря. For Each Next значительно замедлит цикл т.к. в добавок к рекурсивному поиску будет перебор всех контролов
Как перебрать все меню со вложениями и без них и загнать в цикл, от них интерисует только
.Caption =
...
Рейтинг: 0 / 0
25.04.2011, 05:17
    #37231289
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
не ну отступы это загадка, что так делаешь
.Width = IIf(i = 1, 1, 0), что так .Width = 0
эффект один
???????
...
Рейтинг: 0 / 0
25.04.2011, 19:44
    #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
25.04.2011, 19:45
    #37232632
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню
кстати, а как добится чтобы все вложенные сюда попадали???
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / при помощи ВБА в Ворде создать меню следом за стандартными пунктами меню / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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