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

Даже если вы не умеете программировать, то существует множество мест (книги, сайты, форумы), где можно найти готовый код макросов на 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
  • Что такое Личная Книга Макросов и как её использовать

Хитрости »

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


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

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

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

Как написать и использовать собственную надстройку в Excel

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

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

Если макросов много, а используются они часто более рационально будет
создание собственной надстройки Excel — отдельного файла
особого формата (xla – Excel2003, xlam – Excel2010 и старше), содержащего
все макросы.

Плюсы такого подхода очевидны:

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

Рассмотрим процесс создания своей собственной надстройки для Excel на примере Excel 2010.

1. Создать файл надстройки

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

По умолчанию Excel хранит надстройки в папке C:Users<Учетная запись пользователя
>AppDataRoamingMicrosoftAddIns
, но можно указать и любую другую
папку.

2. Подключить созданную надстройку

Теперь созданную нами на прошлом шаге надстройку ExcelPlus надо
подключить к Excel. Для этого в меню Файл — Параметры — Надстройки, жмем на кнопку Перейти в нижней части окна:

Если вы скопировали файл надстройки в папку по умолчанию, то новая
надстройка ExcelPlus должна появиться в списке доступных
надстроек:

Либо в этом окне жмем Обзор и указываем
положение нашего файла надстройки.

Ставим флажок напротив названия настройки и жмем ОК.

3. Добавить макросы в надстройку

Теперь надстройка подключена к Excel, но она не может работать, так как в
ней отсутствуют макросы. Добавим макрос в надстройку. Для этого откроем
редактор VBA по Alt+F11 или кнопкой Visual Basic на
вкладке Разработчик:

В левом верхнем углу редактора должно быть окно Project

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

В этом модуле будет хранится VBA-код макросов надстройки.

Добавим в добавленный пустой модуль код макроса, который производит поиск в
тексте кириллических символов:

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

Такие макросы как FindCyr называют еще процедурами. Макросы в составе надстроек можно запустить также как
обычные макросы:

  • при помощи сочетания клавиш Alt+F8, а затем нажать кнопку Выполнить
    (макросы надстроек здесь не видны. Несмотря на это, мы можем ввести имя нашей процедуры в поле Имя макроса);
  • назначить сочетание клавиш для быстрого запуска макроса — кнопка Параметры в окне Макрос
  • создать кнопку для нашего макроса на панели быстрого доступа в левом верхнем углу окна.

Подробнее и с картинками о способах запуска макроса написано здесь.

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

4. Добавить функции в надстройку

Кроме макросов-процедур, существуют еще и макросы-функции или
пользовательская функция. Создадим в нашей надстройке еще один
модуль меню Insert — Module и вставим туда код функции,
которая находит сумму ячеек нужного цвета:

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

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

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

У созданных пользователем функций отсутствует описание функции в нижней
части окна. Чтобы его добавить, нужно:

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

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

5. Создать вкладку надстройки в интерфейсе Excel

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

Мы будем писать код вкладки с помощью бесплатной программы для редактирования XML

Ribbon XML Editor

  1. Закрыть все окна Excel.
  2. Запустить программу Ribbon XML Editor и открыть в ней файл надстройки Excel Plus.xlam.
  3. При помощи кнопки tabs в левом верхнем углу добавить
    заготовку кода для новой вкладки
  4. В кавычки по стрелке нужно вписать id — любые уникальные
    идентификаторы вкладки и группы, а в label — названия
    вкладки и группы кнопок на ней:
  5. При помощи кнопки button на панели слева добавляем
    заготовку кода для кнопки и дописываем к ней:
  6. Id – идентификатор кнопки;

    label — текст на кнопке;

    imageMso — условное название изображения на кнопке(иконка). Иконку можно выбрать из
    большого числа изображений, щелкнув по кнопке:

    — onAction
    — имя процедуры обратного вызова — специального короткого макроса, который
    будет запускать основной макрос FindCyr. Назвать эту
    процедуру можно, например, FindCyrStart.

  7. Проверить правильность сделанного с помощью кнопки с зеленой галочкой
    сверху на панели инструментов. Рядом с ней нажмите на кнопку с дискетой для
    сохранения изменений:
  8. Закрыть Ribbon XML Editor
  9. Открыть Excel, зайти в редактор VBA по Alt+F11 и добавить к нашему
    макросу процедуру вызова FindCyrStart, для запуска
    основного макросы поиска кириллицы.
  10. Сохранить изменения в редакторе VBA и в Excel проверить результат:


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

Яндекс.Метрика

Надстройки Excel – это прекрасная альтернатива создания макросов доступных для использования любых других файлов рабочих книг. Если Вам понравиться создавать свои надстройки и вы войдете во вкус, то это полезное и интересное занятие может еще для вас приносить неплохой доход. Надстройки можно публиковать и продавать в магазине Office Store. В данном примере мы покажем, как создать свою достройку с макросом, написанным на коде самого простого и весьма востребованного языка программирования VBA (Visual Basic for Applications).

Как сделать и установить надстройку в Excel

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

  1. Создайте новую рабочую книгу: «ФАЙЛ»-«Создать»-«Пустая книга». Или нажмите комбинацию горячих клавиш CTRL+N.
  2. Создать файл XLA.

  3. Откройте редактор макросов: «РАЗРАБОТЧИК»-«Код»-«Visual Basic».
  4. Редактор Visual Basic.

  5. Вставьте новый модуль выбрав инструмент: «Insert»-«Module».
  6. Код макроса.

  7. В окне модуля введите свой код макроса. Возьмем простейший пример макроса:
  8. Sub MyMakros()
    Dim polzovatel As String
    Dim data_segodnya As Date
    polzovatel = Application.UserName
    data_segodnya = Now
    MsgBox "Макрос запустил пользователь: " & polzovatel & vbNewLine & data_segodnya
    End Sub

  9. Закройте окно редактора макросов и выберите инструмент: «ФАЙЛ»-«Сохранить как» (CTRL+S). В поле «Имя файла:» введите название для своей тестовой программы. А из выпадающего списка «Тип файла:» выберите значение «Надстройка Excel 97-2003» (*.xla). Автоматически откроеться папка для установки надстроек: C:Documents and SettingsUser_Name AppDataRoamingMicrosoftAddIns. И нажмите на кнопку «Сохранить».
  10. Сохранение совместимости.

  11. Перед тем как установить надстройку в Excel, закройте все открытые рабочие книги снова запустите программу Excel.
  12. Выберите инструмент: «ФАЙЛ»-«Параметры»-«Надстройки». Внизу из выпадающего списка «Управление:» укажите на опцию «Надстройки Excel» и нажмите на кнопку «Перейти».
  13. Параметры Excel.

  14. В появившемся диалоговом окне «Надстройки» нажмите на кнопку «Обзор», а после найдите и найдите свое название, на против него поставьте галочки и нажмите на кнопку «Ок». Если вы не находите названия нажмите на кнопку «Обзор», чтобы указать путь к вашему файлу с надстройкой.

Включить.

Надстройка VBA готова! Теперь во всех открытых рабочих книгах можно будет воспользоваться макросами из вашего *.xla файла. Чтобы убедиться в этом снова откройте редактор Visual Basic (ALT+F11).

Проверка.

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



Как удалить надстройку в Excel

Чтобы отключить вашу надстройку снова откройте окно «ФАЙЛ»-«Параметры»-«Надстройки»-«Перейти» и снимите соответственную галочку в появившемся диалоговом окне. Для полного удаления надстройки придется удалить ее файл *.xla из папки C:Documents and SettingsUser_Name AppDataRoamingMicrosoftAddIns.

Полезные советы по надстройкам

Внимание! В данном примере мы использовали формат рабочей книги для сохранения файла в формате «Надстройка 97-2003». Это позволяет использовать ее в разных версиях Excel. Например, файлы, сохраненные в формате *.xlam не может быть использована в версии 2007 и старше. Поэтому лучше воспользоваться старым форматом файлов надстройке *.xla.

Читайте также: скачать VBA код программы надстройки сумма прописью с копейками на русском, украинском и английском языке. Или перевод числа в текст средствами Excel.

Примечание. Если вы хотите защитить паролем доступ к своим исходным кодам макросов, тогда выберите инструмент в редакторе Visual Basic: «Tools»-«VBAProject Properties». На закладке «Protection» в поле ввода «Password:» введите пароль для защиты доступу к макросам проекта рабочей книги. В поле ввода «Confirm password:» введите пароль повторено и нажмите на кнопку ОК.

Надстройка VBA готова! Теперь во всех открытых рабочих книгах можно будет воспользоваться макросами из вашего *.xla файла. Чтобы убедиться в этом снова откройте редактор Visual Basic (ALT+F11).

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

Простейший способ запустить редактор Visual Basic в Excel – нажать комбинацию клавиш Alt+F11 (то есть нажать клавишу Alt и, удерживая её, нажать клавишу F11). После этого откроется окно редактора Visual Basic, как показано на картинке ниже. Имейте ввиду, что окно Excel остается открытым и находится позади окна редактора.

В процессе работы в редакторе Visual Basic в Excel могут быть открыты различные окна. Управление окнами осуществляется в меню View, которое находится в верхней части окна редактора VBA. Ниже дано описание отдельных окон.

Окно Project открывается в левой части редактора VBA (показано на картинке выше). В этом окне для каждой открытой рабочей книги создаётся проект VBA (VBA Project). Проект VBA – это набор всех объектов и модулей VBA, привязанных к текущей книге. Изначально в него входят:

Самостоятельно в проект можно добавить объекты Userform, Module и Class Module. Если Вы посмотрите на картинку выше, то увидите, что в проект VBA для книги Book1.xlsm добавлен объект Module с названием Module1.

Для каждого из описанных выше объектов предусмотрено специальное окно, в котором будет создаваться и храниться новый код VBA. Порядок при этом такой:

Окно кода (Code)

Двойной щелчок мышью по любому объекту в окне Project открывает соответствующее окно Code, предназначенное для ввода кода VBA с клавиатуры. На одном из приведённых выше рисунков показано окно кода для Module1.

По мере ввода кода VBA в окно Code, редактор Visual Basic следит за правильностью ввода, ищет ошибки в коде и выделяет код, который требует исправления.

Установка надстройки в Excel 2010

Стоит заметить, что в Excel 2010 редактор Visual Basic устанавливается как отдельный компонент пакета с наименованием “Общие средства Office” и называется “Visual Basic для приложений”. Узнать установлен ли у Вас редактор Visual Basic – очень просто. Нужно его запустить! О том как это сделать, можно прочитать отдельно. Если редактор Visual Basic не запустился – доустанавливаем его. Итак, переходим непосредственно к установке надстроек в Эксель!

Установить надстройку в Excel 2010 можно аналогично тому как это делается в Excel 2007.

Шаг 1. Сохраняем файл надстройки на компьютер и запоминаем место его хранения (расположения).

Шаг 2. Запускаем приложение Excel 2010, выбираем вкладку “Файл”, а затем «Параметры Excel» как показано на рисунке

Шаг 3. В появившемся окне “Параметры Excel” в поле “Управление:” выбираем “Надстройки Excel” и жмем кнопку “Перейти…”

Шаг 4. В очередном окне с названием “Надстройки” появляется список доступных надстроек, которые можно подключать и отключать установкой и снятием галочек перед названиями соответствующих надстроек. Для добавления (подключения) новых надстроек, нажимаем кнопку “Обзор”.

Появляется окно “Обзор”, которое отправляет нас искать надстройки в папку с названием Addins и это имеет свой смысл.

Именно в этом месте и должны располагаться файлы надстроек для максимально быстрого доступа к ним как приложения, так и самих пользователей. Размещение надстроек в папке Addins ускоряет загрузку приложения Excel и подключение к нему надстройки (надстроек) при последующих запусках. Перемещаем (добавляем) в это окно (в эту папку) файл, который присутствовал в Шаге 1. Если по каким-то причинам Вы не смогли, либо не захотели расположить свои надстройки в папке Addins, то через окно “Обзор” просто добираетесь до того места, где был изначально сохранен файл надстройки. Дважды кликаете по выбранному файлу и надстройка добавляется в список доступных надстроек. Все, надстройка установлена. Обращаю Ваше внимание на то, что если после установки файл надстройки будет перемещен в другое место жесткого диска, либо название папки, в которой он находится будет изменено, то весь процесс установки придется повторить заново.

Если Вы устанавливали готовые надстройки для Excel 2010, взятые с этого сайта, то после окончания процесса установки на ленте будет сформирована новая вкладка “Надстройки”. При этом в настраиваемой панели инструментов будут отображены кнопки, запускающие макросы.

Начиная с Excel 2010 появилась возможность установки надстроек на вкладке “Разработчик”.

Установка надстройки в Excel 2013

Надстройки в Excel 2013 устанавливаются через Файл/Параметры/Надстройки после чего нажимается кнопка “Перейти” и в менеджере надстроек подключаются необходимые надстройки. Окно менеджера надстроек можно вызывать кнопкой, расположенной на вкладке “Разработчик”.

Быстрая установка надстроек через вкладку “Разработчик”

Начиная с Excel 2010 на вкладку “Разработчик” добавлена новая группа кнопок “Надстройки”. По умолчанию эта вкладка на ленте Excel отсутствует, для её отображения необходимо зайти в меню Файл/Параметры/Настройка ленты и в правой части диалогового окна установить флажок перед полем “Разработчик”. После этого на ленте приложения появляется одноименная вкладка с группой кнопок “Надстройки”. При помощи одной из них вызывается менеджер надстроек, в котором можно произвести выбор файла устанавливаемой надстройки.

При помощи кнопки, расположенной рядом, можно управлять COM-надстройками.

Удаление файла надстройки

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

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

Инструкция по отключению надстройки

  1. Откройте любой файл Excel, либо “чистую” книгу
  2. Откройте параметры Excel
  3. Перейдите в список надстроек
  4. Отключите надстройку VBA-Excel сняв с нее выбор и нажав ОК.

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

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

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

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

В левом верхнем углу редактора должно быть окно Project (если его не видно, то включите его через меню View – 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):

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

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

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

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

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

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

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

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

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

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

Первая программа на VBA Excel

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

Откройте стандартный модуль двойным кликом по его ссылке в проводнике. Поместите в него курсор и нажмите кнопку «Procedure…» во вкладке «Insert» главного меню. Та же ссылка будет доступна при нажатии на вторую кнопку после значка Excel на панели инструментов.

В результате откроется окно добавления шаблона процедуры (Sub).

Наберите в поле «Name» имя процедуры: «Primer1», или скопируйте его отсюда и вставьте в поле «Name». Нажмите кнопку «OK», чтобы добавить в модуль первую и последнюю строки процедуры.

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

Вставьте внутрь шаблона процедуры следующую строку: MsgBox "Привет".

Функция MsgBox выводит информационное сообщение с указанным текстом. В нашем примере – это «Привет».

Проверьте, что курсор находится внутри процедуры, и запустите ее, нажав клавишу «F5». А также, запустить процедуру на выполнение можно, нажав на треугольник (на изображении под пунктом меню «Debug») или на кнопку «Run Sub/UserForm» во вкладке «Run» главного меню редактора VBA Excel.


Если вы увидели такое сообщение, как на изображении, то, поздравляю – вы написали свою первую программу!

Работа с переменными

Чтобы использовать в процедуре переменные, их необходимо объявить с помощью ключевого слова «Dim». Если при объявлении переменных не указать типы данных, они смогут принимать любые доступные в VBA Excel значения. Комментарии в тексте процедур начинаются со знака «’» (апостроф).

Пример 2
Присвоение переменным числовых значений:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Public Sub Primer2()

‘Объявляем переменные x, y, z

Dim x, y, z

‘Присваиваем значение переменной x

x = 25

‘Присваиваем значение переменной y

y = 35

‘Присваиваем переменной z сумму

‘значений переменных x и y

z = x + y

‘Выводим информационное сообщение

‘со значением переменной z

MsgBox z

End Sub

Пример 3
Присвоение переменным строковых значений:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Public Sub Primer3()

‘Объявляем переменные x, y, z

Dim x, y, z

‘Присваиваем строку переменной x

x = “Добрый”

‘Присваиваем строку переменной y

y = “день!”

‘Присваиваем переменной z строку,

‘состоящую из строк x и y

‘с пробелом между ними

z = x & ” “ & y

‘Выводим информационное сообщение

‘со значением переменной z

MsgBox z

End Sub

Скопируйте примеры процедур в стандартный модуль и запустите их на выполнение.

Запись макросов макрорекордером

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

  • Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу – запись останавливается.
  • Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
  • Если во время записи макроса макрорекордером вы ошиблись – ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) – во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.

Чтобы включить запись необходимо:

  • в Excel 2003 и старше – выбрать в меню Сервис – Макрос – Начать запись (Tools – Macro – Record New Macro)
  • в Excel 2007 и новее – нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)

Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:

  • Имя макроса – подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
  • Сочетание клавиш – будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис – Макрос – Макросы – Выполнить (Tools – Macro – Macros – Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
  • Сохранить в… – здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
    • Эта книга – макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
    • Новая книга – макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
    • Личная книга макросов – это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.

После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording).

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

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

Кнопка на панели инструментов в Excel 2003 и старше

Откройте меню Сервис – Настройка (Tools – Customize) и перейдите на вкладку Команды (Commands). В категории Макросы легко найти веселый желтый “колобок” – Настраиваемую кнопку (Custom button):

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

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

Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar):

Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:

Кнопка на листе

Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:

  • В Excel 2003 и старше – откройте панель инструментов Формы через меню Вид – Панели инструментов – Формы (View – Toolbars – Forms)
  • В Excel 2007 и новее – откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)

Выберите объект Кнопка (Button):

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

Источники

  • https://exceltable.com/vba-macros/sozdat-dobavit-nadstroyku
  • https://office-guru.ru/excel/redaktor-visual-basic-v-excel-451.html
  • http://macros-vba.ru/nadstrojki/excel/64-kak-ustanovit-nadstrojku-na-komputer
  • http://macros-vba.ru/nadstrojki/excel/106-kak-udalit-nadstrojku-xlam-udalenie-nadstroek
  • https://micro-solution.ru/projects/addin_vba-excel/uninstall
  • https://www.planetaexcel.ru/techniques/3/6154/
  • https://vremya-ne-zhdet.ru/vba-excel/nachinayem-programmirovat-s-nulya/
  • https://www.planetaexcel.ru/techniques/3/59/

Введение

Целью создания этой статьи является сделать мини- шпаргалку для создания надстроек VSTO, здесь я попытался объединить собранные разрозненные крупицы информации по созданию надстройки VSTO на языке C# для Excel. Статья не претендует на целостное описание процесса создания надстройки, это скорее, «дорожная карта» для новичков, здесь описывается как по шагам сделать простейшую надстройку над Excel.

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

Visual Studio Tools for Office (VSTO, Visual Studio Tools для офиса) представляет собой набор средств разработки, позволяющий использовать всю функциональность .NET Framework для написания пользовательских функций офисного пакета. Надстройки, написанные в VSTO, являются полноценными скомпилированными программами, которые дополняют функционал офисного пакета и кастомизируют бизнес-логику конкретной фирмы.

Процесс написания надстройки

Для начала необходимо создать проект и выбрать тип «Надстройка VSTO для Exсel» в нашей любимой, а может не очень Visual Studio 2022, при необходимости выполнить установку соответствующих компонентов. Далее на следующей странице ввести имя проекта и выбрать платформу .NET Framework 4.8, как самую последнею. Увы платформа ограничивает максимально доступную версию используемого языка С# не выше 7.3, и некий «синтаксический сахар» из последних версий будет недоступен, что немного огорчает.

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

//Возвращает объект приложение Excel
public Excel.Application GetApplication()
{
	return Application;
}
//Возвращает объект активная рабочаяя книга
public Excel.Workbook GetActiveWorkBook()
{
	return (Excel.Workbook)Application.ActiveWorkbook;
}
//Возвращает объект активный рабочий лист
public Excel.Worksheet GetActiveWorksheet()
{
	return (Excel.Worksheet)Application.ActiveSheet;
}
//Возвращает объект активная ячейка
public Excel.Range GetActiveCell()
{
	return (Excel.Range)Application.Selection;
}

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

Application application = Globals.ThisAddIn.GetApplication();
Worksheet worksheet = Globals.ThisAddIn.GetActiveWorksheet();
Range cell = Globals.ThisAddIn.GetActiveCell();
Workbook workBook = Globals.ThisAddIn.GetActiveWorkBook();

Данный код проще всего добавить в абстрактный класс и от него наследовать все функции нашего приложения:

protected abstract class AbstractFunctions
{
	protected readonly Application application = Globals.ThisAddIn.GetApplication();
	protected readonly Worksheet worksheet = Globals.ThisAddIn.GetActiveWorksheet();
	protected readonly Range cell = Globals.ThisAddIn.GetActiveCell();
	protected readonly Workbook workBook = Globals.ThisAddIn.GetActiveWorkBook();
	public abstract void Start();  
}

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

internal class DeleteFormula : AbstractFunctions
{
	public override void Start()
	{
		cell.Value = cell.Value;                            //Удаляем формул
		worksheet.get_Range("A1", Type.Missing).Select();   //Фокус на ячейку А1   
	}
}

Далее необходимо добавить ленту Ribbon (Visual Designer) на которой будут располагаться кнопки запуска наших приложений, тут тоже хитрого ничего нет, и добавляется на точно также, как и все элементы в проект:

Далее, в коде нашей ленты мы создаем обработчики нажатий на кнопки, я предпочитаю разносить функции по классам и использовать генерацию события нажатия на кнопку в методе Load(). Это значительно упрощает код визуально и облегчает внедрение зависимостей (Dependency injection):

public partial class Ribbon1
{     
	private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
	{             
		button1.Click += (s, a) =>
		{
			DeleteFormyla deleteFormyla= new DeleteFormyla ();
			DeleteFormyla.Start();
		}
	}
}

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

Теперь кульминация, запуск и.. Не работает, необходимо создать сертификат надстройки, заходим в Projects-Propertis-Signing, создаем тестовый ключ Create Test Certificate. И теперь Ваша надстройка успешно работает.

Таким образом, за минимум действий можно создать рабочую надстройку Excel.

Like this post? Please share to your friends:
  • Своя вкладка в excel
  • Своя валюта в excel
  • Своя function vba excel
  • Сворачивающийся текст в word
  • Сворачивающийся список в word