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

Хитрости »

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


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

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

  • Что такое надстройка
  • Как создать надстройку
  • Создание собственного меню надстройки для версий 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 402 скачиваний)

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

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


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

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


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



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

Содержание

  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
Кроме того, не помешает последней строкой кода включить обновление экрана.
В итоге код функции будет выглядеть так:

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

Источник

Содержание

  • Пошагово: выбор шаблона Excel для меню
  • Как создать собственное меню
  • Шаблоны Excel обеспечивают быстрый дизайн меню
  • FAQs

Эти советы помогут

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

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

  1. Для этого после запуска Excel введите «Меню» или «Меню» в поле поиска с надписью «Поиск онлайн-шаблонов» и щелкните значок увеличительного стекла.

  2. Теперь Excel ищет в Интернете тысячи шаблонов и выводит соответствующие результаты в качестве предварительного просмотра.

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

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

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

Как создать собственное меню

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

  1. Лучше всего начать с фона. Для этой цели Excel предлагает мощную функцию Excel в разделе «Макет страницы> Фон».

  2. Установите шрифты и предопределенные цвета шрифтов через «Макет страницы> Дизайн», чтобы создать свое меню.

  3. Введите блюдо — по желанию с описанием гарниров — и цену в пустые строки.

  4. Включите заголовки столбцов и используйте условное форматирование для внесения дальнейших изменений.

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

  6. Вы можете выбрать собственные изображения и рисунки со своего компьютера в качестве фона для меню в таблице на вкладке «Вставка> Иллюстрации> Изображения или изображения в Интернете» или бесплатно загрузить их из Интернета.

  7. Сохраните карту как шаблон Excel, нажав «Сохранить как». Здесь вы можете выбрать «Шаблон Excel (* .xltx)».

  8. Когда вы закончите работу с меню, перейдите к «Печатать активные листы» или «Печатать всю книгу» через «Файл> Печать».

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

Обратите внимание на метки при разработке шаблона Excel для меню.

Будь то объявление или в Интернете — меню — это что-то вроде визитной карточки ресторана, и поэтому его следует тщательно готовить. Сегодня критически настроенные потребители уделяют больше внимания здоровому питанию. Многие люди не любят определенные ингредиенты или даже имеют на них аллергическую реакцию. Только по этой причине следует наливать своим гостям «чистое вино». Вы также обязаны это сделать по закону. Не всегда удается избежать консервирования пищевых ингредиентов с использованием консервантов. Вы должны указать это в меню для соответствующего блюда или напитка. То же самое относится и к другим добавкам, таким как кофеин, хинин, красители, антиоксиданты и другие вещества. DEHOGA опубликовала буклет с добавками, подлежащими маркировке. Вы можете использовать числа для маркировки и перечислить соответствующие добавки в виде сноски меньшим шрифтом внизу карточки.

Сначала введите блюда, которые вы предлагаете.

Напишите число после блюд, которые хотите идентифицировать.

Выберите число, надстрочный индекс которого вы хотите добавить, и щелкните стрелку в правом нижнем углу на вкладке «Главная».

Откроется окно форматирования ячеек. Установите флажок «Надстрочный индекс».

Перейдите через «Вставить> Текст в верхнем и нижнем колонтитулах». Затем Excel отобразит рабочий лист в режиме «Макет страницы».

Вставьте туда верхний индекс и введите соответствующий идентификатор в нижнем колонтитуле.

Если блюдо содержит несколько веществ, идентифицируйте блюда, поместив числа в закрытых скобках в маленький надстрочный индекс после записи. Выглядит это примерно так: Блюдо XY 1) 2) 12) 14).

Персонализация и форматирование дизайнов

Меню должно быть составлено таким образом, чтобы его нельзя было спутать ни с чем. Поэтому имеет смысл персонализировать шаблоны Excel для меню и отформатировать дизайн. Например, вы можете использовать «Вставить> Иллюстрации» для интеграции логотипа вашей компании и использовать специальные шрифты и цвета шрифтов для разработки своего меню. Сделайте свое меню частью корпоративного дизайна вашей компании. В результате компании создают высокую ценность для своих гостей.

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

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

  1. Групповые закуски, основные блюда, десерты и напитки вместе.
  2. Если вы предлагаете маленькие блюда или блюда для детей, они также должны отображаться в группе, например, «… для небольшого голода между ними» или «для наших маленьких гостей» должны быть выделены в отдельную категорию.
  3. Вторые блюда всегда следует группировать по типу пищи, то есть мясные, рыбные, блюда из птицы и веганские блюда.
  4. Создайте отдельный раздел для супов и салатов.
  5. Когда дело доходит до наименования отдельных блюд, ваше воображение, конечно же, безгранично. Вам следует ориентироваться на свои целевые группы. Креативные блюда могут иметь оригинальные названия.
  6. Если у вас большой выбор, нумеруйте разные блюда.
  7. Информация о цене на блюдо всегда должна отображаться тем же шрифтом и размером шрифта, что и само название, чтобы обеспечить максимально возможную прозрачность в вашем меню.

Шаблоны Excel обеспечивают быстрый дизайн меню

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

FAQs

Как я могу вставить обложку в свое меню?

Мы рекомендуем использовать разные листы в одной книге для создания титульного листа. Выберите «Вставить> Объект> Документ Microsoft Word» и подтвердите, нажав «ОК». Теперь вы можете создать свой титульный лист.

Должен ли я указывать источники шаблонов Excel, используемых для меню?

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

Какой формат DIN должен иметь меню?

Формат, конечно, зависит от вас. Однако для наглядности мы рекомендуем использовать формат A4.

Вы поможете развитию сайта, поделившись страницей с друзьями

Время на прочтение
1 мин

Количество просмотров 9.7K

Если перед вам стоит задача по автоматизации чего-нибудь в 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.

Даже если вы не умеете программировать, то существует множество мест (книги, сайты, форумы), где можно найти готовый код макросов на VBA для огромного количества типовых задач в Excel. По моему опыту, большинство пользователей рано или поздно собирают свою личную коллекцию макросов для автоматизации рутинных процессов, будь то перевод формул в значения, вывод суммы прописью или суммирования ячеек по цвету. И тут встает проблема — код макросов на Visual Basic нужно где-то хранить, чтобы потом использовать в работе.

Самый простой вариант — сохранять код макросов прямо в рабочем файле, зайдя в редактор Visual Basic с помощью сочетания клавиш Alt+F11 и добавив новый пустой модуль через меню Insert — Module:

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

При таком способе возникает, однако, несколько неудобств:

  • Если рабочих файлов много, а макрос нужен везде, как например макрос преобразования формул в значения, то и копировать код придется в каждую книгу.
  • Нужно не забыть сохранить файл в формате с поддержкой макросов (xlsm) или в формате двоичной книги (xlsb).
  • При открытии такого файла защита от макросов будет каждый раз выдавать предупреждение, которое нужно подтвердить (ну, или отключить защиту полностью, что может быть не всегда желательно).

Более изящным решением будет создание своей собственной надстройки (Excel Add-in) — отдельного файла особого формата (xlam), содержащего все ваши «любимые» макросы. Плюсы такого подхода:

  • Достаточно будет один раз подключить надстройку в Excel — и можно будет использовать её VBA процедуры и функции в любом файле на этом компьютере. Пересохранять ваши рабочие файлы в xlsm- и xlsb-форматы, таким образом, не потребуется, т.к. исходный код будет храниться не в них, а в файле надстройки.
  • Защита от макросов вас тоже беспокоить уже не будет, т.к. надстройки по определению входят в доверенные источники.
  • Можно сделать отдельную вкладку на ленте Excel с красивыми кнопками для запуска макросов надстройки.
  • Надстройка — это отдельный файл. Его легко переносить с компьютера на компьютер, делиться им с коллегами или даже продавать ;)

Давайте рассмотрим весь процесс создания своей собственной надстройки для Microsoft Excel по шагам.

Шаг 1. Создаем файл надстройки

Открываем Microsoft Excel с пустой книгой и сохраняем ее под любым подходящим именем (например MyExcelAddin) в формате надстройки с помощью команды Файл — Сохранить как или клавиши F12, указав тип файла Надстройка Excel (Excel Add-in):

Сохраняем файл в формате надстройки

Обратите внимание, что стандартно Excel хранит надстройки в папке C:UsersВаше_имяAppDataRoamingMicrosoftAddIns, но, в приниципе, можно указать любую другую удобную вам папку.

Шаг 2. Подключаем созданную надстройку

Теперь созданную нами на прошлом шаге надстройку MyExcelAddin надо подключить к Excel. Для этого идем в меню Файл — Параметры — Надстройки (File — Options — Add-Ins), жмем на кнопку Перейти (Go) в нижней части окна. В открывшемся окне жмем кнопку Обзор (Browse) и указываем положение нашего файла надстройки.

Если вы все сделали правильно, то наша MyExcelAddin должна появиться в списке доступных надстроек:

Список надстроек

Шаг 3. Добавляем в надстройку макросы

Наша надстройка подключена к Excel и успешно работает, но в ней нет пока ни одного макроса. Давайте её наполним. Для этого нужно открыть редактор Visual Basic сочетанием клавиш Alt+F11 или кнопкой Visual Basic на вкладке Разработчик (Developer). Если вкладки Разработчик не видно, то её можно отобразить через Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon).

В левом верхнем углу редактора должно быть окно Project (если его не видно, то включите его через меню View — Project Explorer):

Project Explorer

В этом окне отображаются все открытые книги и запущенные надстройки Microsoft Excel, в том числе и наша VBAProject (MyExcelAddin.xlam) Выделите её мышью и добавьте в неё новый модуль через меню Insert — Module. В этом модуле мы и будем хранить VBA-код наших макросов надстройки.

Код можно либо набрать «с нуля» (если вы умеете программировать), либо скопировать откуда-нибудь уже готовый (что гораздо проще). Давайте, для пробы, введем в добавленный пустой модуль код простого, но полезного макроса:

Код макроса

После набора кода не забудьте нажать на кнопку сохранения (дискетку) в левом верхнем углу.

Наш макрос FormulasToValues, как легко сообразить, преобразует формулы в значения в выделенном предварительно диапазоне. Иногда такие макросы называют еще процедурами. Чтобы его запустить, нужно выделить ячейки с формулами и открыть специальное диалоговое окно Макросы с вкладки Разработчик (Developer — Macros) или сочетанием клавиш Alt+F8. Обычно в этом окне отображаются доступные макросы из всех открытых книг, но макросы надстроек здесь не видны. Несмотря на это, мы можем ввести имя нашей процедуры в поле Имя макроса (Macro name), а затем нажать кнопку Выполнить (Run) — и наш макрос заработает:

Здесь же можно назначить сочетание клавиш для быстрого запуска макроса — за это отвечает кнопка Параметры (Options) в предыдущем окне Макрос:

Назначаем сочетание клавиш макросу

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

Для удобства можно добавить и кнопку для нашего макроса на панель быстрого доступа в левом верхнем углу окна. Для этого выберите Файл — Параметры — Панель быстрого доступа (File — Options — Customize Quick Access Toolbar), а затем в выпадающем списке в верхней части окна опцию Макросы. После этого наш макрос FormulasToValues можно поместить на панель кнопкой Добавить (Add) и выбрать для него значок кнопкой Изменить (Edit):

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

Шаг 4. Добавляем в надстройку функции

Кроме макросов-процедур, существуют еще и макросы-функции или как их еще называют UDF (User Defined Function = пользовательская функция). Давайте создадим в нашей надстройке отдельный модуль (команда меню Insert — Module) и вставим туда код такой функции:

Пользовательская функция

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

Заметьте, что синтаксис функции отличается от процедуры:

  • используется конструкция Function …. End Function вместо Sub … End Sub
  • после названия функции в скобках указываются её аргументы
  • в теле функции производятся необходимые вычисления и затем результат присваивается переменной с названием функции

Также обратите внимание, что эту функцию не нужно, да и невозможно запустить как предыдущий макрос-процедуру через диалоговое окно Макросы и кнопку Выполнить. Такую макрофункцию нужно использовать как стандартную функцию листа (СУММ, ЕСЛИ, ВПР…), т.е. просто ввести в любую ячейку, указав в качестве аргумента значение суммы с НДС:

Используем созданную UDF

… или ввести через стандартное диалоговое окно вставки функции (кнопка fx в строке формул), выбрав категорию Определенные пользователем (User Defined):

Выбираем пользовательскую функцию

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

  1. Откройте редактор Visual Basic сочетанием клавиш Alt+F11
  2. Выделите надстройку в панели Project и нажмите клавишу F2, чтобы открыть окно Object Browser
  3. Выберите в верхней части окна в выпадающем списке свой проект надстройки
  4. Щелкните по появившейся функции правой кнопкой мыши и выберите команду Properties.
  5. Введите описание функции в окно Description
  6. Сохраните файл надстройки и перезапустите Excel.

Добавляем свое описание для UDF

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

Описание функции

Шаг 5. Создаем вкладку надстройки в интерфейсе

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

Информация об отображаемых вкладках по умолчанию содержится внутри книги и должна быть оформлена в виде специального XML-кода. Проще всего писать и редактировать такой код с помощью специальных программ — XML-редакторов. Одна из самых удобных (и бесплатных) — это программа Максима Новикова Ribbon XML Editor.

Алгоритм работы с ней следующий:

  1. Закройте все окна Excel, чтобы не было конфликта файлов, когда мы будем редактировать XML-код надстройки.
  2. Запустите программу Ribbon XML Editor и откройте в ней наш файл MyExcelAddin.xlam
  3. При помощи кнопки tabs в левом верхнем углу добавьте заготовку кода для новой вкладки:

    Добавляем новую вкладку для надстройки

  4. В пустые кавычки нужно вписать id нашей вкладки и группы (любые уникальные идентификаторы), а в label — названия нашей вкладки и группы кнопок на ней:

    Добавляем id и названия

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

    Добавляем кнопку

    — label — это текст на кнопке
    — imageMso — это условное название изображения на кнопке. Я использовал иконку с красной кнопкой, которая имеет название AnimationCustomAddExitDialog. Названия всех доступных кнопок (а их несколько сотен!) можно найти на большом количестве сайтов в интернете, если искать по ключевым словам «imageMso». Для начала можно сходить сюда.
    onAction — это имя процедуры обратного вызова — специального короткого макроса, который будет запускать наш основной макрос FormulasToValues. Назвать эту процедуру можно как угодно. Мы добавим её чуть позже.

  6. Проверить правильность всего сделанного можно с помощью кнопки с зеленой галочкой сверху на панели инструментов. Там же рядом нажмите на кнопку с дискетой для сохранения всех изменений.
  7. Закрываем Ribbon XML Editor
  8. Открываем Excel, заходим в редактор Visual Basic и добавляем к нашему макросу процедуру обратного вызова KillFormulas, чтобы она запускала наш основной макрос замены формул на значения.

    Добавляем процедуру обратного вызова

  9. Сохраняем внесенные изменения и, вернувшись в Excel проверяем результат:

    Созданная вкладка для надстройки

Вот и всё — надстройка готова к использованию. Наполните её своими процедурами и функциями, добавьте красивые кнопки — и использовать макросы в работе станет намного проще.

Ссылки по теме

  • Что такое макросы, как их использовать в работе, где взять код макросов на Visual Basic.
  • Как сделать заставку при открытии книги в Excel
  • Что такое Личная Книга Макросов и как её использовать

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