Excel vba меню на форме

Хитрости »

14 Февраль 2022              1548 просмотров


Пользовательские формы(UserForm) разрабатываются специально для удобства взаимодействия пользователей с программой, и в основном для ввода и записи данных(напомню, что создается форма из редактора VBA: InsertUserForm). Наиболее часто используемым элементом форм является TextBox, который позволяет вводить любую текстовую информацию. И если с ручным вводом проблем обычно не возникает, то с вставкой в TextBox данных из буфера обмена могут возникнуть сложности. Иначе говоря, пользователь скопировал откуда-то текст и хочет вставить его в TextBox. Или наоборот — надо скопировать и перенести в другой TextBox или еще куда-то. Но не может. И не потому, что такой возможности в принципе нет, а потому, что «из коробки» TextBox в VBA не имеет своего меню «Вырезать-Копировать-Вставить» и копирование-вставка в них возможна только сочетаниями горячих клавиш Ctrl++C(копировать), Ctrl++V(вставить), Ctrl+X(вырезать). А зачастую формы(UserForm) разрабатываются для таких пользователей, которые могут даже не подозревать о горячих клавишах. И обязанность разработчика снабдить такие формы подобными командами. Чтобы по правому клику в TextBox появлялось свое меню с заветными командами:
Свое меню Копировать-Вырезать-Вставить
Что интересно – сами команды копирования-вырезки-вставки есть в TextBox-ах «из коробки», а вот меню для них – нет. И именно меню и его обработку мы и научимся делать.
На самом деле все не так уж сложно, но начинающим программировать в VBA может показаться иначе. Первое, что необходимо сделать – это создать свое меню, которое будет обрабатывать копирование-вырезку-вставку. Притом создавать его мы будем при первом старте UserForm(событие UserForm_Initialize). А при закрытии формы меню правильно будет удалить. За все это у нас будут отвечать коды ниже:

'при вызове формы
'   создаем свое меню "Вырезать-Копировать-Вставить" для вызова из TextBox
Private Sub UserForm_Initialize()
    Call DelCustomCCPMenu  'на всякий случай удаляем меню, если вдруг оно уже есть
    Set oPopupMenu = Application.CommandBars.Add("CustomCCP_PopupMenu", msoBarPopup)
    With oPopupMenu
        With .Controls.Add(msoControlButton)
            .Caption = "Копировать"               'текст кнопки
            .FaceId = "19"                        'код иконки для кнопки
            .OnAction = "MyPopupMenuButtonCClick" 'имя процедуры, которая будет выполнена при нажатии кнопки
        End With
        With .Controls.Add(msoControlButton)
            .Caption = "Вставить"                 'текст кнопки
            .FaceId = "22"                        'код иконки для кнопки
            .OnAction = "MyPopupMenuButtonPClick" 'имя процедуры, которая будет выполнена при нажатии кнопки
        End With
        With .Controls.Add(msoControlButton)
            .Caption = "Вырезать"                   'текст кнопки
            .FaceId = "21"                          'код иконки для кнопки
            .OnAction = "MyPopupMenuButtonCutClick" 'имя процедуры, которая будет выполнена при нажатии кнопки
        End With
    End With
End Sub
'при закрытии формы
'удаляем свое меню "Вырезать-Копировать-Вставить" для вызова из TextBox
Private Sub UserForm_Terminate()
    Call DelCustomCCPMenu 'вызов функции удаления меню
End Sub
'функция удаления созданного ранее меню
Function DelCustomCCPMenu()
    On Error Resume Next 'пропускаем ошибки, если вдруг меню было удалено ранее
    Application.CommandBars("CustomCCP_PopupMenu").Delete
End Function

По сути код выше достаточно просто вставить «внутрь» формы: правая кнопка мыши на форме —View Code -вставляем приведенный выше код. Имя самой формы нигде менять не надо. Это означает, что строки Private Sub UserForm_Initialize() и Private Sub UserForm_Terminate должны оставаться именно такими независимо от того, какое имя у формы.
Теперь останется для TextBox-а на форме прописать код вызова нашего меню при нажатии правой кнопки мыши:

'отслеживаем нажатие правой кнопки мыши внутри TextBox-а
'   Button = 1 - левая кнопка
'   Button = 2 - правая кнопка
Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 2 Then
        Set tbxAct = TextBox1
        Application.CommandBars("CustomCCP_PopupMenu").ShowPopup
    End If
End Sub

Напомню, что все эти коды мы должны прописать в модуль UserForm. И последний штрих – в любом стандартном модуле(InsertModule) прописываем обработку копирования-вставки:

'копировать
Private Sub MyPopupMenuButtonCClick()
    UserForm1. TextBox1.Copy
End Sub
'вставить
Private Sub MyPopupMenuButtonPClick()
    UserForm1. TextBox1.Paste
End Sub
'вырезать
Private Sub MyPopupMenuButtonCutClick()
    UserForm1. TextBox1.Cut
End Sub

Это основной принцип использования меню. По такому же принципу можно добавить и другие команды в меню, но в зависимости от их функционала будет зависеть сложность итогового кода.
Плюс, выше приведен пример всего для одного TextBox-а. Но как быть, если их два, три и более? По-хорошему код надо модифицировать, добавлять еще пару переменных и обработок. В приложенном к статье файле именно так и сделано – там показана обработка двух TextBox-ов:
Скачать пример:

  Свое меню Копировать-Вставить в TextBox.xls (77,5 KiB, 216 скачиваний)

Хотя и это не предел: можно автоматом делать это для всех TextBox-ов на форме, если привлечь модули классов. Но поняв принцип приведенного в этой статье кода и принцип работы модулей классов(а так же изучив код из файла-примера), сделать это самостоятельно уже не составит труда. Ниже приложен файл с реализацией обработки через модули классов — т.е. меню будет автоматом добавлено для ВСЕХ TextBox-ов на форме:

Скачать пример:

  Свое меню Копировать-Вставить в TextBox — классы.xls (85,0 KiB, 181 скачиваний)

Так же см.:
Что такое модуль? Какие бывают модули?
Работа с модулями классов
Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Ранее я рассмотрел методы создания пользовательских форм и основы работы с ними (если вы никогда не работали с пользовательскими формами, рекомендую для начала прочитать указанную заметку). В настоящем материале приводится целый ряд практически полезных примеров пользовательских диалоговых окон.[1]

Рис. 1. Меню на основе элементов управления CommandButton или ListBox

Скачать заметку в формате Word или pdf, примеры в архиве

Создание меню

Меню можно создать с помощью элементов управления CommandButton (рис. 1; см. файл userform menus.xlsm) и с помощью элемента управления ListBox. Каждый элемент управления CommandButton имеет собственную процедуру обработки событий. Например, представленная ниже процедура выполняется после щелчка на кнопке CommandButton1:

Private Sub CommandButton1_Click()

    Me.Hide

    Call Macro1

    Unload Me

End Sub

Эта процедура приводит к вызову макроса Macro1 и закрытию диалогового окна UserForm. После щелчка на других кнопках (отличных от CommandButton1) вызываются похожие процедуры обработки событий.

В случае использования элемента управления ListBox, перед отображением пользовательского диалогового окна вызывается процедура обработки события Initialize. В следующей процедуре используется метод Addltem для добавления шести опций в элемент управления ListBox:

Private Sub UserForm_Initialize()

    With ListBox1

        .AddItem «Макрос1»

        .AddItem «Макрос2»

        .AddItem «Макрос3»

        .AddItem «Макрос4»

        .AddItem «Макрос5»

        .AddItem «Макрос6»

    End With

End Sub

Процедура обработки события привязывается к кнопке Выполнить:

Private Sub ExecuteButton_Click()

    Select Case ListBox1.ListIndex

        Case 1

            MsgBox «Выберите макрос из списка.»

            Exit Sub

        Case 0: Me.Hide: Call Macro1

        Case 1: Me.Hide: Call Macro2

        Case 2: Me.Hide: Call Macro3

        Case 3: Me.Hide: Call Macro4

        Case 4: Me.Hide: Call Macro5

        Case 5: Me.Hide: Call Macro6

    End Select

    Unload Me

End Sub

Данная процедура проверяет значение свойства Listlndex элемента управления ListBox, чтобы определить, какой элемент выбран в списке (если свойство Listlndex равно –1, то не выбран ни один из элементов). После этого запускается соответствующий макрос.

Выбор диапазона в пользовательской форме

Некоторые встроенные диалоговые окна Excel предоставляют пользователю возможность выбирать диапазон. Например, диалоговое окно Подбор параметра, для вызова которого следует пройти по меню Данные –> Работа с данными –> Анализ «что если « –> Подбор параметра, запрашивает у пользователя два диапазона. Пользователь может или ввести имя диапазона непосредственно в окне, или применить мышь для выделения диапазона на листе.

Пользовательское диалоговое окно также обеспечивает подобную функциональность. Это достигается с помощью элемента управления RefEdit. Данный элемент выглядит иначе, чем элемент выбора диапазона во встроенных диалоговых окнах Excel, однако работает точно так же. Если пользователь щелкнет на небольшой кнопке в правой части элемента управления, то диалоговое окно временно исчезнет, а на экране будет отображен небольшой указатель выбора диапазона.

К сожалению, элемент управления RefEdit не позволяет использовать специальные клавиши при выделении диапазона (например, невозможно выделить ячейки до конца столбца, нажав комбинацию клавиш Shift+↓). Кроме того, после щелчка мышью на маленькой кнопке в правой части элемента управления (для временного сокрытия диалогового окна) можно применять только выделения с помощью мыши. Клавиатуру в этом случае применять нельзя.

На рис. 2 представлено пользовательское диалоговое окно с добавленным элементом управления RefEdit (см. файл range selection demo.xlsm). Это диалоговое окно выполняет простую математическую операцию над всеми не содержащими формул и непустыми ячейками указанного диапазона. Выполняемая операция задается активным переключателем OptionButton.

Рис. 2. С помощью элемента управления RefEdit можно выбрать диапазон

Элемент управления RefEdit возвращает текстовую строку, которая представляет выбранный диапазон. Можно преобразовать эту строку в объект Range. Для этого используется оператор:

Set UserRange = Range(RefEditl.Text)

Удачной практикой считается инициализация элемента управления RefEdit для представления текущего выделения. Для этого в процедуре UserForm_Initialize воспользуйтесь оператором:

RefEditl.Text = ActiveWindow.RangeSelection.Address

Для достижения наилучших результатов не помещайте элемент управления RefEdit внутри элемента Frame либо MultiPage. Это может привести к сбою в работе Excel. Элемент управления RefEdit не всегда возвращает действительный диапазон. Выделение диапазона указателем мыши — это один из способов присвоения значения данному элементу управления. Пользователь может ввести в поле любой текст, а также отредактировать или удалить уже отображаемый текст. Таким образом, предварительно необходимо убедиться, что диапазон является допустимым.

Следующий код — это пример одного из способов проверки допустимости введенного значения. Если определено, что значение неправильное, то пользователю выдается сообщение, а элемент управления RefEdit становится активным, предоставляя возможность ввести корректный диапазон.

    On Error Resume Next

    Set UserRange = Range(RefEdit1.Text)

    If Err <> 0 Then

        MsgBox «Выбран некорректный диапазон»

        RefEdit1.SetFocus

        Exit Sub

    End If

    On Error GoTo 0

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

Set OneCell = Range(RefEditl.Text).Range("Al")

Создание заставки

Некоторые разработчики предпочитают отображать определенную вступительную информацию при запуске приложения. Эта методика называется заставкой. Без сомнения, все пользователи видели заставку Excel, которая отображается несколько секунд при запуске программы. В приложении Excel заставку можно создать с помощью пользовательского диалогового окна. В приведенном ниже примере реализуется автоматическое отображение заставки, которое исчезает по истечении пяти секунд (рис. 3; см. файл splash screen.xlsm). Для создания заставки выполните следующие действия:

  1. Создайте рабочую книгу.
  2. Активизируйте редактор VBE и вставьте пользовательское диалоговое окно в проект. Код в этом примере предполагает, что объект UserForm называется UserForm1.
  3. Поместите любые необходимые элементы управления в только что созданное диалоговое окно UserForm1. Например, вам может понадобиться расположить элемент управления Image, который будет содержать логотип компании (рис. 3).
  4. Вставьте процедуру в модуль кода для объекта ЭтаКнига (ThisWorkbook):

Private Sub Workbook_Open()

    UserForm1.Show

End Sub

  1. Вставьте следующую процедуру в модуль кода для объекта UserForm1 (эта процедура обеспечивает пятисекундную задержку). Если нужно другое время задержки, измените значение аргумента функции TimeValue.

Private Sub UserForm_Activate()

    Application.OnTime Now + TimeValue(«00:00:05»), «KillTheForm»

End Sub

Рис. 3. Эта заставка на короткое время появляется на экране после открытия рабочей книги

  1. В общий модуль VBA вставьте следующую процедуру.

Private Sub KillTheForm()

    Unload UserForm1

End Sub

При открытии рабочей книги будет выполнена процедура Workbook_Open и появится диалоговое окно UserForm (п. 4). В этот момент генерируется событие Activate, которое приводит к выполнению процедуры UserForm_ Activate (п. 5). Данная процедура использует метод OnTime объекта Application для выполнения процедуры KillTheForm в определенный момент времени. Однако предварительно определена задержка в пять секунд с момента возникновения события Activate. Процедура KillTheForm просто выгружает диалоговое окно UserForm из памяти.

  1. В качестве необязательного действия можно добавить элемент управления CommandButton с именем CancelButton, установить его свойство Cancel равным True и добавить представленную ниже процедуру обработки события в модуль кода формы UserForm.

Private Sub CancelButton_Click()

    Unload Me

End Sub

Таким образом, пользователь сможет закрыть заставку, прежде чем пройдет указанное время задержки. Окно будет закрыто также в результате нажатия клавиши <Esc>. Эту небольшую кнопку можно разместить за другим объектом, чтобы она не была видна.

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

Для того чтобы выполнить VBA-процедуру при открытии документа, нужно так отобразить пользовательское диалоговое окно в немодальном режиме, чтобы код продолжал выполняться. Для этого измените процедуру WorkbookOpen следующим образом.

Private Sub Workbook_Open()

    UserForml.Show vbModeless

     другой код

End Sub

Отключение кнопки закрытия пользовательского диалогового окна

Если пользовательское диалоговое окно уже отображено на экране, щелчок на кнопке Закрыть в правом верхнем углу приведет к выгрузке формы UserForm из памяти. Иногда этого допускать нельзя. Например, иногда требуется, чтобы диалоговое окно UserForm закрывалось только после щелчка на специальной кнопке CommandButton. Несмотря на то что реально отключить кнопку Закрыть невозможно, вы вправе предотвратить закрытие диалогового окна, вызванное щелчком на этой кнопке. Для этого воспользуйтесь обработчиком события QueryClose (см. файл gueryclose demo.xlsm). Следующая процедура, которая расположена в модуле кода диалогового окна UserForm, выполняется перед закрытием формы (т.е. в момент возникновения события QueryClose).

Private Sub UserForm_QueryClose _

  (Cancel As Integer, CloseMode As Integer)

    If CloseMode = vbFormControlMenu Then

        MsgBox «Щелкните на кнопке OK для закрытия формы.»

        Cancel = True

    End If

End Sub

Процедура UserForm_QueryClose использует два аргумента. Аргумент CloseMode содержит значение, которое указывает на причину возникновения события QueryClose. Если значение аргумента CloseMode равно vbFormControlMenu (встроенная константа), значит, пользователь щелкнул на кнопке Закрыть. В таком случае будет отображено сообщение (рис. 4); аргумент Cancel устанавливается равным True, и форма не закрывается.

Рис. 4. Процедура перехватывает закрытие окна, и оставляет его открытым

Имейте в виду, что пользователь может нажать клавиши <Ctrl+Break>, прекратив тем самым выполнение макроса. В рассматриваемом примере нажатие клавиш <Ctrl+Break> во время отображения формы UserForm на экране приведет к тому, что пользовательское диалоговое окно будет закрыто. Во избежание этого выполните следующий оператор до отображения пользовательского диалогового окна:

Application.EnableCancelKey = xlDisabled

Прежде чем добавить этот оператор, удостоверьтесь, что в приложении нет ошибок. В противном случае возникает опасность формирования бесконечного цикла.

Изменение размера диалогового окна

Во многих приложениях используются окна, которые могут изменять собственные размеры, добавляя кнопки и опции. Например, высота диалогового окна Excel Найти и заменить, которое отображается после выбора команды Главная –> Редактирование –> Найти и выделить –> Заменить, увеличивается после щелчка на кнопке Параметры.

Изменение размеров пользовательского диалогового окна осуществляется путем изменения значений свойств Width и Height объекта UserForm. На рис. 5а показано первоначальное диалоговое окно, а на рис. 5б показано это же окно после щелчка на кнопке Параметры. Обратите внимание на то, что надпись на кнопке изменяется в зависимости от размера диалогового окна (см. файл change userform size.xlsm).

Рис. 5. Диалоговое окно: вверху – в стандартном режиме; внизу – после нажатия на кнопке Параметры

Создавая пользовательское диалоговое окно, определите его максимальный размер, чтобы получить доступ ко всем элементам управления. После этого воспользуйтесь процедурой UserForm_Initialize для установки размеров диалогового окна по умолчанию.

В коде применяются две константы, определенные в верхней части модуля.

Const SmallSize As Integer = 124
Const LargeSize As Integer = 164

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

Private Sub OptionsButton_Click()

    If OptionsButton.Caption = «Параметры >>» Then

        Me.Height = LargeSize

        OptionsButton.Caption = «<< Параметры»

    Else

        Me.Height = SmallSize

        OptionsButton.Caption = «Параметры >>»

    End If

End Sub

Эта процедура проверяет значение свойства Caption объекта CommandButton и устанавливает значение свойства Height объекта UserForm в соответствии с полученным значением свойства Caption.

Если элементы управления не отображаются из-за того, что находятся за пределами границы диалогового окна, соответствующие этим элементам управления комбинации клавиш будут продолжать функционировать. В рассматриваемом примере пользователь может нажать клавиши <Alt+L> (для выбора альбомной ориентации страницы), даже если соответствующий элемент управления не отображается на экране.

Масштабирование и прокрутка листа в пользовательском диалоговом окне

Для прокрутки и масштабирования листа при активном диалоговом окне можно применить элемент управления ScrollBar (рис. 6; см. файл zoom and scroll sheet.xlsm). В этом примере масштаб можно изменять в диапазоне от 100 до 400%. Два элемента управления ScrollBar в нижней части диалогового окна позволяют прокручивать лист по горизонтали и по вертикали.

Рис. 6. Элементы управления ScrollBar позволяют прокручивать лист и изменять его масштаб

Элементы управления инициализируются в процедуре UserForm_Initialize:

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

Private Sub UserForm_Initialize()

    LabelZoom.Caption = ActiveWindow.Zoom & «%»

‘   Масштабирование

    With ScrollBarZoom

        .Min = 10

        .Max = 400

        .SmallChange = 1

        .LargeChange = 10

        .Value = ActiveWindow.Zoom

    End With

   Прокрутка по горизонтали

    With ScrollBarColumns

        .Min = 1

        .Max = ActiveSheet.UsedRange.Columns.Count

        .Value = ActiveWindow.ScrollColumn

        .LargeChange = 25

        .SmallChange = 1

    End With

   Прокрутка по вертикали

    With ScrollBarRows

        .Min = 1

        .Max = ActiveSheet.UsedRange.Rows.Count

        .Value = ActiveWindow.ScrollRow

        .LargeChange = 25

        .SmallChange = 1

    End With

End Sub

Эта процедура позволяет устанавливать значения различных свойств элементов управления ScrollBar. Значения определяются на основе данных, полученных из активного окна. При использовании элемента управления ScrollBarZoom выполняется процедура ScrollBarZoom_Change. Она устанавливает значение свойства Zoom объекта ActiveWindow равным значению свойства Value элемента управления ScrollBar. Кроме того, изменяется текст подписи, которая представляет текущий масштаб рабочего листа.

Private Sub ScrollBarZoom_Change()

    With ActiveWindow

        .Zoom = ScrollBarZoom.Value

        LabelZoom = .Zoom & «%»

        .ScrollColumn = ScrollBarColumns.Value

        .ScrollRow = ScrollBarRows.Value

    End With

End Sub

Прокрутка листа осуществляется с помощью двух процедур. Эти процедуры устанавливают значение свойств ScrollRow и ScrollColumns объекта ActiveWindow равными значениям свойств Value элементов управления ScrollBar.

Private Sub ScrollBarColumns_Change()

    ActiveWindow.ScrollColumn = ScrollBarColumns.Value

End Sub

Private Sub ScrollBarRows_Change()

    ActiveWindow.ScrollRow = ScrollBarRows.Value

End Sub

При нажатии на кнопку Ok пользовательская форма закрывается:

Private Sub OKButton_Click()

    Unload Me

End Sub

Применение элемента управления MultiPage

Элемент управления MultiPage применяется при отображении в пользовательских диалоговых окнах множества элементов управления. Элемент управления MultiPage позволяет группировать опции, а также размещать каждую группу на отдельной вкладке (рис. 7; см. файл multipage control demo.xlsm). Панель инструментов Toolbox также включает элемент управления TabStrip, напоминающий элемент управления MultiPage. Однако в отличие от MultiPage, элемент управления TabStrip не может включать другие объекты. Поскольку элемент управления MultiPage является более гибким, вряд ли вам придется обращаться к элементу управления TabStrip.

Рис. 7. Элемент управления MultiPage группирует элементы управления на страницах, доступ к которым обеспечивается с вкладки

Вкладка (или страница), которая отображается поверх всех остальных, определяется значением свойства Value элемента управления MultiPage. Значение 0 соответствует первой вкладке. Значение 1 вызывает отображение второй вкладки и т.д. По умолчанию элемент управления MultiPage состоит из двух страниц. Для того чтобы добавить дополнительные вкладки, щелкните на любой вкладке правой кнопкой мыши и в контекстном меню выберите пункт New Page.

При работе с элементом управления MultiPage щелкните на вкладке, чтобы установить свойства страницы. В окне Properties отобразятся свойства, значения которых можно изменить. Иногда сложно выделить сам элемент управления MultiPage, так как щелчок на нем приводит к выделению страницы элемента управления. Для того чтобы выделить только элемент управления, щелкните на его границе. Кроме того, можете воспользоваться клавишей <Таb> для циклического перемещения между элементами управления. Еще одним вариантом выделения элемента управления является выбор пункта MultiPage из раскрывающегося списка окна Properties.

Если элемент управления MultiPage содержит много вкладок, то присвойте его свойству MultiRow значение True, чтобы отобразить вкладки в несколько строк. Если необходимо, то вместо вкладок можно отображать кнопки. Достаточно изменить значение свойства Style на 1. Если значение свойства Style равно 2, элемент управления MultiPage не будет отображать ни вкладки, ни кнопки.

Свойство TabOrientation определяет расположение вкладок на элементе управления MultiPage. Для каждой страницы можно установить эффект перехода. Для этого воспользуйтесь свойством TransitionEffect. Например, щелчок на вкладке приведет к тому, что новая страница «отодвинет» старую. Применяйте свойство TransitionPeriod, чтобы задать скорость эффекта перехода.

Использование внешних элементов управления

Пример, рассматриваемый в этом разделе, основан на элементе управления Microsoft Windows Media Player. Несмотря на то что он не является элементом управления Excel (настраивается при установке Windows), он прекрасно работает с формами UserForm. Для того чтобы воспользоваться элементом управления Microsoft Windows Media Player выполните следующие действия:

  1. Активизируйте среду VBE.
  2. Создайте новую пользовательскую форму: Insert –> UserForm.
  3. Щелкните правой кнопкой мыши на панели Toolbox и в контекстном меню выберите параметр Additional Controls (Дополнительные элементы управления). Если окно Toolbox не отображается, выполните команду View –> Toolbox.
  4. В окне Additional Controls установите флажок Windows Media Player (рис. 8).
  5. Щелкните на кнопке ОК. Набор инструментов пополнится новым элементом управления.

Рис. 8. Подключение элемента управления Microsoft Windows Media Player

На рис. 9 показаны элемент управления Windows Media Player, встроенный в форму UserForm, а также окно Properties (см. также файл mediaplayer.xlsm, расположенный в отдельной папке). Свойство URL определяет URL-ссылку воспроизводимой композиции (музыкальная запись или видеоролик). Если композиция находится на жестком диске вашего компьютера, свойство URL определяет полный путь и имя соответствующего файла.

Рис. 9. Элемент управления Windows Media Player, встроенный в форму

На рис. 10 показан пример использования этого элемента управления. Для сокрытия окна, предназначенного для отображения видеороликов, была уменьшена высота окна элемента управления Windows Media Player. Также был добавлен список, созданный на основе элемента управления ListBox, в котором отображаются аудиофайлы MP3. После щелчка на кнопке Пуск начинается воспроизведение выбранного файла. Щелчок на кнопке Закрыть приведет к прекращению воспроизведения и к закрытию окна UserForm. Форма UserForm отображается в немодальном режиме, поэтому можно продолжать работу во время отображения диалогового окна.

Рис. 10. Элемент управления Windows Media Player в действии

Названия МРЗ-файлов в окне списка отображаются с помощью процедуры UserForm_Initialize. В целях упрощения алгоритма аудофайлы находятся в той же папке, что и рабочая книга. Можно реализовать и более гибкий подход, предусматривающий выбор пользователем папки, содержащей требуемые аудиофайлы.

Private Sub UserForm_Initialize()

    Dim FileName As String

   Заполнение списка MP3файлами

    FileName = Dir(ThisWorkbook.Path & «*.mp3», vbNormal)

    Do While Len(FileName) > 0

        ListBox1.AddItem FileName

        FileName = Dir()

    Loop

    ListBox1.ListIndex = 0

End Sub

Код обработчика событий PlayButton_Click включает единственный оператор, который присваивает выбранное имя файла свойству URL объекта WindowsMediaPlayer1.

Private Sub PlayButton_Click()

   Свойство URL загружает трек и запускает плеер

    WindowsMediaPlayer1.URL = _

      ThisWorkbook.Path & «« & ListBox1.List(ListBox1.ListIndex)

End Sub

Анимация элемента управления Label

Форма UserForm (рис. 11) представляет собой интерактивный генератор случайных чисел. Два элемента управления TextBox содержат верхнее и нижнее значения для случайного числа. Элемент управления Label изначально отображает четыре знака вопроса, а после щелчка мышью на кнопке Пуск отображаются анимированные случайные числа. При этом кнопка Пуск превращается в кнопку Остановить, а щелчок на ней мышью приводит к прекращению анимации и отображению случайного числа. Код, связанный с кнопкой генератора случайных чисел можно найти в модуле UserForm1 файла random number generator.xlsm.

Рис. 11. Генератор случайных чисел

Поскольку кнопка выполняет две функции (запуск и остановка анимации), в процедуре используется общедоступная переменная Stopped, с помощью которой отслеживается состояние кнопки. Первая часть процедуры состоит из двух структур If-Then, с помощью которых проверяется содержимое элементов управления TextBox. Два другая подобных оператора позволяют удостовериться в том, что меньшая величина действительно не превосходит большей величины. В следующем разделе кода осуществляется настройка размера шрифта элемента управления Label на основании максимальной величины. Цикл Do Until loop генерирует и отображает случайные числа. Обратите внимание на оператор DoEvents. Он позволяет Excel использовать все возможности операционной системы. Если бы его не было, элемент управления Label не смог бы отобразить каждое генерируемое случайное число. Другими словами, именно оператор DoEvents делает возможной анимацию.

Форма UserForm также включает элемент управления CommandButton, который выполняет функции кнопки Отмена. Этот элемент управления находится за пределами окна UserForm, поэтому невидим. Свойству Cancel элемента управления CommandButton присвоено значение True. Вследствие этого нажатие клавиши <Esc> дает тот же эффект, что и щелчок на кнопке Отмена. Соответствующая процедура обработки событий присваивает переменной Stopped значение True и выгружает форму UserForm.

[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 439–449, 466–472.

Article reviewed on July 05, 2012 – Contains working project at the end (link).

Ever thought possible to show a popup menu on an MSComCtl.ListView placed on a UserForm within an Excel Add-In (the ones ending with .XLA) using a right-click of the mouse, “just” VBA and no other Win32 function, class or wrapper? No? Then continue reading. If you think it is possible but you never tried or do not know how, read as well.

In my daily struggling with VBA I came finally on the “Golden Tip” that made it all possible. And, this method works on any type of control you place on the UserForm, as long as it can intercept mouse clicks (left, middle or right button is a matter of your choice).

History
I am developing an Add-In for Excel connecting to a database. The Add-In retrieves the data in pure or in aggregated form and lets you place the result as a matrix (records are rows and fields are columns) on a worksheet. The definition of what the Add-In retrieves from the database is defined as ‘query’. The query is also stored in the workbook, in a [very] hidden worksheet.

One of the features of the Add-In is allowing to slice and trim the result of a query by fetching only a few single rows of the resulting (ADODB) RecordSet. The slice and trim is defined as a ‘restriction’. The restrictions are managed via a UserForm which has the ListView with the individual restrictions in it.

Wish
My desire was adding a right-click popup menu letting me establish the logical link between a list item and its predecessor, selecting from this menu the ‘AND’ or the ‘OR’. I did not want to add another button control to avoid overloading the form (I already have 5 of such).

First implementation
After some investigation in Excel’s and MSDN’s help, I bounced into a popup menu provided natively by Excel via a CommandBar objects. I decided to use it. To obtain the functionality of the right-click popup menu on the ListView on my UserForm, I used:

  • The MouseUp Event of the ListView, where I could trap the right click and identify the current selected list item;
  • A CommandBar as the menu container, to be activated via the ‘.ShowPopup‘ method
  • Two CommandBarButtons to be placed ‘on’ the CommandBar, one for the AND and one for the OR
  • Subroutine for dealing with the factual changes, to be called via the ‘.OnAction‘ property of the CommandBarButton

In a popup menu, the 2 command bar buttons act as menu entries.

However, this code was not working. In other words, the popup menu did show, I could click but none of them triggered the execution of the associated subroutine procedures. Without raising any error. I was troubled.

Second and final implementation
On the Internet (which took some time in order to establish the right terms to feed into King Google) I got the hint I needed: instead of adding 2 generic command bar buttons, I had to create 2 private variables as command buttons in the declaration part of the UserForm using the ‘WithEvents’ to allow the buttons to react on my mouse click.

To make this example work, create a UserForm and place a ListView – a ListView ActiveX control 6.0, remember to add a reference in your project to Microsoft Common Controls 6.0 (SP6) – called ‘ListView1’. Somewhere in the code add one or more items to ListView1.

In the Declaration section of the UserForm:

Option Explicit ' Always recommended

Private WithEvents mButton1 As CommandBarButton ' Manages the first popup menu entry
Private WithEvents mButton2 As CommandBarButton ' Manages the second popup menu entry

In the MouseUp method of the ListView:

Private Sub ListView1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
                              ByVal x As stdole.OLE_XPOS_PIXELS, _
                              ByVal y As stdole.OLE_YPOS_PIXELS)
On Error Resume Next
    Dim wListItem    As MSComctlLib.ListItem
    Dim wListItemTag As String

    ' We intercept only the 'RightClick' without any button pressed.
    '
    If (Button <> xlSecondaryButton) Or (Shift <> 0) Then GoTo EndSub

    ' Locate the element. We have used the Tooltip to know if this element needs to be modified.
    '
    Set wListItem = lstCustomRestrictions.SelectedItem
    If wListItem Is Nothing Then Set wListItem = lstCustomRestrictions.HitTest(x, y)
    If wListItem Is Nothing Then GoTo EndSub

    ' This line protects the first entry in the ListView.
    '
    If (wListItem.Index = 1) Then GoTo EndSub

    wListItem.Selected = True
    wListItemTag = wListItem.Tag  ' The Tag contains a specially crafted object.

    ' Show the popup menu.
    '
    ShowPopupMenu wListItemTag    ' The 'Tag' indicates 'Time' or 'Dutch'.

EndSub:
    Set wListItem = Nothing
End Sub

The Click event of the 2 buttons declared in the form:

Private Sub mButton1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
On Error Resume Next
    If (Ctrl.State = msoButtonDown) _
    Then
        ' It was down, i.e. 'checked', so we need to uncheck and void.
        '
        SetToolTipText vbNullString
    Else
        ' It was up, i.e. 'unchecked', so we need to check and set.
        '
        SetToolTipText Ctrl.Parameter
    End If
End Sub

Private Sub mButton2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
On Error Resume Next
    If (Ctrl.State = msoButtonDown) _
    Then
        ' It was down, i.e. 'checked', so we need to uncheck and void.
        '
        SetToolTipText vbNullString
    Else
        ' It was up, i.e. 'unchecked', so we need to check and set.
        '
        SetToolTipText Ctrl.Parameter
    End If
End Sub

This is the first custom private procedure (called from the MouseUp subroutine):

Private Sub ShowPopupMenu(pLinkType As String)
On Error Resume Next
    Dim wPopupMenu As Office.CommandBar    ' Used for right-click on ListView1
    Dim wListItem  As MSComctlLib.ListItem

    ' First try to locate this commandbar. If it exists, then we destroy ad make it again.
    ' The name of the menu is not important but should be unique.
    '
    Set wPopupMenu = Application.CommandBars.Item("UserForm1Popup")
    If Not wPopupMenu Is Nothing _
    Then
        wPopupMenu.Delete
        Set wPopupMenu = Nothing
    End If

    ' Create the menu.
    '
    Set wPopupMenu = Application.CommandBars.Add(Name:="UserForm1Popup", _
                                                 Position:=msoBarPopup, _
                                                 Temporary:=True)
    wPopupMenu.Enabled = True

    ' Add the first child menu item to the popup
    '
    Set mButton1 = Nothing
    Set mButton1 = wPopupMenu.Controls.Add(Type:=msoControlButton, ID:=1, _
                                           Parameter:="Time", Temporary:=True)
    With mButton1
        .Caption = "Set Tooltip to current date/time (i.e. 'Now')"
        .Enabled = True
        If (pLinkType = "Time") _
        Then
            .FaceId = 990           ' Show check mark
            .State = msoButtonDown  ' Show pressed
        End If
        .Style = msoButtonIconAndCaption
        .Visible = True
    End With

    ' Add the second child menu item to the popup
    '
    Set mButton2 = Nothing
    Set mButton2 = wPopupMenu.Controls.Add(Type:=msoControlButton, ID:=1, _
                                           Parameter:="Dutch", Temporary:=True)
    With mButton2
        .Caption = "Set Tooltip to 'Dutch Gemini'"
        .Enabled = True
        If (pLinkType = "Dutch") _
        Then
            .FaceId = 990           ' Show check mark
            .State = msoButtonDown  ' Show pressed
        End If
        .Style = msoButtonIconAndCaption
        .Visible = True
    End With

    ' Show as a popup close to the mouse pointer.
    '
    wPopupMenu.ShowPopup

    ' Destroy the internal popup menu.
    '
    If Not wPopupMenu Is Nothing Then wPopupMenu.Delete
    Set mButton2 = Nothing
    Set mButton1 = Nothing
    Set wPopupMenu = Nothing
End Sub

And the second custom private procedure:

Private Sub SetToolTipText(pToolTipType As String)
On Error Resume Next
    Dim wListItem As MSComctlLib.ListItem

    Set wListItem = ListView1.SelectedItem
    If wListItem Is Nothing Then GoTo EndSub

    ' This line protects the first entry in the ListView.
    '
    If (wListItem.Index = 1) Then GoTo EndSub

    wListItem.Tag = pToolTipType
    Select Case pToolTipType
    Case "Time"
        wListItem.TooltipText = VBA.CStr(Now)
    Case "Dutch"
        wListItem.TooltipText = "Dutch Gemini"
    Case Else
        wListItem.TooltipText = ""
    End Select

    wListItem.Selected = False

EndSub:
    Set wListItem = Nothing
End Sub

That’s it.

For convenience I have made this sample project available as an Excel workbook which contains the necessary overhead for making the above work out-of-the-box. It also contains some code dealing with the positioning of the UserForm on multiple-monitor systems. Click here to download a copy of this document.

If you like it then you can make me aware of your appreciation by making a small donation to help supporting my work.

Новое
меню в Excel, Word или PowerPoint обычно создается
средствами VBA, поскольку в этих приложениях
диалоговое окно «Настройка» не содержит
кнопки Свойства.
Новое
меню создается методом Add коллекции
CommandBars (Панели команд):

Выражение.
Add(Name,
Position, MenuBar, Temporary),

где
выражение
обязательное
выражение, возвращающее объект
CommandBars, а все параметры в скобках
необязательны.Name
задает
имя нового меню;

PositioNопределяет
его положение (значения-константы
msoBarLeft, msoBarTop, msoBarRight, msoBarButtom определяют
положение меню слева, вверху, справа
или внизу окна, msoBarFloating задает «плавающее»
меню, msoBarPopup указывает, что новое меню
будет всплывающим).

Значение
True параметра MenuBar
указывает
на то, что новое меню заменит текущую
активную строку меню (по умолчанию –
False). Значение True параметра Temporary
означает,
что новое меню будет временным и исчезнет,
когда закроется содержащее его приложение
(по умолчанию – False).

В
следующем примере создается новое меню
«Головное
меню»:

Dim
CstmBar As CommandBar

Set
CstmBar = CommandBars.Add(Name:=»
Головнoe
меню«,

Position:=msoBarTop,
MenuBar:=True, Temporary:=False)

Добавление
выпадающих меню

Чтобы
добавить новое меню программно, надо
использовать метод Add коллекции
CommandBarControls, применив его к объекту типа
CommandBar, который представляет панель
нашего меню. Данный метод позволяет
помещать на панель кнопки (CommandBarButton),
комбинированные списки (CommandBarComboBox) и
выпадающие меню (ComandBarPopup).
Вызов
метода
имеет
вид:

выражение.
Add(Type, Id, Parameter, Before, Temporary),

где
Выражение
должно
возвратить объект типа CommandBarsControl.

Параметры
в скобках необязательны. Параметр Туре
(Тип)
задает тип добавляемого объекта. Его
значение msoControlPopup указывает, что
добавляемый управляющий элемент –
выпадающее меню. Для пользовательских
меню параметры Id
и
Parameter
можно
опустить. Значение аргумента Before
число,
указывающее положение нового элемента
в последовательности элементов панели:
если его нет, элемент помещается в конец.
Определить имя и ключ быстрого доступа
к созданному меню можно, задав значение
свойства Caption.

Пример
добавления выпадающего меню Ввод
документов
панели
Головное
меню
с
ключом быстрого доступа «В»:

Dim
CstmCtrl As CommandBarControl

Set
CstmCtrl = CstmBar.Controls.Add(Type:=msoControlPopup,

Before:=1)

CstmCtrl.CaptioN=
«&
Ввод
документов»

Чтобы
добавить новое подменю программно, к
объекту, представляющему родительское
выпадающее меню, нужно применить метод
Add коллекции CommandBarControls. В качестве
параметра Туре (Тип) надо использовать
значение msoControlPopup.

В
следующем примере в конец выпадающего
меню Ввод
документов,
расположенного
на панели меню Головное
меню,
добавляется
подменю «о движении товаров»:

Dim
CstmPopUpi
As
CommandBarPopup

Set
CstmPopUpi =

stmCtrl.Controls.Add(Type:=msoControlPopup)

CstmPopUpi.CaptioN=
«о движении товаров»

Добавление
команд

Добавить
новую команду в меню можно, применив
метод Add коллекции CommandBarControls к объекту,
представляющему изменяемое меню. Для
того чтобы добавить собственную команду,
вставьте ее имя в меню, а затем в качестве
значения свойства OnActioNзадайте имя
VBA-процедуры, которая должна вызываться
при выборе данной команды. В качестве
значения аргумента Туре (Тип) метода
Add укажите msoControlButton, означающее, что
вставляемый в меню элемент будет
командой. Добавим команду «Накладная»
в выпадающее меню Ввод
документов
из
панели Головное
меню.
Выбор
этой команды запускает процедуру
Invoice:

Set
CstmCtrl = CstmPopUpi.Controls.Add(Type:=msoControlButton)

CstmCtrl.CaptioN=
«
Накладная»

CstmCtrl.OnActioN=
«Module1.Invoice»

Метод
Add позволяет вставлять в меню и встроенные
команды. Для этого при вызове задайте
значение параметра Id, равное числовому
идентификатору данной команды в Office.
Поскольку в Office 2000 количество команд
доходит до 4000, в табл. 22 приведем основные
команды редактирования.

Таблица
22

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

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода VBA Excel. Свойство CommandBars объекта Application.

Свойство Application.CommandBars

Свойство CommandBars объекта Application возвращает коллекцию командных панелей Microsoft Excel.

Примеры командных панелей, вызываемых кликом правой кнопки мыши (контекстных меню):

  • CommandBars(«Cell») – контекстное меню ячейки;
  • CommandBars(«Row») – контекстное меню строки;
  • CommandBars(«Column») – контекстное меню столбца.

Добавление кнопки из кода VBA Excel в контекстное меню ячейки. Кнопки в контекстные меню строк и столбцов добавляются аналогично.

‘Объявляем объектную переменную cmdBarBut

Dim cmdBarBut As CommandBarButton

‘Создаем временную (Temporary:=True) кнопку для контекстного

‘меню ячейки и присваиваем ссылку на нее переменной cmdBarBut

Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True)

With cmdBarBut

   ‘Присваиваем кнопке название

   .Caption = «Новая кнопка»

   ‘Задаем отображение в контекстном меню только названия кнопки

   .Style = msoButtonCaption

   ‘Назначаем кнопке процедуру (макрос)

   .OnAction = «MySub»

End With

Если хотите создать постоянную кнопку для контекстного меню, используйте параметр Temporary метода Controls.Add в значении False, которое применяется по умолчанию:

Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add

Созданная предыдущим кодом VBA временная кнопка контекстного меню ячейки будет утилизирована только при закрытии приложения Microsoft Excel. Это означает, что если в приложении открыты несколько книг, тогда после закрытия книги с кодом, создавшим кнопку, она продолжит существование и будет доступна из других открытых книг. Если это не желательно, можно удалить кнопку следующей строкой:

Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

Эта же строка удалит и постоянную кнопку.

Примеры добавления и удаления кнопок

Пример 1

Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии книги и удаление кнопки при закрытии книги.

Добавление кнопки (код размещается в модуле книги):

Private Sub Workbook_Activate()

Dim cmdBarBut As CommandBarButton

    On Error Resume Next

        Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True)

            With cmdBarBut

               .Caption = «Новая кнопка»

               .Style = msoButtonCaption

               .OnAction = «MySub»

            End With

    On Error GoTo 0

End Sub

Удаление кнопки (код размещается в модуле книги):

Private Sub Workbook_Deactivate()

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

Вызываемая процедура (код размещается в стандартном модуле):

Sub MySub()

    MsgBox «Кнопка работает!»

End Sub

Пример 2

Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии контекстного меню и удаление кнопки при завершении вызываемой процедуры.

Добавление кнопки (код размещается в модуле книги):

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Dim cmdBarBut As CommandBarButton

    On Error Resume Next

        With Application

            ‘Удаляем ранее созданную кнопку, если она не была

            ‘нажата и не была удалена назначенным ей макросом

            .CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

            Set cmdBarBut = .CommandBars(«Cell»).Controls.Add(Temporary:=True)

        End With

        With cmdBarBut

           .Caption = «Новая кнопка»

           .Style = msoButtonCaption

           .OnAction = «MySub»

        End With

    On Error GoTo 0

End Sub

Удаление кнопки при закрытии книги, если она при вызове контекстного меню не была нажата и не была удалена назначенным ей макросом (код размещается в модуле книги):

Private Sub Workbook_Deactivate()

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

Вызываемая процедура с кодом удаления вызвавшей ее кнопки из контекстного меню (код размещается в стандартном модуле):

Sub MySub()

MsgBox «Кнопка работает!»

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

/VBA Tips /How to Create a Menu with VBA

A useful feature of Office Applications like Excel and Word is that you can create your own menu’s and menu items. If you are creating an Add-In you will want to create a menu using VBA.

By doing so you can simply create the menu when your application is started and you can remove the menu again when your application is closed.

The following sub procedure demonstrates how to create a Command Bar and add a few buttons and popups. Both the captions and icons of a button are displayed.

Excel VBA: Different Types Of Excel Macros


How to Create a Menu with VBA


Notes

Create a Menu with VBA

Create a Menu with VBA

In VBA a menu is called a Command Bar. It is good practice to include error trapping to avoid error messages for unexpected events like a application crash.

In Excel 2007 the menu’s have been replaced with the ribbon. However, menu’s are still supported in these versions. Once loaded they are located under the tab ‘Add-Ins’.

Code

'Copy the following code to a new module
'
Sub CreateMyMenu()
    Dim myCB As CommandBar
    Dim myCBtn1 As CommandBarButton
    Dim myCBtn2 As CommandBarButton
    Dim myCPup1 As CommandBarPopup
    Dim myCPup2 As CommandBarPopup
    Dim myCP1Btn1 As CommandBarButton
    Dim myCP1Btn2 As CommandBarButton
 
    ' Delete the CommandBar if it exists already
    On Error Resume Next
    Application.CommandBars("MyMenu").Delete
 
    ' Create a new CommandBar
    Set myCB = CommandBars.Add(Name:="MyMenu", Position:=msoBarFloating)
 
    ' Add button 1 to this bar
    Set myCBtn1 = myCB.Controls.Add(Type:=msoControlButton)
    With myCBtn1
     .Caption = "1st Button"
     .Style = msoButtonCaption   '<- force caption text to show on your button
    End With
 
    ' Add popup menu 1 to this bar - this is a menu that folds out
    Set myCPup1 = myCB.Controls.Add(Type:=msoControlPopup)
    myCPup1.Caption = "Statistics"
 
    ' Add button 1 to popup menu 1
    Set myCP1Btn1 = myCPup1.Controls.Add(Type:=msoControlButton)
    With myCP1Btn1
     .Style = msoButtonAutomatic
     .FaceId = 487
    End With
 
    ' Add button 2 to popup menu 1
    Set myCP1Btn1 = myCPup1.Controls.Add(Type:=msoControlButton)
    With myCP1Btn1
     .Caption = "Click me!"
     .Style = msoButtonIconAndCaption
     .FaceId = 59
     .OnAction = "SubItworks"    '<- call the sub routine SubItWorks
    End With
 
    ' Add a second button to this bar
    Set myCBtn2 = myCB.Controls.Add(Type:=msoControlButton)
    With myCBtn2
     .FaceId = 17  ' <- Face Id 17 is a barchart icon
     .Caption = "Barchart"    '<- shows when hovering mouse over icon
    End With
 
    ' Show the command bar
    myCB.Visible = True
End Sub
 
Private Sub SubItWorks()
    MsgBox ("Eureka, it works!")
End Sub

Excel VBA Tutorial : Workbook Events and Procedures

Usage

Normally you would want to create the menu when the application starts and delete the menu again when the application closes. To make that happen you will need to add another subroutine to the module that will unload the menu.

Sub DeleteMyMenu()
    On Error Resume Next
    CommandBars.FindControl(Tag:="MyMenu").Delete
    CommandBars("MyMenu").Delete
End Sub

On the workbook code page you can add the following code to automatically load the menu at startup and unload it on exit.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    DeleteMyMenu
End Sub
 
Private Sub Workbook_Open()
    CreateMyMenu
End Sub

Relevant URLs

MsoButtonStyle Enumeration for Office 2007 (applies to other versions as well)


Courtesy: vba & excel


Also See

  • Excel Formula Vs Function : What is the difference?
  • 7 Simple Tricks to Make Smart and Neat Excel Graphs
  • 14 Advanced Excel Tips and Tricks for Basic to Intermediate Users
  • How to Reduce Size of Excel Files? – Top 10 Tips

Related

Понравилась статья? Поделить с друзьями:
  • Excel vba масштаб листа
  • Excel vba обозначение пустой ячейки
  • Excel vba массивы списки
  • Excel vba обновление сводной таблицы
  • Excel vba массивы сортировка