Создание меню в excel на vba

Ранее я рассмотрел методы создания пользовательских форм и основы работы с ними (если вы никогда не работали с пользовательскими формами, рекомендую для начала прочитать указанную заметку). В настоящем материале приводится целый ряд практически полезных примеров пользовательских диалоговых окон.[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.

Новое
меню в 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 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

�����: ������� ����������������

����� 10

�������� ������������ ��������� ����[9]

�������� ���� � ������� ����������� ���� ����������

�������� ������������ ���������� � ����������� ���������� �������������� ����������, ������ ���������� ��������� ������ ���������� � ����������� ��������� ����, ������� ��������� � ������� ����� ���� ����������. ����������� �������� ���� ��� ���������� ������� ����� �������������� �������, ������ ���������� ���� ���������� ��� ��������� VBA.

�� ���� ����������� Office ����� �������������� ����������� �������� ���� ���������, ��������� ��� ����� ���������� ���� ����������. ��� ��� ������ ����� � ���� ��� ������� ������� ������ ������������, � ����� � ����������� ������� � ������� ���������. ����� ���� ��������� ���:

1)��������� ������ ��������� �� ������� ������ ������������ (���. 117);

2)�� ����������� ���� ��������� ������ ������������ (���. 116) ������� ��� ������������ ����, � ������ ������ �������� ������ ��������� ���� ���������� ������� ��� ���������, ��� �������� ��������� ������ (�� Normal!) � �������� ������ ��. �� ������ �������� ��������� ������ � �������� ������ (���. 118);

3)���� ������ ���� ���������� (���. 119) � ������� ��������� �������� ����������� ������� ��� ���������� ����. � ���������� �� ������ �������� ������ ��������� ������ (���. 120).

���. 117. ���� �������� ����������� ������

���. 118. ���������� ���� ��������� ������ ������������

���������� ���������� ����

���� ������ ���������� ���� ��� ������� ���������, � ���, � ������� �� ��������� �������� ������ ����, ����� ��������� � ����� ���������� Office. �������� ���������� ���� ����������, � �����:

1)����� ��������������� ���� �� ������ ���, ��������� ������ ������ ����� � ������ ����������� ���� � ������ ������ ������������ �� ����������� ������� ������ ������������;

���. 119. ���� ����������

2)�� ������ ��������� �� ������� ������� �������� ����� ���� (���. 120);

3)��������� ������� ����� ���� ������ � ������ ������� � ���������� �� � �� ����, � �������� ����������� ����� ����. ��� ���� ���� �I� �������� �� �����, ���� ������� ��� ������ ���� (���. 120);

4)��������� ������ ������� ���� ����� ���� (��� ���������� ���� ���������), ������� ��� ����� ���� � ���� ��� (���. 121) ������������ ����.

���� ������ �������� ��� ������ ����, �� �� ������ ��� ��� �������� ������ �������������.

���. 120. �������� ������ ���� � �������� ���� ����������

���. 121. �������������� ������ ����

���������� �������

������� (��� �������� ����) ��������� � ������� ������� ������������� ���� �� ������ ��� �������, ������� �������� ���������� �������. ������� ����� ��������� � ���������� � ����������� ����, � ����� � � ������ �������. ������� ����������� ������ �������, ����� � ���� ����������� �������.

��� ���������� ������� ����� �������������� ���������� ���� ���������� � ������� �������������� ���� �������. ����� ����� ����� ����������� ���:

1)��� ������� ������� � ������ ��������� �������� ������� ����� ����;

2)��������� ������� ����� ���� ������ � ������ ������� � ���������� �� � �� ����� ����, ���� ����� �������� �������. ����� ���������� ���� ���������, ������� ��� ��������� � ��� ��������, ��������� ����� ���� ����� ��� ����������� ����. ��� ���� �������������� ����� ����� �������� �� ����� � ������ ������ ����������� ����, ���� ������� ��������� ������ �������;

3)��������� ������ ������� ���� ����� ���� � ������� ��������� ������ ������� � ���� ��� ������������ ����. ������ ��� ������ ��������� ������� ������ ��� ����� �� ���� �������� ������ ������� (���. 122).

���. 122. �������� �������

���������� ���������� �������

MS Office ��������� ��������� ������� � ����� ���������� � ���������������� ����, � ����� �������� ������� ���, ������������ � ��������� �������� ���� ������ ������ �� ������.

� ���������� ���� ���������� �������� �������������� ���� �������, � �����:

1)��� ������� ������� �������� � ������ ��������� ��������� ����������� ������� � ��� ������� ������ ��������� ����� �������� � ������ �������;

2)��������� ������� � ������ ������� � ���������� �� � �� ���� ��� �������, ���� ��� �����������. ����� ���������� ���� ��� ������� ���������, ������� ��������� � ��� ��������, ��������� ������� ����� ��������� ���������������� ����������� ���� ��� �������. �������������� ����� �������� ����� � ������ ������ ����������� ����, ���� ������� ��������� ������ ������� (���. 123).

���. 123. ���������� ���������� ������

����������� ������� ����� � �����: �������� �� ����� ���� � ������ �������� � ���������� �� � ���� ���� ��� ������� ������� Ctrl.

���������� ����������� �������

���������� ������� � ������� ���� ���������� � ����������� ��� ���������� ���� ������� �� ���������� Office, � ������� ��� �����������:

Microsoft Excel. �������� ��� ��, ��� � ��� ������� ���������� �������, �������� � ������ ��������� ������� ������ (Macros) � ���������� ������� ������������� ������� ���� �� ������ ������� � ����. �������� ��� ������� ������ ������� ���� � �������� � ����������� ���� ������� ��������� ������. ����� ������� � ���� ��� ��� �������, ������� ������ ����������� �������� ����;

Microsoft Word Microsoft PowerPoint. ��� ��� ������� ���������� �������, �������� � ������ ��������� ������� ������� � ���������� � ���� ��� ������� ������� �� ������ ������� (���. 125, ��������� � ����� 2). ��� ����� �������������� ���������� ������� ������ (������) � ����������� ������ � ��������� (���. 124). ��������� �������� ������� ������� �� ���. 126.

���. 124. �������� ������� (������) ������� ������������� �����

���. 125. ����� ������� (������), ������������ �����

���. 126. ���������� ����������� ������� � ������������� ������ � �� ������

�������� �������

��� �������� ���������� ���� ���� � ���������� ���� ���������� ������� ������� �������������� ����, �������� ������ ������� ���� ��������� ������� � � ����������� ���� ������� ������� �������. ����� ������� ������� ���������������� ������ ����, ����� ������� �� ������� ������ ������������ ����������� ���� ���������� �, ������ � ������ ������ ������������ ��� ��������� ������ ����, �������� ������ �������.

�������������� ���������� ����������� ����

������������ ����� ������ ���������� ������� ����, ������� ��� ����� ������. ��� � ������ �������� ��� ����, ��� �������� � ���� ����������. ���� ��� ���� ������������� ��������� ����������� ���� ��� �������, �� ������ � ��� ������������� ���� ���� � ��� ��� �������.

� ���������� ���� ���������� ����� ������� ������� �������������� ����. �����, ������� ������ ������� ���� ��������� ����������� ���� ��� �������, ������� ����� ������������, �������� � ����������� ���� ������� �����.

����� ������������ ���������� ������ ����, ��������� �� ������� ������ ������������ ���� ����������, �������� � ������ ������ ������������ ��� ����������������� ������ ���� � �������� ������ �����.

�������� ���� � ������� VBA

����� ���� � 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

�������� ������� ��������������� ���������� ������ ����

������ ���������� ������� �������� ������������ Spelling � ���� �������� �� ������ �������� ����:

Set mySpell = CommandBars(��������� �����).��ntrols(���������)_.Controls.Add(Id:=2)

������ 61. ������� ��������, � ������� ����� ��������� ��� ���������� ���� � ������� ����������� ������������� ����. �� ������� ������ ���� ����� �������� �� ������ ������. ��� ����� �������� ��� �������, ������ �� ������� �������� �� ����� �������. ��� ���������� ������ ������� ������� ������� �����, ���������� ��� ������: ������� ������ (���. 127). ������ ������ ��������� ��� ������ ��������� ��������� � ������� ����������� ���� (���. 127), ������ ������ ���������� ��� ������ �� ����� (���. 128).

���������� ����������

1.�������������� ���������� Word � �������� ��������.

2.���������� � �������� VBA � �������� �����.

3.��������� ��������� �������� ����������� ������.

Option Explicit

Public Sub CreateCustomMenu()

Dim CstmBar As CommandBar

Dim CstmPopUpi As CommandBarPopup, CstmPopUp2 As CommandBarPopup

Dim CstmCtrl As CommandBarControl

Dim Exist As Boolean

‘��������� ��� ������

For Each CstmBar In CommandBars

CstmBar.Enabled = False

Next CstmBar

‘�������, �������� � ������ ������� ����������� ������

Exist = False

For Each CstmBar In CommandBars

If CstmBar.Name = ��������� ����� Then

Exist = True

Exit For

End If

Next CstmBar

If Not Exist Then

Set CstmBar = CommandBars.Add(Name:=»������oe ����», Position:=msoBarTop, MenuBar:=True, Temporary:=False)

End If

CstmBar.Enabled = True

CstmBar.Visible = True

‘��������� ���� �� ������

Exist = False

For Each CstmCtrl In CstmBar.Controls

If CstmCtrl.Caption = �&���� ���������� Then

Exist = True

Exit For

End If

Next CstmCtrl

If Not Exist Then

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

CstmCtrl.Caption = �&���� ����������

‘��������� ��� ������� �������

Set CstmPopUpi =

CstmCtrl.Controls.Add(Type:=msoControlPopup)

CstmPopUpi.Caption = � � �������� �������

Set CstmPopUp2 =

CstmCtrl.Controls.Add(Type:=msoControlPopup)

CstmPopUp2.Caption = � �����������

‘��������� ������� � ������ �������

Set CstmCtrl =

CstmPopUpi.Controls.Add(Type:=msoControlButton)

CstmCtrl.Caption = �����������

CstmCtrl.OnAction = �Module1.Invoice�

Set CstmCtrl =

CstmPopUp2.Controls.Add(Type:=msoControlButton)

CstmCtrl.Caption = �����

CstmCtrl.OnAction = �Module1.Account�

End If

End Sub

��������� � ���������. �������, ��������� �������� Enabled, ���� ��������� ��� ������. ����� ���� ������������ �������� ���� � ����� ������� � ���������, ���������� ����� ���� �����. �������� ��������: ����� ����������� ������ ������ ������ �����������, � �� ��� �� �� ��� ��������. �������� �������� ��������� �������� ������, ����������� ��� �������� �������� ��� ������������ ����� ��� ������� ��������������.

4.��������� ��������� �������������� ������� ������������ ���������.

Public Sub ResetMainMenu()

Dim CstmBar As CommandBar

‘�������� ��� ������

For Each CstmBar In CommandBars

CstmBar.Enabled = True

Next CstmBar

Set CstmBar = CommandBars.Item(�Menu Bar�)

CstmBar.Visible = True

End Sub

5.���������� ���������� ������ ���������.

Private Sub CommandButton1_Click()

Call CreateCustomMenu

End Sub

6.���������� ���������� ������ �������, ����������������� ����������� ���������.

Private Sub CommandButton2_Click()

Call ResetMainMenu

End Sub

7.������ ������ ��� �����������, �������� ���������, ���������� � ����� �� ����� ������ ���� ��������� ����:

Public Sub Invoice()

MsgBox (����������!�)

End Sub

Public Sub Account()

MsgBox (�����!�)

End Sub

8.��������������� ���������, ��������� ����� �� ����������.

���. 127. ����� ������� 61 � ������� ������. ��������� ������ ������ �������

����������. ������ ������ ���������� ��� ����� ������������� ������������� ��������� �������: � �������� ���� ������������ ������� ����� �����, ������� �������� ��������������� �����, ������������� ���� ����� ���������� (���. 129, 130). ����� ������� ������ ������� ���� ����� ���������� Word ����������, ��������� ������� ����, ��������� ����������. � ���� ���� ����� ������� � ���� + ������ ��������� ����� � ���������������� �������� (������� ��������).

���. 128. ��������� ������ ������ ��������

���. 129. ������� ���� ������������ � ���������� �����

���. 130. ������� ���� ����������, ��������� ����������, � ����� ������, ���������� ����� � ������� ��������

ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

1

Создание своего меню

24.11.2013, 10:24. Показов 7382. Ответов 16

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Создал свое меню, как назначить макрос кнопке

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
Public CBar1 As CommandBar
Dim b As Variant
Public Sub MyBar()
    On Error Resume Next
    Application.CommandBars.Add(Name:="2 Лист").Visible = True
    Set b = Application.CommandBars("2 Лист").Controls.Add(Type:=msoControlButton, ID:=2950, Before:=1, Temporary:=True)
    b.Style = msoButtonCaption
    b.Caption = "Сброс листа"
    b.TooltipText = "Сброс границ 2 листа"
    b.OnAction = "List2Borders()"
End Sub

List2Borders() — макрос



0



ikki

призрак

3261 / 889 / 119

Регистрация: 11.05.2012

Сообщений: 1,702

Записей в блоге: 2

24.11.2013, 11:42

2

Visual Basic
11
    b.OnAction = "List2Borders"



1



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 12:13

 [ТС]

3

А как сделать, чтобы CBar1 появлялся при активации определенного листа, а при активации других скрывался

Visual Basic
1
2
3
Private Sub Worksheet_Activate()
    CBar1.Visible = False
End Sub

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



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,148

24.11.2013, 12:48

4

а при активации других скрывался

проверяй имя активируемого листа

Visual Basic
1
2
3
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    MsgBox Sh.Name
End Sub



0



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 14:57

 [ТС]

5

Цитата
Сообщение от Alex77755
Посмотреть сообщение

проверяй имя активируемого листа

Visual Basic
1
2
3
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    MsgBox Sh.Name
End Sub

Этот код не работает ни в модуле ни на листе

Код на 1 листе (где надо скрыть меню)

Visual Basic
1
2
3
Private Sub Worksheet_Activate()
    CBar1.Visible = False
End Sub

Код на 2 листе (где надо отобразить меню)

Visual Basic
1
2
3
Private Sub Worksheet_Activate()
    CBar1.Visible = True
End Sub



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

24.11.2013, 15:20

6

Проверено независимым экспертом — код Workbook_SheetActivate() работает!
Естественно из модуля. Книги.



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 15:37

 [ТС]

7

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Проверено независимым экспертом — код Workbook_SheetActivate() работает!
Естественно из модуля. Книги.

Это лирическое отступление! Вернемся к нашему CBar1



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 15:46

 [ТС]

8

Книга1.xls
Не работает. Офис 2003



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

24.11.2013, 16:44

9

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



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,148

24.11.2013, 16:53

10

Независимый эксперт подтвердил же: работает!
Вот фома неверующий…



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 20:28

 [ТС]

11

Sh.Index

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



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

24.11.2013, 20:41

12

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

Visual Basic
1
2
3
4
5
6
7
8
Private Sub Workbook_Activate()
    AddToMenuSea
End Sub
 
 
Private Sub Workbook_Deactivate()
    DeleteFromMenuSea
End Sub

И в модуле:

Visual Basic
1
2
3
4
5
6
Sub DeleteFromMenuSea()
    On Error Resume Next
    CommandBars("Cell").Controls("Import Ferries").Delete
    Err.Clear
    On Error GoTo 0
End Sub

К своему файлу прикручивайте сами — он есть только у Вас.



0



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

24.11.2013, 20:48

 [ТС]

13

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



0



ali_vlad

5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

25.11.2013, 23:35

 [ТС]

14

Есть меню:

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
Public CBar1 As CommandBar
 
Public Sub MyBar()
    Dim Button2List As CommandBarButton
    Dim Rota0Ins As CommandBarButton
    Dim Rota0Del As CommandBarButton
 
    On Error Resume Next
    Set CBar1 = Application.CommandBars.Add(Name:="2 Лист", Position:=msoBarFloating, MenuBar:=False, Temporary:=True)
    CBar1.Visible = True
    
    Set Button2List = CBar1.Controls.Add(Temporary:=True)
    Button2List.Style = msoButtonCaption
    Button2List.Caption = "Сброс листа"
    Button2List.TooltipText = "Сброс границ 2 листа"
    Button2List.OnAction = "List2Borders"
    
    Set Rota0Ins = CBar1.Controls.Add(Temporary:=True)
    Rota0Ins.Style = msoButtonCaption
    Rota0Ins.Caption = "1отд +"
    Rota0Ins.TooltipText = "Вставка строки 1"
    Rota0Ins.OnAction = "Insert1"
 
    Set Rota0Del = CBar1.Controls.Add(Temporary:=True)
    Rota0Del.Style = msoButtonCaption
    Rota0Del.Caption = "1отд -"
    Rota0Del.TooltipText = "Удаление строки 1"
    Rota0Del.OnAction = "Delete1"
End Sub

Как сделать его вертикальным, чтобы сначала была 1 кнопка, под ней располагались 2 и 3, под ними 4 и 5 (в проекте)



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,148

26.11.2013, 10:11

15

В общем случае: добавлять кнопки на панель.
Вот пример с меню. С панелью аналогично:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub RET()
Dim L
With Application.CommandBars("Worksheet Menu Bar")
'Создание строки меню Файл
        With .Controls.Add(Type:=msoControlPopup)
                .Caption = "Твоё название меню"
                With .Controls
                        For L = 1 To 5
                         With .Add(Type:=msoControlButton)
                        .Caption = "Команда " & L
                        .OnAction = "Твоя команда текущей кнопке"
                     End With
                Next L
                End With
        End With
End With
End Sub



1



5 / 5 / 2

Регистрация: 21.07.2013

Сообщений: 362

26.11.2013, 11:14

 [ТС]

16

Вам конечно спасибо, но вы предлагаете выплывающее меню, а у меня статичное. В связи с этим вопрос: как вызывать меню в заранее определенном диапазоне range()



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,148

26.11.2013, 23:27

17

вы предлагаете выплывающее меню

Это отнюдь не «всплывающее меню», а самое обыкновенное.
А вот «как вызывать меню в заранее определенном диапазоне range» непонятно.
Я такого не знаю! Не контекстное меню?
Я привёл пример добавления пункта с кнопками в меню.
Скопируй в модуль, запусти (даже вручную) и посмотри в меню



0



Понравилась статья? Поделить с друзьями:
  • Создание математической формулы в word
  • Создание математических функций в excel
  • Создание математических формул в word практические работы
  • Создание математических формул в word практическая работа
  • Создание математических формул в word 2007