Как сделать меню в vba

Обновлено: 08.07.2024

11. ИСПОЛЬЗОВАНИЕ ФОРМ

11.1. Настройка окна приложения

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

Нет ни границ, ни заголовка. Форму нельзя перемещать. Используется, как правило, для заставок

1 – Fixed Single

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

Допускает изменение размеров и использование кнопок минимизации и максимизации. Привычный тип окна, используемый в большинстве случаев и устанавливаемый Visual Basic по умолчанию

3 – Fixed Dialog

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

4 – Fixed ToolWindows

5 – Sizable ToolWindows

Также для управления параметрами окон очень важными являются следующие события:

· Load – событие генерируется каждый раз при загрузке формы с диска. Обычно используется для установки некоторых свойств элементов управления, констант и переменных, необходимых для начала работы приложения.

· Resize – событие, возникающее при изменении размеров окна формы (перенос границ мышкой или использовании кнопок минимизации и максимизации). Используется, как правило, для изменения размеров и расположения элементов управления в окне формы при переносе ее границ. При загрузке формы с диска также генерируется.

Private Sub Form_Load( )

Любая программа, содержащая более пары примитивных функций, только выигрывает, если в нее добавить удобное меню. Основная цель программиста – максимально упростить работу с функциями программы. Эту цель помогает достичь правильно организованная система меню. Меню – наиболее заметная часть приложения. Хорошие меню существенно упрощают использование программы.

К программам, использующим стандартные возможности Windows , предъявляются дополнительные требования: они должны соответствовать стандартам, принятым для Windows -приложений. Цель Microsoft – сделать основные функции Windows стандартными для графического интерфейса пользователя ( Graphical User Interface – GUI ).

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

Отдельные элементы и соглашения типовых меню также стандартизованы и перечислены в табл. 24.

Стандартные соглашения о меню в Windows

Используется одно или два кратких характерных слова

Пункты меню должны быть логически сгруппированы, к каждой функции должен быть предоставлен доступ с минимальным числом уровней

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

Любому часто используемому пункту меню необходимо назначить быструю клавишу или комбинации клавиш, которые также должны быть уникальными

Пункты меню, которые просто включают и отключают одну опцию программы, должны иметь флажок проверки прямо в меню

За каждым пунктом меню, открывающим диалоговое окно, должно следовать многоточие (…)

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

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

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

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

Удаление кнопки из контекстного меню

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

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

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

Пример 1

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

visual basic меню формы

Если у Вас возникли вопросы, предлагаем просмотреть видео урок visual basic по выполнению дополнительного задания к данной лабораторной работе.

Кроче того, можно просмотреть еще видео-фрагмент:

  1. Каково основное назначение меню формы?
  2. Как запрограммировать необходимый пункт меню?
  3. Какое свойство служит для изменения фона объекта?
  4. С помощью какого свойства меню можно сделать недоступным какой-либо пункт?

Создаваемая панель инструментов

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

На панель можно добавлять как обычные кнопки, так и раскрывающиеся выпадающие списки, подменю, текстовые поля.

Формирование панели инструментов происходит при загрузке файла, при закрытии же его - созданная панель скрывается:

Основной код модуля:

Комментарии

Решение с кодировкой описано по этой ссылке

у меня английский excel, со шрифтами беда

Подгрузка своих картинок с диска

Sub ImageFromExternalFile()
Dim Btn As Office.CommandBarButton
Set Btn = Application.CommandBars.FindControl(ID:=30007) _
.Controls.Add(Type:=msoControlButton, temporary:=True)
With Btn
.Caption = "Click Me"
.Style = msoButtonIconAndCaption
.Picture = LoadPicture("C:\TestPic.bmp")
End With
End Sub

Подгрузка своих картинок из документа

Sub ImageFromEmbedded()
Dim P As Excel.Picture
Dim Btn As Office.CommandBarButton
Set Btn = Application.CommandBars.FindControl(ID:=30007) _
.Controls.Add(Type:=msoControlButton, temporary:=True)
Set P = Worksheets("Sheet1").Pictures("ThePict")
P.CopyPicture xlScreen, xlBitmap
With Btn
.Caption = "Click Me"
.Style = msoButtonIconAndCaption
.PasteFace
End With
End Sub

Если вопрос личного плана, - на почту или в скайп.
Если надо что-то сделать за денежку, - оформляете заказ.
Если вопрос по Excel (но статьи на сайте нет), - обращайтесь на форумы по Excel (там всегда подскажут и помогут)

Да, не туды в Object Browser'e глянул, извиняюсь.

А если у меня вопрос к Вам, не касающийся этой темы, и подходящей темы нет, то как быть?

Ну а как нет-то. смотрите пример в этой статье
Если вы говорите про msoControlButton на панели инструментов Excel

Оно хорошо, но разве у Button есть свойство FaceID?

Ещё вопрос: как можно кнопке типа msoControlButton указать свою картинку? Что надо загнать в свойство Picture и какие требования предъявляются к таким иконкам?
Заранее спасибо за ответ)

Здравствуйте (свинтус я, что сразу не поздоровался).
Подход правильный, т.к. суть во внешней подписке, которая слушает эти события - конечная цель в ней, а не в них. Private убирал, но не видит он эти Sub'ы всё равно. Хотя, попробую ещё. А вот вариант "сам-себе-присвоил" красивый. Не знал, что эксель на такое ведётся и событие изменения генерит. Спасибо!
. хотя в идеале всё равно хотелось бы своё событие дёргать, а не штатное.

Здравствуйте, Яков
Самый простой способ вызвать обработчик события, - просто обратиться к нему, как к любому другому макросу.
Ну и конечно, слово Private перед Sub надо убрать:

Код вызова примерно такой:

Второй простой способ вызвать обработчик этого события, - сделать вид, что мы изменили значения в диапазоне:

как-то так
для разных событий - по-разному.

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

PS: Вариант с RaiseEvent не сработает, - он в других случаях применяется.

Как можно (и можно ли) вызвать из макроса, подцепленного к кнопке, любое штатное событие книги/листа/приложения? Нужно как-то "пнуть" обработчик события. Если есть способ дёрнуть RaiseEvent'ом или ещё как свои собственные события - тож хорошо.

Хоть вопрос и не имеет никакого отношения к теме статьи, всё же предложу вариант:


эта метка не сохраняется при сохранении файла
потому, если на следующий день снова откроете файл, и запустите макрос - он сработает

можно метку прописывать в ячейку - заменив в коде Cells(1).ID на range("h2").value

Добрый день Игорь. воспользовался Вашим кодом для создания панелей инструментов. У меня возник вопрос : по нажатию на кнопку копировать диапазон данные копируются на лист2 и удаляется столбец. Как запретить повторное копирование так как после повторного нажатия кнопки удаляется столбец на новом листе.
Использую такой код :
' Кнопка копирование диапазона"

Sub Copy_Range()
On Error Resume Next
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(5, 1), Cells(LastRow, 5)).Copy Sheets("Лист2").Cells(5, 1) ' Копирование данных на лист2
Sheets("лист2").Columns("D:D").Delete Shift:=xlToLeft 'удаление столбца D

Здравствуйте, вот код который добавляет на ленту в надстройки кнопку:

Sub addinn1()
With Application.Toolbars(1).ToolbarButtons.Add(Button:=222)
.Name = "Кнопка"
.OnAction = "макрос1"
End With
End Sub

Какой вид будет иметь кнопка, зависит от ее id. Мне нужен список с описанием "id - кнопка". Помогите кто чем может!

Здравствуйте!
Создал панель инструментов с кнопкой "Отчеты". Мне нужно ,что бы по нажатии на кнопку "Отчеты" появлялся выпадающий список (кнопки)с надписями(5штук)

Вообще-то можно всё, просто Вы с этим ещё не работали.
Я тоже раньше старался придерживаться совместимости версий, но после того, как убедил руководство полностью перейти на Excel 2010, забыл о нужных только мне проверках. Кстати, некоторые вещи без этих проверок не будут корректно выполняться в обоих версиях: например, при создании условного форматирования.
Но я никогда не писал универсальных программ, - только под чётко поставленное ТЗ (мне время дорого и некогда ждать обратную связь).

Я делаю универсальные программы, которые должны работать во всех версиях Excel (начиная с 2003).
Кроме того, меню в некоторых моих программах формируется динамически (макросом).
Как это сделать в Excel 2007? Никак? вот то-то же.
(т.е. сделать-то можно, но кода будет очень много)

А оставлять поддержку только Excel 2010 (где можно программно формировать панель инструментов на ленте) - ещё рано,
очень много пользователей до сих пор сидят на Excel 2003-2007

К тому же, на мой взгляд, функционал важнее красивого меню.
Хотя, через год планирую перевести часть своих программ (где меню не динамические) на красивые менюшки.

Спасибо за информацию, начну изучать.

XML надо не в VBA добавлять, а в сам файл.
Меню проще сделать вручную, чем писать какой-то хитрый код.
Поищите в гугле Ribbon Editor - есть несколько хороших реализаций.

Доброго времени суток!
Интересует вопрос использования в разработке кода xml (в данном случае для отображения больших кнопок). С разметкой я знаком, но никак не могу взять в толк, как добавить в VB код XML, можете задать направление для поиска решения моей проблемы?

Добрый!
Отличный сайт много интересных и нужных вещей. Спасибо.
Теперь вопрос: Панельки прикрутил все запускается отлично, но при каждом открытии Excel панельки создаются в одном и том же месте. Как сделать что они были расположены там и где все панели, что небыло необходимости постоянно их убирать в нужное место?

Очень рад,что обнаружил этот сайт.
Скопировал и запустил в лоб, ОТЛИЧНО.
Я уже думал, что от старой версии Excel пользовательские меню и кнопки маросов исчезли навсегда.
Буду посещать сайт узнавать больше. СПАСИБО.

Подскажите, пожалуйста, как сделать кнопки большого размера на ControlBar?

Спасибо за подсказку. Пожалуй, так и сделаю.

Здравствуйте, Максим.
К сожалению, я не знаю способа принудительно сделать перенос кнопок панели инструментов на другую строку.

Я бы посоветовал вам сделать группировку элементов панели - оно и удобнее, и выглядит лучше:

Здравстуйте, Игорь.
Спасибо за предоставленный код - очень помог в создании собственной надстройки.
Возник вопрос. Если контролов (кнопок, текстовых полей, полей ввода и тп) на разрабатываемой панели надстройки будет много, то все они вытягиваются в одну строку. Как переносить контролы на новую строку, чтобы не пришлось прибегать к кнопке скролинга на панели ">>" ?
Excel 2007.

Старайтесь не пользоваться китайской программой Office Tab, чтобы не было таких проблем как у меня! Она, как раз, управляет вкладками и лезет также в панели.
Снёс её и некоторые (к сожалению только некоторые) коды заработали, в том числе и приведённый вами код.
Спасибо за внимание! Вы оперативно отвели на моё письмо. Очень приятно!

Скажите, пожалуйста, есть ли код VBA для создания своей панели инструментоа в Excel 2010?!
Ни один приведённый здесь код не работает.
У меня просто не раегирует даже на CommandBars("Formatting").Visible = False

Наверное, в Excel 2010 сделать дто с помощью VBA просто не возможно.

Игорь,
Спасибо, за ответ. Я не программист, а простой пользователь.
Прошу прощения, что не нашел на сайте указанные материалы. Вы создали великолепный сайт. На нем очень много полезной информации, но найти нужное трудно.

Я так и не понял Вашу фразу "Хотя, достаточно один раз сформировать панель инструментов, и не удалять её программно при закрытии Excel - она никуда не денется, кнопки продолжат работать (при первом нажатии на кнопку, Excel сам откроет файл надстройки)".

Я взял ваш код вставил в свою надстройку, панель сформировалась, внес в неё свои макросы и удалил ненужный мне код для других кнопок. После закрытия excel панель не запоминается. Может я чего не правильно сделал. И существует возможность вставлять свои макросы в вашу настройку без работы в VBA. Но методом тыка я их не нашел))

Благодаря книги "Программирование на VBA в Microsoft Office 2010" (с.390) я нашел нужный мне код. Книга размещена на вашем сайте, за что отдельно спасибо.

Public Sub avf_panel()
Dim cbar1 As CommandBar
Dim cControll As CommandBarControl
Dim cId As Variant

Set cbar1 = CommandBars.Add(Name:="AVF")
With cbar1
.Enabled = True
.Visible = True

Set cControll = cbar1.Controls.Add(Type:=msoControlButton)
With cControll
.Caption = "Название кнопки"
.TooltipText = "Комментарий кнопки"
.Visible = True
.FaceId = 309 (номер иконки)
.OnAction = "Ваш макрос"

Чтобы создать новую кнопку нужно скопировать-вставить с Set по End With еще раз. Переименовать кнопки и макрос.

С уважением, AVF

AVF, вы не пробовали сначала поискать ответы у меня на сайте?

Если в 2007-м нужны КРАСИВЫЕ БОЛЬШИЕ КНОПКИ, то нужно использовать XML (соответственно, файл будет иметь расширение из 4 букв, и в Excel 2003 работать не будет)

Что мешает каждый раз запускать макрос формирования панели инструментов?
Я так и делаю всегда.
Хотя, достаточно один раз сформировать панель инструментов, и не удалять её программно при закрытии Excel - она никуда не денется, кнопки продолжат работать (при первом нажатии на кнопку, Excel сам откроет файл надстройки)

Игорь, спасибо все получилось.
Но возникла новая проблема. Как сделать так, чтобы настройка не терялась при закрытие - новом открытие excel? Чтобы каждый раз не запускать макрос?
Может сохранить настройку нев Xla, а в Personal.xlsb. Но тогда теряется смысл настройки((
Еще вопрос в excel 2003 можно создать свои кнопки про помощи встроенного редактора. В 2007 и далее этой функции нет. Многие формучане дружественных форумах подминали эту проблему и её решение только писать код в VBA. Причем это код "разный" (у каждого мастера свое кун-фу ;^)). Таким образом это решение не для всех. Вопрос: если создать кнопку+панель в 2003 excele, потом сохранить её в формате .xla и запустить в excel 2007, то будет ли она работать (находиться в закладке надстройки, иметь собственные рисунки кнопок + макросы)?

Добрый день,
Отличный сайт и великолепный Код.
Долго искал как сделать собственную настройку, и наконец все нашел. Спасибо Вам за это.
Вопрос: где можно посмотреть иконки для кнопок и их номера? Если заменить 271 на другое число измениться и иконка.
"Add_Control AddinMenu, ct_BUTTON, 271, "CreateBackup", "Create Backup and Save", , True"
Как использовать свою иконку?

Уважаемый EducatedFool (Игорь), благодарю за то, что поделились наработками по созданию надстроек.

Подскажите, пожалуйста, где можно почитать на пояснения по поводу порядка написания команд и пояснения к ним (фактически интересует построчное пояснение как Вы и написали в предыдущем комментарии.

ПРИМЕР
Add_Control AddinMenu, ct_BUTTON, 271, "НазваниеВашегоМакроса", "Надпись на кнопке", , True

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

Очень просто.
За добавление кнопок на панель, и назначение им макросов, отвечают эти строки кода:

Чтобы назначить ваш макрос кнопке, добавьте в код надстройки такую строку:
(или замените одну из существующий строк)

Здравствуйте!
Подскажите, пожалуйста, как привязать макрос к созданной (с помощью Вашей надстройки) панели инструментов.
Спасибо.

Как при запуске поместить панель инструментов рядом с панелью "Стандартная"?

Надо задать значение свойства Position для панели инструментов.
В вашем случае Position = msoBarTop
Кроме того, не помешает последней строкой кода включить обновление экрана.
В итоге код функции будет выглядеть так:

Читайте также: