Excel своя панель меню

Содержание

  1. Excel VBA — создаем свою панель инструментов
  2. Панель быстрого доступа в Excel
  3. Практическое применение панели быстрого доступа
  4. Настройка панели быстрого доступа Excel
  5. Расширенная настройка
  6. Изменение расположения
  7. Настройка панели быстрого доступа в Excel
  8. Создание панели инструментов для надстройки
  9. Комментарии

Excel VBA — создаем свою панель инструментов

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

  1. не зависит от конкретного файла
  2. располагается в основной панели инструментов
  3. дает кастомизируемый UI

Для того что бы создать такую панель вам потребуется

1) файл excel с расширением xlam, расположенный в %userprofile%appdataroamingmicrosoftaddins

3) определить кнопки по примеру

где p_MemberSelect это процедура VBA

4) в иницилазации процедуры (в файле xlam) нужно передавать предопределенные параметры
Sub p_MemberSelect(ByVal vIRibbonControl As IRibbonControl)

Но у данного решения есть одно ограничение — нет возможности создавать формы, встроенные в панели Excel, например:

Этот пример из проекта In2Sql (плагин для Excel, который визуализирует объекты SQL). В этом плагине код создан с помощью c# и библиотек VSTO.

Источник

Панель быстрого доступа в Excel

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

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

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

Практическое применение панели быстрого доступа

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

  1. Сохранить (CTRL+S).
  2. Отменить ввод (CTRL+Z).
  3. Повторить ввод (CTRL+Y).

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

  1. При загрузке программы активная ячейка на чистом листе находится по адресу A1. Введите с клавиатуры букву «a» и нажмите «Enter». Курсор сместиться вниз на ячейку A2.
  2. Щелкните на инструмент «Отменить ввод» (или комбинацию горячих клавиш: CTRL+Z)и текст исчезнет, а курсор вернется на исходную позицию.
  3. Если выполнить несколько действий на листе (например, заполнить буквами несколько ячеек), то для вас будет доступен выпадающий список истории действий для кнопки «Отменить ввод». Таким образом, вы можете одним щелчком отменить множество действий, что очень удобно.

После отмены нескольких действий доступен список истории для инструмента «Повторить ввод».

Настройка панели быстрого доступа Excel

Панель быстрого доступа – это гибко настраиваемая панель инструментов в Excel для упрощения и улучшения комфортной работы пользователей в программе.

Можно размещать кнопки часто используемых инструментов. Попробуйте самостоятельно добавить кнопку инструмента «Создать».

  1. С правой стороны сделайте щелчок по выпадающему списку для вызова опций настройки.
  2. Из появившегося списка выберите опцию «Создать» и добавится инструмент создания новых книг Excel.
  3. Отметьте еще раз опцию «Создать» из списка настройки, чтобы удалить данный инструмент.

Расширенная настройка

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

  1. Чтобы гибко настроить содержимое панели быстрого доступа необходимо выбрать опцию «Другие команды». Появится окно «Параметры Excel» с уже выбранным параметром «Панель быстрого доступа». Вызвать данное окно можно и через меню «Файл» опция «Параметры» далее выбираем необходимый параметр.
  2. Выберете инструмент в левом списке, который желаете часто использовать. Сделайте щелчок на кнопке «Добавить» и нажмите ОК.
  3. Для удаления инструментов, выберите инструмент из правого списка и нажмите на кнопку «Удалить», а потом ОК.

Изменение расположения

Данную панель при необходимости можно разместить под полосой инструментов, а не над ней.

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

Чтобы вернуть панель обратно (поместив ее над лентой), следует выбрать опцию «Разместить над лентой» аналогичным образом.

Источник

Настройка панели быстрого доступа в Excel

Рассмотрим возможности простой и расширенной настройки панели быстрого доступа в Excel.

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

  1. Нажмите на стрелочку в низ, чтобы раскрыть выпадающий список опций настройки инструментов на панели быстрого доступа.
  2. Попробуйте включить или отключить отображения того или иного инструмента щелкнув по нему на выпадающем списке.
  3. Выберите последнюю опцию выпадающего списка «Разместить под лентой». Панель переместится под ленту вкладок инструментов. В таком режиме панель позволяет разместить значительно большее количество инструментов, к которым нужно часто получать быстрый доступ в процессе работы.
  4. Верните панель на прежнее место выбрав опцию в списке ее настроек «Разместить над лентой».
  5. Теперь из выпадающего списка выберите опцию «Другие команды».
  6. В левой части появившегося окна выберите инструмент «Создать диаграмму» и нажмите на кнопку «Добавить». Иконка выбранного инструмента появится в правой части окна рядом с другими иконками инструментов панели быстрого доступа.
  7. Нажмите «Ок» и на панели быстрого доступа появится новый инструмент, который был недоступный в выпадающем списке.

Теперь у нас всегда под рукой инструмент, который раньше был доступен только по пути: «Вставка»-«Диаграммы»-«Создать диаграмму».

Существенным недостатком в Excel версии 2007-го года – было отсутствие возможности создавать пользовательские вкладки полосы интерфейса наряду со стандартными вкладками «Главная», «Данные» и др. Пользователям можно было настраивать только панель быстрого доступа.

Уже в 2010-ой версии Excel разработчики из Microsoft учли этот недостаток и расширили настройки панелей инструментов. Добавлены следующие возможности настройки вкладок на полосе:

  1. Возможность создавать свои закладки со своим набором групп и кнопок.
  2. Возможность расширять стандартные закладки пользовательскими группами кнопок. Нельзя только удалять и изменять стандартные группы, встроенные по умолчанию.
  3. Возможность отключать и включать все вкладки на полосе Excel (как пользовательские, так и стандартные).

Эти возможности делают более гибкою настройку рабочей среды Excel. Каждый пользователь теперь может организовать интерфейс программы под собственные предпочтения. Можно создать несколько свих собственных панелей с группами инструментов, предназначены для выполнения разного рода работы с данными. А при необходимости можно включать / отключать их отображения для возвращения в стандартный вид программы.

Все эти возможности рассмотрим на следующем уроке: Как создать новую вкладку в Excel?

Источник

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

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

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

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

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

Комментарии

Ну а чем вам не угодило текстовое поле в моём примере?
(см. поля Курс USD и Курс EUR)
Значения им можно не задавать изначальные, — будут обычные пустые текстовые поля.

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

задача:
вставлять текст (ctrl+C) -> дальше нажимать нужную кнопку с макросом -> и дальше

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

у меня английский 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?

Яков, вроде это можно сделать (и даже, по-моему, я делал такое лет 5 назад), — но забыл, как именно.
Возни с этим много, а фактической пользы мало.
Я просто выбираю подходящую среди сотен встроенных в Excel иконок: http://excelvba.ru/code/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

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

Для создания структуры Ribbon menu (для версий выше 11) есть рабочие программы http://clubs.ya.ru/excel/replies.xml?item_no=724
ЗЫ: Сделал один раз красиво и забыл.

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

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

PS: Тут я вам вряд ли что могу подсказать, — сам ещё ни разу не делал «красивые» меню,
ибо в моих программах важнее совместимость с Excel 2003,
а XML можно добавить только в файлы формата Office 2007 (c 4-буквенным расширением)

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

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

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

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

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

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

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

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

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

Спасибо большое, но это вы уже предлагали. Это установки, а не код.
Ничего не помогает. Приведённые вами и в цитируемой книги коды не производят ничего — в лучшем случае — и выдают сплошные сообщения об ошибках (кстати, эти же коды спокойно работают в Excel 2003!).
Я слышал, что просто невозможно написать код для Office 2010. Да, можно сделать свою панель и разместить на ней кнопки, но. только руками. Причём MacroRecoder при этом ничего не записывает! Это — дополнительное доказательство (во всяком случае для меня), что вот эта-та задача, как раз, и нерешаемая — пока не увижу работающего кода. Но его в сети нет.

Этот код создаёт панель инструментов во всех версиях Excel.
Только в Excel 2007 и 2010 эта панель размещается на ленте во вкладке «Надстройки»:
http://excelvba.ru/articles/CommandBar

Скажите, пожалуйста, есть ли код 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, вы не пробовали сначала поискать ответы у меня на сайте?

Код создания панелей инструментов — единый для всех версий Excel,
только панель инструментов оказывается в разных местах:
http://excelvba.ru/articles/CommandBar

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

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

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

Здравствуйте, AVF.
Для просмотра и выбора значков, я использую специальный макрос, формирующий дополнительное выпадающее меню со значками и их кодами:
http://excelvba.ru/code/FaceID

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

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

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

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

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

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

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

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

Вот о Position я и думал, только не знал как с ней справиться))
Еще раз спасибо за код.

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

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

Здравствуйте!
Применил в качестве основы для создания своего меню Ваш код.
Все получилось просто замечательно, спасибо.
Но вот с одним моментом я так и не смог справиться.
Как при запуске поместить панель инструментов рядом с панелью «Стандартная»? Сейчас она располагается просто на рабочем листе.
Смотрел Ваш код, пробовал по всякому, но так и не смог понять, где и как это можно написать в Вашем коде. Подскажите пожалуйста.
Спасибо.

Источник

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

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

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

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

Private Sub Workbook_Open()
    ФормированиеПанелиИнструментов
End Sub
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    GetCommandBar(PROJECT_NAME, True).Visible = False
End Sub

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

' ВНИМАНИЕ! Наличие константы PROJECT_NAME ОБЯЗАТЕЛЬНО!
Public Const PROJECT_NAME = "Addin CommandBar"
 
' список допустимых элементов управления на пользовательской панели инструментов
Public Enum CONTROL_TYPES
    ct_BUTTON = msoControlButton
    ct_TEXTBOX = msoControlEdit
    ct_COMBOBOX = msoControlComboBox
    ct_DROPDOWN = msoControlDropdown
    ct_POPUP = msoControlPopup
End Enum
 
Function Add_Control(ByRef Comm_Bar, ByVal ControlType As CONTROL_TYPES, ByVal B_Face As Integer, _
                     ByVal On_Action As String, ByVal B_Caption As String, _
                     Optional ByVal Button_Style As MsoButtonStyle = msoButtonIcon, _
                     Optional ByVal Begin_Group As Boolean = False, _
                     Optional Tag As String = "") As CommandBarControl
    ' добавляет контролы в меню Comm_Bar, возвращает ссылку на созданный пункт меню
    On Error Resume Next
    Set Add_Control = Comm_Bar.Controls.Add(Type:=ControlType, Temporary:=True)    ' создаём новый контрол
    With Add_Control
        If B_Face > 0 And ControlType = ct_BUTTON Then .FaceId = B_Face    ' назначаем кнопке иконку
        .Tag = Tag: .OnAction = On_Action: .Caption = B_Caption    ' параметры контрола
        .BeginGroup = Begin_Group    ' добавляем разделитель (при необходимости)
        If ControlType = ct_BUTTON Then .Style = Button_Style
    End With
End Function

Function GetCommandBar(ByVal CommandBarName As String, Optional ByVal Clean As Boolean = False, _
                       Optional ByVal Position As MsoBarPosition = msoBarFloating) As CommandBar
    On Error Resume Next: Err.Clear
    ' получаем ссылку на пользовательскую панель инструментов
    Set GetCommandBar = Application.CommandBars(CommandBarName)
    If Err.Number Then    ' если панель не найдена - создаём её
        Set GetCommandBar = Application.CommandBars.Add(CommandBarName, Position, False, True)
    End If
    If Clean Then    ' перебираем на ней все элементы, и удаляем их
        For Each cbc In GetCommandBar.Controls: cbc.Delete: Next
    End If
    GetCommandBar.Visible = True    ' отображаем панель инструментов
End Function
 
 
Sub УдалениеПанелиИнструментов()
    GetCommandBar PROJECT_NAME, True
End Sub
 
Sub ФормированиеПанелиИнструментов()
    On Error Resume Next: Application.ScreenUpdating = False
    ' получаем ссылку на пользовательскую панель инструментов
    Set AddinMenu = GetCommandBar(PROJECT_NAME, True)
 
    ' добавление новых элементов управления на панель
    Add_Control AddinMenu, ct_BUTTON, 271, "CreateBackup", "Create Backup and Save", , True
    Add_Control AddinMenu, ct_BUTTON, 1099, "MainMacro", "Запуск основного макроса", msoButtonIconAndCaption, True
 
    Add_Control(AddinMenu, ct_TEXTBOX, 0, "ComboChanged", "Курс EURO", , True, "EURO").Text = "Курс EURO"
    Add_Control(AddinMenu, ct_TEXTBOX, 0, "ComboChanged", "Курс USD", , False, "USD").Text = "Курс USD"
    Add_Control AddinMenu, ct_BUTTON, 395, "GetRatesFromInternet", "Получить курс с сайта Центробанка", False
 
    Dim combo As CommandBarControl    ' добавляем выпадающий список
    Set combo = Add_Control(AddinMenu, ct_COMBOBOX, 548, "ComboChanged", "Выбор продукции", , True, "ПРОДУКЦИЯ")
    ' добавляем позиции (пункты) в выпадающий список
    For i = 1 To 10: combo.AddItem "Позиция " & i: Next i
    combo.Text = "выберите позицию"    ' текст комбобокса по умолчанию
    combo.Width = 145    ' изменяем ширину выпадающего списка на панели инструментов

    Add_Control AddinMenu, ct_BUTTON, 280, "RenamePhotoes", "Переименование фотографий", , True
 
    Dim popup As CommandBarControl    ' добавляем выпадающее меню
    Set popup = Add_Control(AddinMenu, ct_POPUP, 548, "", "Доп. макросы", , True)
    For i = 1 To 5    ' добавляем пункты в подменю popup
        Add_Control popup, ct_BUTTON, 70 + i, "AdditionalMacros", "Дополнительный макрос " & i, False, , CStr(i)
    Next i
 
    Add_Control AddinMenu, ct_BUTTON, 222, "EditWorkPlan", "Перейти к редактирования техзадания на программу", , True
 
    Add_Control AddinMenu, ct_BUTTON, 1088, "SetIsAddinAsTrue", "Скрыть листы файла программы", , True
    Add_Control AddinMenu, ct_BUTTON, 1087, "SetIsAddinAsFalse", "Отобразить листы файла программы", , False
 
    Add_Control AddinMenu, ct_BUTTON, 548, "ShowFormSettingsPage", "Настройки", , True
 
End Sub

Sub SetIsAddinAsFalse()
    On Error Resume Next: ThisWorkbook.IsAddin = False
End Sub
 
Sub SetIsAddinAsTrue()
    On Error Resume Next: ThisWorkbook.IsAddin = True
End Sub
 
 
Sub CreateBackup()
    ' сохраняет файл надстройки, и создаёт резервную копию файла в специальной папке
    On Error Resume Next
    If Not ThisWorkbook.Saved Then ThisWorkbook.Save  ' сохранение файла
    ' формируем путь к папке для резервных копий программы
    BackupsPath = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, PROJECT_NAME & " Backups")
    ' создаём папку, если она не существует
    MkDir BackupsPath
    ' формируем путь для файла резервной копии
    Filename = PROJECT_NAME & "_BACKUP_" & Format(Now, "DD-MM-YYYY__HH-NN-SS") & ".xls"
    ' создаём копию файла надстройки
    ThisWorkbook.SaveCopyAs BackupsPath & Filename
End Sub

Sub ComboChanged()    ' срабатывает при изменении значения в комбобоксе или текстбоксе
    On Error Resume Next
    НазваниеКомбобокса = Application.CommandBars.ActionControl.Tag
    ТекстКомбобокса = Application.CommandBars.ActionControl.Text
    MsgBox "Новое значение: """ & ТекстКомбобокса & """", _
           vbInformation, "Изменения в полесписке """ & НазваниеКомбобокса & """"
End Sub
Sub AdditionalMacros()    ' срабатывает при нажатии одной из кнопок в подменю
    On Error Resume Next
    НомерМакроса = Application.CommandBars.ActionControl.Tag
    MsgBox "Параметр макроса = """ & НомерМакроса & """", vbInformation, "Запущен макрос из подменю"
End Sub
  • 79459 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Содержание

  1. Общая информация
  2. Лента
  3. Создание пользовательской формы
  4. Элементы управления в панели инструментов
  5. Элементы управления формой
  6. Элементы управления ActiveX
  7. Пример
  8. Переключатели
  9. Поле со списком
  10. Список
  11. Счётчик
  12. Встроенный объект для ввода данных Excel
  13. Как в Excel нарисовать линию
  14. Как в Excel нарисовать стрелку
  15. Изображения
  16. Значки
  17. Трехмерные модели
  18. Рисование
  19. Панель быстрого доступа

Общая информация

Интерфейс Excel 2010 является дальнейшим развитием пользовательского интерфейса, который впервые был использован в выпуске системы Microsoft Office 2007. При создании интерфейса разработчиками была поставлена задача: сделать основные приложения Microsoft Office удобнее в работе. В результате был создан пользовательский интерфейс Microsoft Office Fluent, который упрощает для пользователей работу с приложениями Microsoft Office и дает возможность быстрее получать лучшие результаты.

В предыдущих выпусках приложений Microsoft Office пользователям предоставлялась система меню, панелей инструментов, диалоговых окон. Такой интерфейс работал хорошо, пока в приложениях было ограниченное число команд. Теперь, когда программы выполняют намного больше функций, пользователям становится нелегко работать со старой системой: слишком много программных возможностей, и их трудно найти.

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

Лента

Главный элемент пользовательского интерфейса Microsoft Excel 2010 представляет собой ленту, которая идет вдоль верхней части окна каждого приложения, вместо традиционных меню и панелей инструментов (рис. 1.1).

Рис. 1.1. Лента

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

Заменить ленту панелями инструментов или меню предыдущих версий приложения Microsoft Excel нельзя.

Удалить ленту также нельзя. Однако, чтобы увеличить рабочую область, ленту можно скрыть (свернуть).

  1. Нажмите кнопку Свернуть ленту, расположенную в правой части линии названий вкладок (рис. 1.2).

    Рис. 1.2. Сворачивание ленты

  2. Лента будет скрыта, названия вкладок останутся (рис. 1.3).

    Рис. 1.3. Окно со свернутой лентой

Ленту можно свернуть и иначе.

  1. Щелкните правой кнопкой мыши в любом месте ленты (см. рис. 1.2 ).
  2. В контекстном меню выберите команду Свернуть ленту.

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

Чтобы быстро свернуть ленту, дважды щелкните имя активной вкладки. Для восстановления ленты дважды щелкните вкладку.

Чтобы свернуть или восстановить ленту, можно также нажать комбинацию клавиш Ctrl + F1.

Внешний вид ленты зависит от ширины окна: чем больше ширина, тем подробнее отображаются элементы вкладки. На рисунках приведено отображение ленты вкладки Главная при различной ширине окна.

Рис. 1.4. Отображение ленты вкладки Главная при ширине окна 1024 точки

Рис. 1.5. Отображение ленты вкладки Главная при ширине окна 800 точек

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

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

  • Нажмите вкладку РАЗРАБОТЧИК на ленте.
  • Нажмите Visual Basic. Откроется окно Visual Basic для книги.
  • Нажмите Вставить,
  • Выберите UserForm из выпадающего списка.

Пользовательская форма появляется в правой части окна.

Элементы управления в панели инструментов

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

Excel предоставляет два типа элементов управления – элементы управления формы и элементы управления ActiveX. Вы должны понимать разницу между этими двумя типами элементов управления.

Элементы управления формой

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

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

Элементы управления ActiveX

Элементы управления ActiveX могут использоваться в пользовательских формах VBA. Элементы управления ActiveX имеют широкие свойства, которые можно использовать для настройки их внешнего вида, поведения, шрифтов и других характеристик.

У вас есть следующие элементы управления ActiveX в UserForm ToolBox –

  • Указатель
  • этикетка
  • Текстовое окно
  • Поле со списком
  • ListBox
  • CheckBox
  • OptionButton
  • Рамка
  • Кнопка-переключатель
  • CommandButton
  • TabStrip
  • MultiPage
  • Полоса прокрутки
  • в полях ввода
  • Образ

В дополнение к этим элементам управления Visual Basic предоставляет функцию MsgBox, которую можно использовать для отображения сообщений и / или запроса пользователя о действии.

В следующих нескольких разделах вы поймете эти элементы управления и MsgBox. Затем вы сможете выбрать, какой из этих элементов управления требуется для разработки пользовательской формы.

Пример

Разберем конкретный пример применения сразу нескольких Элементов управления. В файле примера с помощью элементов управления показано как пользователь может отредактировать значения в таблице (диапазон F9:K12 ).

С помощью одного из 3-х элементов управления Поле со списком, Список и Счетчик , пользователь может выбрать столбец таблицы (год) . Нужный элемент управления выбирается с помощью группы Переключателей . Название выбранного элемента подсвечивается серым цветом (см. A8:B8 на рис. выше). Выбранный год выделяется в таблице Условным форматированием темно серым цветом (см. H9 :H12 на рис. выше). Отображение этого выделения регулируется Флажком (фон флажка – красный). Полосами прокрутки можно редактировать Цену и Количество в выбранном году, но только в определенном диапазоне.

Переключатели

На листе использовано 3 Переключателя объединенных в Группу . Каждому Переключателю соответствует определенный элемент управления: Поле со списком, Список, Счетчик .

Для объединения Элементов в группу помещаем на лист Элемент управления Группа (через меню ). В рамках группы создаем 3 переключателя (также через меню ) и связываем их все с одной ячейкой С2 (выделив элемент управления, правой клавишей вызываем контекстное меню, Формат объекта …, вкладка Элемент управления ).

Удерживая клавишу CTRL выделяем 3 переключателя и элемент Группа , вызываем правой клавишей мыши контекстное меню и выбираем . Теперь при выборе одного из трех Переключателей в Группе , в ячейке С2 будет выводиться значение 1, 2 или 3.

Поле со списком

Теперь вставим элемент управления Поле со списком . Вставить элемент можно через меню: . В ячейках столбца М введем несколько значений лет: 2009, 2010, 2011, 2012, 2013. Эти значения будут использованы в элементе Поле со списком .

Создадим Именованный диапазон Список .

  • выделяем диапазон М9:М12
  • нажимаем

Хитрости »

11 Август 2014              95504 просмотров


Как создать свою надстройку?

В этой статье:

  • Что такое надстройка
  • Как создать надстройку
  • Создание собственного меню надстройки для версий Excel 2003
  • Создание собственного меню надстройки для версий 2007 и выше

 
ЧТО ТАКОЕ НАДСТРОЙКА
Для начала разберемся — что такое надстройка и для чего она нужна.

Надстройка

— это файл Excel, имеющий расширение .xla или .xlam(только для 2007 и выше), который по умолчанию открывается как скрытая рабочая книга и может быть подключен к приложению для автоматического запуска вместе с запуском самого приложения. Книга надстройки открывается, но в списке видимых открытых файлов не значится, поэтому нет смысла её там искать. Отобразить такую книгу возможно только кодом.

Есть также и другие виды надстроек — надстройки COM и XLL-надстройки. Но о них я не буду рассказывать, т.к. они разрабатываются не в VBA, а в иных средах программирования

Как правило надстройки используют для распространения программного кода, который будет доступен для любой книги Excel. Т.к. надстройка запускается вместе с приложением — очень удобно хранить в ней коды. Можно создать меню для запуска процедур(об этом ниже) и функции пользователя — созданные в надстройке они доступны в любой открытой книге Excel без ссылок на другую книгу, что несомненно очень удобно. Функции пользователя, прописанные в надстройке для Excel 2007 и выше так же доступны по вводимым начальным символам:
Подбор по имени функции
и после нажатия TAB имя функции будет вставлено в ячейку.
Кроме модулей с кодами надстройки могут содержать и таблицы данных и диаграммы и все, что можно хранить в обычной книге. Но учитывая то, что книга скрыта — особого смысла в этих данных нет, если только не предполагается использовать эти данные в качестве шаблонов для создания определенных отчетов из надстройки. Часто на листах надстроек хранят константы для работы кода, если по каким-либо причинам не хочется использовать константы внутри кода VBA. Данные в ячейках файла надстройки можно изменять во время работы, но я не рекомендую сохранять открытый и исполняемый в данный момент файл надстройки, во избежание конфликтов.

 
КАК СОЗДАТЬ НАДСТРОЙКУ
Создать надстройку просто: из любого файла Excel идете в меню:

  • Excel 2010 и новее: Файл (File)Сохранить как (Save As)-Из выпадающего списка «Тип файла» выбрать Надстройка Excel(.xlam) (Excel Add-In(.xlam)) или Надстройка Excel 97-2003(.xla) (Excel 97-2003 Add-In(.xla)).
  • Excel 2007: Кнопка ОфисСохранить как (Save As)-Из выпадающего списка «Тип файла» выбрать Надстройка Excel(.xlam) (Excel Add-In(.xlam)) или Надстройка Excel 97-2003(.xla) (Excel 97-2003 Add-In(.xla)).
  • Excel 2003: МенюСохранить как-Из выпадающего списка «Тип файла» выбрать «Надстройка Excel(.xla)«.
  • Сохранить как

Однако рекомендую не спешить с сохранением файла как надстройки. Сначала следует весь функционал, закладываемый в надстройку, потестировать, отладить и удостовериться, что все работает как предполагалось. Т.к. после сохранения файла как надстройки и открытия надстройки в Excel — закрыть её можно будет только закрыв Excel полностью(конечно, можно еще воспользоваться кодом вроде Workbooks("MyAddin.xla").Close, но это не очень удобно в разработке).
Если все же сохранили файл как надстройку, но хотите что-то изменить в книге(удалить лишние листы, изменить информацию на листах(часто так делается для хранения настроек) и т.п.) — то надо в редакторе VBA найти проект надстройки, перейти в свойства модуля ЭтаКнига(или ThisWorkbook) и выставить IsAddin = False. Книга отобразиться. Далее надо будет вернуть свойство IsAddin в True и сохранить проект
Так же следует заранее выбрать формат надстройки — для версий Excel 97-2003(.xla) и или только от 2007(.xlam) и выше. Надстройки .xla работают во всех версиях Excel, в том числе и в 2007 и выше. Это, пожалуй, единственное их преимущество перед форматом .xlam. Т.к. при этом все меню, которые будут созданы для вызова кодов, в версиях от 2007 и выше будут располагаться на вкладке «Надстройки» и будут иметь минимум настроек: нет возможности изменить размер значка; разбить на группы; сделать красивые подсказки; расположить в два ряда и т.п.
Для формата .xlam доступен более широкий ассортимент: они могут так же создать меню на вкладке «Надстройки», а могут и создавать собственные вкладки(через XML-схемы), команды на которых можно расположить в соответствии со всеми красивостями и достоинствами оформления, которое можно наблюдать в Ribbon-панелях Excel 2007 и выше.
Дальше я как раз более подробно расскажу про оба метода создания меню.

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

'---------------------------------------------------------------------------------------
' Procedure : Test
' DateTime  : 11.08.2014 12:08
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Записываем в активную ячейку число 10
'             красим в красный цвет заливку
'             устанавливаем границы
'---------------------------------------------------------------------------------------
Sub Test()
    With ActiveCell
        .Value = 10
        .Interior.Color = vbRed
        .Borders.Color = vbBlack
    End With
End Sub

Важно: Код помещается в стандартный модуль книги, из которой хотите сделать надстройку.

 
СОЗДАНИЕ СОБСТВЕННОГО МЕНЮ НАДСТРОЙКИ ДЛЯ ВЕРСИЙ EXCEL 2003

Примерный вид данного меню в Excel 2003:
Панель в Excel 2003
Примерный вид меню в Excel 2007 и выше:
Меню в Excel 2007 и выше

Собственно, меню, совместимое со всеми версиями Excel делается исключительно на уровне VBA следующим кодом:

'---------------------------------------------------------------------------------------
' Module    : ЭтаКнига
' DateTime  : 11.08.2014 12:13
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : 
'---------------------------------------------------------------------------------------
Option Explicit
'константа уровня модуля - имя меню
'Обязательно задать, чтобы можно было идентифицировать
Const sMenuBarName As String = "Test Addin www.Excel-VBA.ru"
 
'---------------------------------------------------------------------------------------
' Procedure : Workbook_BeforeClose
' Purpose   : Процедура выполняется перед закрытием книги
'             удаляем созданное меню после закрытия надстройки
'---------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next ' обработчик ошибки нужен, если меню такого нет
    'удаляем меню, для исключения дублирования меню при повторном запуске
    Application.CommandBars(sMenuBarName).Delete
End Sub
 
'---------------------------------------------------------------------------------------
' Procedure : Workbook_Open
' DateTime  : 11.08.2014 12:39
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Процедура создания меню
'             как отдельная панель для 2003
'             на вкладке "Надстройки" для 2007 и выше
'---------------------------------------------------------------------------------------
Private Sub Workbook_Open()
    On Error Resume Next ' обработчик ошибки нужен, если меню такого нет
    'удаляем меню, для исключения дублирования меню при повторном запуске
    Application.CommandBars(sMenuBarName).Delete
    On Error GoTo 0
    'добавляем меню
    With Application.CommandBars.Add(sMenuBarName, temporary:=True)
        'добавляем новую кнопку
        With .Controls.Add(Type:=1) 'добавляем обычную кнопку на панель
            'отображаемый текст кнопки
            .Caption = "ИЗМЕНИТЬ СВОЙСТВА АКТИВНОЙ ЯЧЕЙКИ"
            'стиль кнопки
            'доступные стили:
            '1 - только значок(16x16)
            '2 - только текст
            '3 - картинка и текст
            .Style = 3
            'назначаем картинку из набора офиса
            'посмотреть доступные можно: http://www.excel-vba.ru/general/moi-nadstrojki/panel-ikonok-faceid/
            .FaceId = 2
            'имя процедуры, которая будет выполнена при нажатии кнопки
            .OnAction = "Test"
        End With
        'делаем меню видимым
        .Visible = True
    End With
End Sub

Основные моменты я постарался расписать в комментариях, но на некоторых все же хочу заострить внимание.

  • Свойство Type
    .Controls.Add(Type:=1)
    Наверное, самое важное свойство. Оно отвечает за тип элемента меню. Доступно всего пять типов:

    • 1Button(обычная кнопка)
    • 2TextBox(текстовое поле с возможностью записи в него значений и считывания значений из него)
    • 3List(выпадающий список с заранее заданным списком значений)
    • 4ComboBox(выпадающий список с возможностью записи в поле произвольного значения)
    • 10PopupMenu(выпадающее меню с возможностью добавления новых элементов)
  • Иногда возникает вопрос: как сделать на такой панели ToggleButton? Т.е. кнопку, которая при нажатии остается в нажатом состоянии, а при повторном нажатии — в отжатом(т.е. в обычном). В данном случае это возможно исключительно через «финты» вызываемой по нажатию кнопки процедуры:

    Sub Add_CmBar()
        With Application.CommandBars.Add("Test ToggleButton", temporary:=True)
            With .Controls.Add(Type:=1)
                .Caption = "ToggleButton"
                .Style = 2
                .OnAction = "Emulate_Toggle"
            End With
            .Visible = True
        End With
    End Sub
    'процедура, которая выполняется при нажатии кнопки "ToggleButton". Меняет видимое состояние кнопки.
    Sub Emulate_Toggle()
        Dim bt As CommandBarButton
        Set bt = Application.CommandBars.ActionControl
        'проверяем текущее состояние кнопки. 
        'если нажата - отжимаем, если отжата - нажимаем
        If bt.State = msoButtonDown Then
            bt.State = msoButtonUp
        Else
            bt.State = msoButtonDown
        End If
    End Sub

    Еще одна проблема при разработке таких панелей: невозможность явно указать кнопку в стиле Caption(т.е. неактивную к нажатию кнопку). Это тоже можно сделать при помощи обычной Button, только в свойствах кнопки надо свойство Enabled установить в False:
    .Enabled = False
    при этом обязательно необходимо указать Style 2 и назначить Caption.

  • Свойство Style
    .Style = 3
    данное свойство управляет видом кнопки. Доступные стили:

    • 1 — только значок(16×16). Необходимо указывать свойство FaceID
    • 2 — только текст. Свойство FaceId может быть указано, но никак не влияет на внешний вид кнопки
    • 3 — картинка и текст. Обязательно указывать хотя бы одно из свойств: Caption или FaceID

    Если хотите отобразить просто значок или значок вместе с текстом — то столкнетесь с проблемой выбора значка. Поэтому я давно создал надстройку, которая позволяет просмотреть все ID всех доступных значков офиса: Панель иконок FaceID.
    Так же можно и свои значки создавать, однако я не буду здесь затрагивать эту тему, т.к. получится запутанно и обширно. Если кратко: необходимо создать свой значок размером 16×16, с расширением .gif. Затем создать копию иконки и предполагаемые непрозрачные области закрасить черным, а прозрачные — белым. Эту копию необходимо задать для свойства .Mask

  • Свойство OnAction:
    .OnAction = «Test»
    Данная строка отвечает за назначение процедуры, которая будет выполнена после нажатия на кнопку(в случае с ComboBox и TextBox — изменение значения. Вызван код будет после выхода из режима редактирования элемента). Test — это имя процедуры. Её я привел выше и именно она будет выполнена при нажатии на эту кнопку.

Положение CommandBar на панели
Так же у объекта CommandBar есть такие свойства как .Left(положение относительно левого края окна Excel) и .Top(положение относительно верхнего края окна Excel), которые задают положение строки меню на панели. Но они мало актуальны для версий 2007 и выше, т.к. там для таких панелей отведена отдельная вкладка и все они помещаются на ней в том порядке, в котором были на неё добавлены. По умолчанию, если данные свойства не заданы — в 2003 Excel панель создается плавающая и пользователь может переместить её в любое удобное для него место. Если же они указаны, то панель будет расположена в заданных координатах относительно окна Excel.

Во вложении ниже пример надстройки с открытым кодом. Но в примере код расширен — там я привел коды с использованием всех типов элементов: и кнопки, и эмуляция ToggleButton, и списки, и текстбокс и выпадающее меню с доп.кнопками. В кодах есть комментарии, поэтому при желании разобраться не составит труда.


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

  1. надо указывать конкретное имя меню, в которое добавляем некую кнопку. Для контекстного меню ячеек это «Cell»:
    Application.CommandBars(«Cell»)
  2. лучше указывать положение элемента относительно уже существующих в меню. Делает это при помощи указания параметров before или after:
    Application.CommandBars(«Cell»).Controls.Add(Type:=1, before:=4)

При этом добавить можно как собственные кнопки, так и уже существующие. Для примера добавим одной кнопкой дубль нашей команды с лены «ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ», а второй — вставку в ячейку только значений(встроенная команда — подробнее в статье: Как удалить в ячейке формулу, оставив значения?):

    '=========================================================
    '
    '  ДОБАВЛЯЕМ СВОЙ ПУНКТ В МЕНЮ ПРАВОЙ КНОПКИ МЫШИ
    '
    With Application.CommandBars("Cell")
        'дублируем кнопку "ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ" с панели
        'добавляем перед 4-м элементом
        With .Controls.Add(Type:=1, before:=4)
            .Caption = "ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ"
            .Style = 3
            .FaceId = 2
            .OnAction = "Test"
        End With
        'добавляем кнопку встроенной в Excel команды "Вставить значения"
        'ищем команду "Вставить значения" по её ID в контекстном меню
        Set cbb = .FindControl(ID:=370)
        'удаляем команду из меню, если она была уже добавлена ранее
        If Not cbb Is Nothing Then
            cbb.Delete
        End If
        'добавляем перед 5-м элементом(после наше собственной команды)
        .Controls.Add ID:=370, before:=5
    End With

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

  Надстройка для Excel 97-2003 и выше.zip (22,6 KiB, 3 080 скачиваний)


 
СОЗДАНИЕ СОБСТВЕННОГО МЕНЮ НАДСТРОЙКИ ДЛЯ ВЕРСИЙ EXCEL 2007
Как я уже писал — для Excel 2007 и выше подходит описанный выше метод создания собственного меню для ранних версий. Однако меню в данном случае помещается исключительно на вкладку «Надстройки» и имеет довольно убогий вид (как можно лицезреть выше) в сравнении с общим Ribbon-интерфейсом других панелей. Чтобы посмотреть как это выглядит можете просто скачать файл выше и запустить его. Появится вкладка «Надстройки» с одной кнопкой.

Однако учитывая появившуюся в 2007 версии офиса возможность кастомизировать ленту Ribbon через язык XML, гораздо практичнее(особенно для разработчиков) создавать собственную панель с отдельным именем, на которой можно разместить красиво команды, добавить свои собственные значки для команд без особых усилий.

Примерно так можно все это оформить:
Меню в Excel 2007 через XML

Чтобы добавить свою панель необходимо изменить XML-схему для надстройки, которая присутствует в любом файле формата 2007. Есть несколько методов(я опишу лишь два).

Первый метод

, он же совсем неудобный и требует навыков работы с XML

  1. Изменить расширение файла с .xlam на .rar или .zip и открыть любым архиватором.
    Если не отображается расширение:
    Панель управленияСвойства папки(для Win 7 — Параметры папок)- вкладка Вид— Снять галочку с «Скрывать расширение для зарегистрированных типов файлов»
  2. Добавить в архив папку «customUI», папку «_rels» и папку «images»
  3. Создать файл «customUI.xml», который лично я бы назвал основным — в нем необходимо впоследствии прописать все панели и команды по законам языка XML. После чего данный файл необходимо поместить в папку «customUI»
  4. В папке «images» будут храниться все значки, которые будут расположены на панели
  5. Папка «_rels» должна внутри содержать файл «customUI.xml.rels», в котором перечисляются связи картинок с командами и панелями. Проще говоря — схема взаимосвязей ресурсов

Но все это очень муторно и необходимо знать язык XML. Уверен, большая часть читающих статью уже 100500 раз нахмурили брови и пару раз перечитали, надеясь понять о чем речь. Поэтому не будем дальше разбирать этот метод и перейдем к следующему.

 
Второй метод куда практичнее — использовать специальные программы для работы с Ribbon итерфейсом. Такие как Office Ribbon Editor, RibbonXMLEditor, OpenXML package editor и им подобные. Я сам использую для этих целей надстройку Максима Новикова — RibbonXMLEditor, последнюю версию которой можно скачать по адресу: http://novikovmaxim.narod.ru/index.htm?http://novikovmaxim.narod.ru/products/ribbon/ribbon.htm. На том же сайте можно найти примеры работы с Ribbon-панелью офиса и более подробно почитать про создание своих панелей. Я бы даже рекомендовал это сделать, если планируете создавать подобные файлы. Сама же программа RibbonXMLEditor бесплатна и не требует установки. Но функционал весьма достойный, а использование достаточно простое. Я не буду заострять внимание на всех нюансах работы с ней — все это можно найти на сайте её создателя(что я лично категорично рекомендую). Опишу лишь основное, что может потребоваться.
Для начала работы и создания своего меню необходимо открыть программу RibbonXMLEditor и выбрать в ней файл, в который хотите внедрить меню. Это должен быть файл формата .xlsm,.xlam или .xlsb. Т.к. мы создаем надстройку — наш формат .xlam.
На рисунке отмечены цифрами шаги, расписанные ниже:
RXE
1. Добавляете ribbon (нажатием кнопки на элементе)
2. Далее tabs и tab(так же автоматом добавится элемент groupe) — выделяете строку и внутрь кавычек для id вписываете groupe_1, а для label вписываете имя вкладки — Свойства ячейки.
3. Уже после этого внутрь groupe добавляете button и задаете ей id — change_cell. Должен получится такой код:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

Id каждого элемента должно быть уникальным и предпочтительнее указывать его исключительно на латинице(англ.алфавит), т.к. кириллица распознается с трудом и есть шанс получить ошибку.
Теперь продолжаем добавлять свойства для button:
4. для начала подгружаем картинку через соответствующую кнопку.
5. После этого она будет в выпадающем списке правее.
6. Ставим курсор после «change_cell» и нажимаем кнопку вставки тега изображения. Вставляется тег и название. Теперь у нашей кнопки есть картинка.
7. При помощи выпадающего меню параметров выбираем label и вставляем данный тег кнопкой, расположенной правее выпадающего списка. Курсор автоматически будет помещен внутрь кавычек. Вписываем текст — Изменить свойства ячейки.
8. При помощи выпадающего списка функций обратного вызова выбираем onAction и так же вставляем. Вписываем туда имя вызываемой процедуры — CallTest.
В результате должно получиться:

<?xml version="1.0" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

Для отладки схемы через RibbonXMLEditor можно использовать кнопку отладки(зеленый треугольник) или сочетание клавиш F9. Для проверки корректности схемы — зеленая галочка. Жмем на неё и если в схеме будут ошибки — они сразу будут найдены и показаны в сообщении, с указанием номера строки и столбца, в которых ошибка.

На этом, казалось бы, все. Но нет. Просто так, сама по себе XML-схема не вызовет процедуру — необходимо создать функции обратного вызова. Вот здесь у RibbonXMLEditor есть еще одна отличная функция — генерация модуля обратных вызовов — 9. Нажимаем на кнопку — получаем готовые функции. Как правило верхние две строки не нужны — нам нужны лишь сами функции:

Sub CallTest(control As IRibbonControl)
 
End Sub

Копируем. Сохраняем схему нажатием дискеты в RibbonXMLEditor и закрываем программу.
Теперь открываем наш файл и вставляем скопированный текст функции. В эту функцию прописываем вызов нашей, уже созданной ранее процедуры: Test

Sub CallTest(control As IRibbonControl)
    Call Test
End Sub

В принципе, можно и прямо в эту процедуру прописать все действия из процедуры Test.
Сохраняем.
Открываем наш файл — видим, что новая вкладка «Test excel-vba.ru» появилась, кнопка на ней есть. По нажатии на кнопку выделенная ячейка окрашивается в красный цвет, в ней прописывается значение 10 и создаются границы.

 
Так же можно вставлять на свою вкладку встроенные команды. Для этого в button используется не id, а idMso. Эти команды не нуждаются в обработке обратных вызовов, т.к. при их использовании происходит вызов встроенных функций — кнопки как бы просто дублируются на нашу вкладку со всеми их возможностями. Например, чтобы добавить на свою вкладку стандартную кнопку перехода в VisualBasic надо добавить кнопку с idMso VisualBasic:

<button idMso="VisualBasic" />

Сам код при этом будет выглядеть так:

<?xml version="1.0" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
                                        <button idMso="VisualBasic" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

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


Так же как и в случае с надстройками для 2003 Excel, здесь можно создавать кнопки в контекстном меню(правая кнопка мыши), но и тут не обошлось без нюансов:

  1. изменение данного меню доступно только начиная с версии Excel 2010. Для 2007 версии придется использовать старые методы — те же, что и для 2003(т.е. внедрение отдельного кода на Workbook_Open надстройки, как в примере выше для надстройки 2003)
  2. в надстройке Ribbon XML Editor я не нашел встроенного инструмента для вставки кодов обработки меню правой кнопкой мыши. Похожий по «звучанию» contextualTabs не совсем то, что нужно(а если быть точнее — совсем не то). contextualTabs — это динамические вкладки, которые появляются после основных вкладок при работе с определенными объектами. Например, с умными таблицами. Когда выделяем умную таблицу или любую ячейку в ней, то появляется группа динамических вкладок «Работа с таблицами». Вот в неё и вносятся изменения при помощи contextualTabs

Поэтому прописывать «добавки» в меню по правой кнопке мыши придется самостоятельно. Код вставки уже имеющегося у нас кода приведен ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
	<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
                                        <button idMso="VisualBasic" />
				</group>
			</tab>
		</tabs>
	</ribbon>
 
	<contextMenus>
		<contextMenu idMso="ContextMenuCell">
			<button id="change_cell_context" 
					image="table_edit" 
					label="Изменить свойства ячейки" 
					onAction="CallTest" 
					insertBeforeMso="Cut" />
		</contextMenu>
	</contextMenus>
</customUI>

добавлять его надо исключительно на вкладке 2010, 2013(customUI14.xml) внизу редактора Ribbon XML Editor. Обращаю внимание, что код создания собственной вкладки на панели дублируется: он должен присутствовать и в 2007(customUI.xml) и в 2010, 2013(customUI14.xml). Это необходимо сделать, чтобы в 2007 Excel была только вкладка, а начиная с 2010 — еще и контекстное меню(схемы customUI.xml и customUI14.xml обрабатываются отдельно друг от друга в зависимости от того, в какой версии открыт файл). При этом в 2007 это никаких ошибок не вызовет.
Остальные правила для создания элементов меню точно такие же, как и для вкладок: можно добавлять как собственные команды, так и встроенные(при помощи idMso).
Я сам предпочитаю контекстное меню дополнять исключительно кодом VBA, т.к. для 2007 его в любом случае придется писать.

Скачать пример надстройки для 2007 Excel

  Надстройка для Excel 2007 и выше.zip (14,6 KiB, 3 401 скачиваний)

В примере я не стал делать много кнопок и их обработку — слишком уж много различных элементов там доступны и для раскрытия всего функционала этой статьи не хватит. Да и в интернете уже полно статей с разбором работы с XML-интерфейсом новых версий Excel. Основной упор сделан на создание основной вкладки и контекстного меню, т.к. техника создания контекстного меню уж очень не очевидна из надстройка Ribbon XML Editor.

Осталось дело за малым — научиться эти надстройки подключать. Но об этом я уже писал в статье Подключение/отключение надстроек


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

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


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



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

Visual Basic for Applications


Рекомендация: подборка платных и бесплатных курсов создания сайтов — https://katalog-kursov.ru/

Если перед вам стоит задача по автоматизации чего нибудь в excel, то забудьте про макросы, расположенные непосредственно в книге, создавайте панель инструментов (ribbon), которая

  1. не зависит от конкретного файла
  2. располагается в основной панели инструментов
  3. дает кастомизируемый UI

image

Для того что бы создать такую панель вам потребуется

1) файл excel с расширением xlam, расположенный в %userprofile%appdataroamingmicrosoftaddins

2) редактор xml ресурса (для разметки кнопок)

image

3) определить кнопки по примеру

button id="b_MemberSelect" label="Member Select"    onAction="p_MemberSelect" imageMso="ReturnToTaskList"  size="large" 

где p_MemberSelect это процедура VBA

4) в иницилазации процедуры (в файле xlam) нужно передавать предопределенные параметры
Sub p_MemberSelect(ByVal vIRibbonControl As IRibbonControl)

Но у данного решения есть одно ограничение — нет возможности создавать формы, встроенные в панели Excel, например:

image

Этот пример из проекта In2Sql (плагин для Excel, который визуализирует объекты SQL). В этом плагине код создан с помощью c# и библиотек VSTO.

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