Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA For Excel Часть 02.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.08 Mб
Скачать

Удаление меню

Меню пользователя можно удалить через свойство Delete. Через свойство Reset можно очистить меню пользователя или меню приложения от добавленных пунктов. Если пользователь через программный код скрыл пункты меню приложения, то метод Reset сделает их видимыми. Т.к. этот метод восстанавливает стандартный вид меню приложения.

Пример:

Application.CommandBars("Имя меню").Delete

Добавление пунктов в меню

Пункт в меню добавляется методом Add объекта Controls, который является потомком объектов CommandBars и ActiveMenuBar.

Пример:

With CommandBars("Имя меню")

‘Установка указателя на объект

‘добавляющий пункт меню

Set mButton = _

.Controls.Add(Type:=msoControlButton, ID:=850)

With mButton

‘задание свойств пункта меню

.Caption = ”Мой пункт”

.OnAction = ”МойПункт”

End with

End with

В данном примере добавляется дополнительный пункт меню первого уровня. Входной не обязательный параметр Type метода Add используется для установки соответствующего типа добавляемого подпункта меню. Наиболее часто употребляемые значения этого свойства: msoControlButton – подпункт меню не содержит в себе других подпунктов, msoControlPopup – подпункт меню имеет продолжающийся список подпунктов следующего уровня. Если не обязательный, входной параметр ID метода Add имеет значение 850, то добавляемый пункт меню становится выделенным. После создания пункта меню задаются его свойства, о которых рассказано нами в главе Свойства и методы пункта меню.

Ниже приведены процедуры, предназначенные для добавления пунктов меню:

Private Sub ДанныеМеню(s As String, _

Группа As Boolean, Пиктограмма As String, _

ИмяСобытия, Подпись, id1 As Long)

Dim s1 As String, i as long

If InStr(s, ",") <> 0 Then

s1 = Mid(s, InStr(s, ",") + 1)

s = Mid(s, 1, InStr(s, ",") - 1)

Else

s1 = ""

End If

If Mid(s, 1, 1) = "_" Or Mid(s, 1, 1) = "-" Then

s = Mid(s, 2)

Группа = True

Else

Группа = False

End If

Пиктограмма = ""

While Mid(s, 1, 1) >= "0" _

And Mid(s, 1, 1) <= "9"

Пиктограмма = Пиктограмма + Mid(s, 1, 1)

s = Mid(s, 2)

Wend

If InStr(s, ";") <> 0 Then

ИмяСобытия = Mid(s, 1, InStr(s, ";") - 1)

Подпись = Mid(s, InStr(s, ";") + 1)

Else

ИмяСобытия = ""

For i = 1 To Len(s)

If Mid(s, i, 1) <> "&" _

And Mid(s, i, 1) <> " " Then

ИмяСобытия = ИмяСобытия + Mid(s, i, 1)

End If

Next i

Подпись = s

End If

If Подпись <> "" Then

If Mid(Подпись, Len(Подпись), 1) = " " Then

id1 = 850

Else

id1 = 1

End If

End If

Подпись = RTrim(Подпись)

s = s1

End Sub

Private Sub Добавление(Mbar, ByVal s As String)

Dim mButton As Variant, Пункт As Long, i As Long

Dim Пиктограмма As String, Группа As Boolean

Dim ИмяСобытия, Подпись, id1 As Long

ДанныеМеню s, Группа, Пиктограмма, _

ИмяСобытия, Подпись, id1

With Mbar

For i = 1 To 850 Step 849

If s = "" Then

Set mButton = _

.Controls.Add(Type:=msoControlButton, ID:=i)

Else

Set mButton = _

.Controls.Add(Type:=msoControlPopup)

End If

With mButton

Пункт = .Index

.Caption = Подпись

If i = 1 Then

.BeginGroup = Группа

End If

If s = "" Then

.OnAction = ИмяСобытия

If Пиктограмма <> "" Then

.FaceId = Val(Пиктограмма)

End If

If i = id1 Then

.Visible = True

Else

.Visible = False

End If

Else

Exit For

End If

End With

Подпись = Подпись + " "

Next i

End With

While s <> ""

ДанныеМеню s, Группа, Пиктограмма, _

ИмяСобытия, Подпись, id1

With Mbar.Controls(Пункт)

For i = 1 To 850 Step 849

Set mButton = _

.Controls.Add(Type:=msoControlButton, ID:=i)

With mButton

.Caption = Подпись

.OnAction = ИмяСобытия

If i = 1 Then

.BeginGroup = Группа

End If

If Пиктограмма <> "" Then

.FaceId = Val(Пиктограмма)

End If

If i = id1 Then

.Visible = True

Else

.Visible = False

End If

End With

Подпись = Подпись + " "

Next i

End With

Wend

End Sub

Sub ДобавитьПункты(ИмяМеню, _

ParamArray ПунктыМеню())

Dim m As Variant, Mbar As Variant

If ИмяМеню = "" Then

ИмяМеню = Application.CommandBars.ActiveMenuBar.Name

End If

Set Mbar = Application.CommandBars(ИмяМеню)

For Each m In ПунктыМеню

Добавление Mbar, m

Next m

End Sub

Sub ДобавитьПункты2(ИмяМеню, _

ПунктМеню1, ParamArray ПунктыМеню())

Dim m As Variant, Mbar As Variant, Index As Long

Dim Пиктограмма As String, Группа As Boolean

Dim ИмяСобытия, Подпись, id1 As Long

If ИмяМеню = "" Then

ИмяМеню = Application.CommandBars.ActiveMenuBar.Name

End If

Set Mbar = Application.CommandBars(ИмяМеню)

With Mbar

ДанныеМеню (ПунктМеню1), Группа, _

Пиктограмма, ИмяСобытия, Подпись, id1

With .Controls.Add(Type:=msoControlPopup)

Index = .Index

.Caption = Подпись

.BeginGroup = Группа

End With

End With

Set Mbar = _

Application.CommandBars(ИмяМеню).Controls(Index)

For Each m In ПунктыМеню

Добавление Mbar, m

Next m

End Sub

Данные процедуры необходимо создать в модуле макросов, того проекта, откуда будут добавляться пункты.

Для непосредственного добавления пунктов в меню используются подпрограммы ДобавитьПункты, ДобавитьПункты2.

Ниже приведена инструкция по входным параметрам данных процедур:

1) Необходимо задать имя меню. Если параметр ИмяМеню процедуры добавляющей пункты имеет значение пустой строки, то пункты добавляются в главное меню приложения.

Имена стандартных контекстных меню приложения Word следующие:

  • "Text" -контекстное меню на выделенном тексте

  • "Curve" - контекстное меню на выделенных линиях

  • "Shapes" - контекстное меню на выделенных автофигурах

Имена стандартных контекстных меню приложения Excel следующие:

  • "Cell" -контекстное меню на выделенных ячейках

  • "Row" - контекстное меню на выделенных строках

  • “Column” – контекстное меню на выделенных столбцах

2) Необходимо ввести имена событий в строковом формате через запятую.

3)Имя события не должно содержать пробелов и символа &.

4)Если нужно записать и имя события пункта меню, и подпись пункта меню их разделяют точкой с запятой.

5)Если во введенном имени события содержатся пробелы и символ &, то эти символы автоматически удаляются из имени события, и если не указана подпись пункта меню, то в подпись пункта меню передается имя события с запретными символами.

6)Перед именем события пункта меню можно ввести цифры, которые зададут код пиктограммы пункта меню(см. Коды пиктограмм пунктов меню). Но пункт меню, который имеет подпункты, не может иметь пиктограммы.

7)Перед именем события пункта меню и перед цифрами задающими пиктограмму пункта меню можно ввести символ подчеркивания “_”, или символ минус “-”, при этом пункт меню будет отделен от других пунктов разделительной линией.

8) Если необходимо подчеркнуть букву подписи, перед ней ставят символ &

9) Если необходимо пометить пункт меню то подпись пункта меню должна заканчиваться пробелом (пункт меню, который имеет подпункты, не может быть выделен).

10) Во входных параметрах ПунктыМеню могут иметься подпункты, которые отделяются от основного пункта меню запятой.

11) Процедурой ДобавитьПункты можно добавить несколько пунктов первого уровня, и подпункты к ним. Процедурой ДобавитьПункты2 можно добавить только один пункт первого уровня (за один запуск данной процедуры), но к этому пункту можно добавить подпункты как второго, так и третьего уровня.

12) Перед добавлением пунктов меню необходимо создать внутри проекта, из которого добавляются пункты меню, модуль макросов, который будет содержать в себе процедуры, имена которых совпадают с именами событий пунктов меню(для пунктов меню, которые имеют подпункты, их задавать не требуется, так как процедуры ДобавитьПункты не задают соответствующие свойство OnAction для данных пунктов меню. см. Свойства и методы пунктов меню).

Пример:

‘Добавление пунктов в стандартное

‘контекстное меню “Text” приложения Word

ДобавитьПункты2 "Техt", "Первый", _

"ВторойПункт;Второй пункт,ДТретий", "-3Третий"

рис 23 Последние добавленные пункты в контекстное меню “Text

Примечание:

Если вы хотите добавить в меню подпункты четвертого и далее уровня, то вам необходимо дорастить пункт меню третьего уровня односеансным контекстным меню (см. Односеансное контекстное меню)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]