Как создать и добавить надстройку в Excel с кодом VBA
Надстройки Excel – это прекрасная альтернатива создания макросов доступных для использования любых других файлов рабочих книг. Если Вам понравиться создавать свои надстройки и вы войдете во вкус, то это полезное и интересное занятие может еще для вас приносить неплохой доход. Надстройки можно публиковать и продавать в магазине Office Store. В данном примере мы покажем, как создать свою достройку с макросом, написанным на коде самого простого и весьма востребованного языка программирования VBA (Visual Basic for Applications).
Как сделать и установить надстройку в Excel
Чтобы создать, добавить и включить свою надстройку с макросом, следует:
- Создайте новую рабочую книгу: «ФАЙЛ»-«Создать»-«Пустая книга». Или нажмите комбинацию горячих клавиш CTRL+N.

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

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

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

Как видно ее теперь всегда можно найти в списке проектов и использовать все ее макросы в любых других файлах.
Как удалить надстройку в Excel
Чтобы отключить вашу надстройку снова откройте окно «ФАЙЛ»-«Параметры»-«Надстройки»-«Перейти» и снимите соответственную галочку в появившемся диалоговом окне. Для полного удаления надстройки придется удалить ее файл *.xla из папки C:\Documents and Settings\User_Name \AppData\Roaming\Microsoft\AddIns.
Полезные советы по надстройкам
Внимание! В данном примере мы использовали формат рабочей книги для сохранения файла в формате «Надстройка 97-2003». Это позволяет использовать ее в разных версиях Excel. Например, файлы, сохраненные в формате *.xlam не может быть использована в версии 2007 и старше. Поэтому лучше воспользоваться старым форматом файлов надстройке *.xla.
Читайте также: скачать VBA код программы надстройки сумма прописью с копейками на русском, украинском и английском языке. Или перевод числа в текст средствами Excel.
Примечание. Если вы хотите защитить паролем доступ к своим исходным кодам макросов, тогда выберите инструмент в редакторе Visual Basic: «Tools»-«VBAProject Properties». На закладке «Protection» в поле ввода «Password:» введите пароль для защиты доступу к макросам проекта рабочей книги. В поле ввода «Confirm password:» введите пароль повторено и нажмите на кнопку ОК.
Пишем надстройку для Excel на .NET с помощью библиотеки Excel-DNA
Excel-DNA — библиотека для .NET, с помощью которой можно написать и собрать полностью самодостаточный файл надстройки для Excel с расширением .xll
Этот файл достаточно положить в пользовательскую папку, без прав администратора, и просто включить в настройках Excel.
Такая надстройка будет иметь доступ к COM-модели Excel, C API Excel — позволяет взаимодействовать с интерфейсом программы и рабочими книгами. Сможет реализовать пользовательские формулы и добавить свое меню на интерфейсную ленту Ribbon UI.
В статье я расскажу как написать свою формулу для Excel на C#. Собрать и установить свою первую надстройку.
Подготовка
Создадим новый проект библиотеки классов для версии .NET 6
В файле .csproj нужно изменить значение версии фреймворка на
Теперь установим базовый пакет ExcelDna.AddIn
Писать можно и в Visual Studio, и в VSCode.
Чтобы дебажить код в VSCode нужно создать файл launch.json и в нем изменить две строки, «program» и «args» :
Пути к файлу программы Excel и собранной надстройки нужно поставить свои.
Первая формула
Напишем простую формулу, которая складывает два числа:
Все статические методы помеченные атрибутом [ExcelFunction] теперь принимаются Excel как пользовательские формулы.
Нажмем F5, откроется Excel, который уже откроет файл нашей надстройки. Поскольку у нас нет цифровой подписи появится предупреждение.

Нажимаем «Включить» и проверяем работу нашей формулы

Интерфейс IExcelAddIn
Для работы нашей надстройки может понадобится, чтобы она при открытии и закрытии выполняла какие-либо полезные вещи. Например читала настройки из реестра, подключала базы данных.
Cоздадим класс MyAddIn , реализующий интерфейс IExcelAddIn
При открытии надстройки будет создан экземпляр класса MyAddIn и выполнен метод AutoOpen()
Делаем формулу запроса курса валют с сайта ЦБ
Напишем теперь формулу, которая делает что-то полезное, например запрашивает курс валют с сайта ЦБ.
Интерфейс для клиента:
Класс клиента API сайта ЦБ. Парсим XML с курсами на нужную дату:
Добавляем нужные сервисы и создаем провайдер сервисов
И, наконец, определяем метод для формулы:
Теперь формула =ExchangeRate( ) возвращает сегодняшний курс евро, а если сослаться на ячейку с датой в формате Excel, на нужную дату.
Сборка и установка
Чтобы собрать нашу надстройку в один файл со всеми зависимостями, нужно добавить в файл .csproj строки
и в папке \bin\Debug\net6.0-windows забираем два собранных файла для 32 и 64-разрядных версий Excel
Эти файлы нужно поместить в папку %AppData%\Microsoft\AddIns и в настройках Excel поставить галочку напротив нашего файла. Готово!
Заключение
В этой статье описывается как написать и собрать простую надстройку для Excel средствами .NET.
Как создать свою надстройку для Microsoft 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\Ваше_имя\AppData\Roaming\Microsoft\AddIns, но, в приниципе, можно указать любую другую удобную вам папку.
Шаг 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):
В этом окне отображаются все открытые книги и запущенные надстройки Microsoft Excel, в том числе и наша VBAProject (MyExcelAddin.xlam) Выделите её мышью и добавьте в неё новый модуль через меню Insert — Module. В этом модуле мы и будем хранить VBA-код наших макросов надстройки.
Код можно либо набрать «с нуля» (если вы умеете программировать), либо скопировать откуда-нибудь уже готовый (что гораздо проще). Давайте, для пробы, введем в добавленный пустой модуль код простого, но полезного макроса:
После набора кода не забудьте нажать на кнопку сохранения (дискетку) в левом верхнем углу.
Наш макрос FormulasToValues, как легко сообразить, преобразует формулы в значения в выделенном предварительно диапазоне. Иногда такие макросы называют еще процедурами. Чтобы его запустить, нужно выделить ячейки с формулами и открыть специальное диалоговое окно Макросы с вкладки Разработчик (Developer — Macros) или сочетанием клавиш Alt + F8 . Обычно в этом окне отображаются доступные макросы из всех открытых книг, но макросы надстроек здесь не видны. Несмотря на это, мы можем ввести имя нашей процедуры в поле Имя макроса (Macro name) , а затем нажать кнопку Выполнить (Run) — и наш макрос заработает:
![]() |
![]() |
При назначении клавиш имейте ввиду, что здесь учитывается регистр и раскладка клавиатуры. Поэтому, если вы назначите сочетание, например, Ctrl + Й , то, по факту, вам придется в будущем следить за тем, чтобы у вас была включена именно русская раскладка и жать дополнительно Shift , чтобы получить заглавную букву.
Для удобства можно добавить и кнопку для нашего макроса на панель быстрого доступа в левом верхнем углу окна. Для этого выберите Файл — Параметры — Панель быстрого доступа (File — Options — Customize Quick Access Toolbar) , а затем в выпадающем списке в верхней части окна опцию Макросы. После этого наш макрос FormulasToValues можно поместить на панель кнопкой Добавить (Add) и выбрать для него значок кнопкой Изменить (Edit) :
Шаг 4. Добавляем в надстройку функции
Кроме макросов-процедур, существуют еще и макросы-функции или как их еще называют UDF (User Defined Function = пользовательская функция). Давайте создадим в нашей надстройке отдельный модуль (команда меню Insert — Module) и вставим туда код такой функции:
Несложно сообразить, что эта функция нужна для извлечения НДС из суммы включающей НДС. Не бином Ньютона, конечно, но нам для примера сгодится, чтобы показать основные принципы.
Заметьте, что синтаксис функции отличается от процедуры:
- используется конструкция Function . End Function вместо Sub . End Sub
- после названия функции в скобках указываются её аргументы
- в теле функции производятся необходимые вычисления и затем результат присваивается переменной с названием функции
Также обратите внимание, что эту функцию не нужно, да и невозможно запустить как предыдущий макрос-процедуру через диалоговое окно Макросы и кнопку Выполнить. Такую макрофункцию нужно использовать как стандартную функцию листа (СУММ, ЕСЛИ, ВПР. ), т.е. просто ввести в любую ячейку, указав в качестве аргумента значение суммы с НДС:

. или ввести через стандартное диалоговое окно вставки функции (кнопка fx в строке формул), выбрав категорию Определенные пользователем (User Defined) :
Единственный неприятный момент здесь — это отсутствие привычного описания функции в нижней части окна. Чтобы его добавить придется проделать следующие действия:
- Откройте редактор Visual Basic сочетанием клавиш Alt + F11
- Выделите надстройку в панели Project и нажмите клавишу F2 , чтобы открыть окно Object Browser
- Выберите в верхней части окна в выпадающем списке свой проект надстройки
- Щелкните по появившейся функции правой кнопкой мыши и выберите команду Properties.
- Введите описание функции в окно Description
- Сохраните файл надстройки и перезапустите Excel.

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

Шаг 5. Создаем вкладку надстройки в интерфейсе
Финальным, хоть и не обязательным, но приятным штрихом будет создание отдельной вкладки с кнопкой запуска нашего макроса, которая будет появляться в интерфейсе Excel после подключения нашей надстройки.
Информация об отображаемых вкладках по умолчанию содержится внутри книги и должна быть оформлена в виде специального XML-кода. Проще всего писать и редактировать такой код с помощью специальных программ — XML-редакторов. Одна из самых удобных (и бесплатных) — это программа Максима Новикова Ribbon XML Editor.
Алгоритм работы с ней следующий:
- Закройте все окна Excel, чтобы не было конфликта файлов, когда мы будем редактировать XML-код надстройки.
- Запустите программу Ribbon XML Editor и откройте в ней наш файл MyExcelAddin.xlam
- При помощи кнопки tabs в левом верхнем углу добавьте заготовку кода для новой вкладки:



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




Доброго времени суток!
Давно ждал такого позновательного видео на эту тему! Спасибо!
Есть 2 вопроса, прошу помощи.
Подскажите пожалуйста, возможно ли как-то редактировать такую надстройку, например, добавить еще одну кнопку в свою вкладку? Или надо все делать с нуля?
Еще вопрос. Если у меня, например, есть перечень средних цен товаров, которые я хочу выводить на экран (быстро смотреть цену какого-то товара) через вот такую надстройку (чтобы всегда было под рукой), где хранить данный перечень? Перечень у меня на листе excel. Могу ли я создавать надстройку сразу с таким перечнем на листе и потом создать форму с быстрым поисковиком, которая будет вызываться через вкладку «Моя надстройка»?


Так и быть, сам отвечу на свои вопросы:
1. Да, открываем надстройку через Ribbon XML Editor и продолжаем добовлять кнопки и что хотим.
2. Да! Для редактирования в свойствах книг IsAddin ставите False, надстройка будет отображаться с листами, как обычная книга. Добавляем сколько надо листов, делаете с ними что хотите, затем возвращаете свойство IsAddin в True, сохраняемся.


Как известно, «лишь тот разбирается в своём деле, кто может новичку объяснить смысл простыми словами. И он поймёт».
Как всегда блестяще, Николай! ))
P.S.: как ваше отчество? Развейте уже сомнения на форуме))))
Спасибо! Рад помочь.

P.S. Владимировичи мы


спасибо!


Добрый день!
Спасибо, отличная статья!
Только не получилось сохранить описание к функции по извлечения НДС. У меня EXCEL 2016







Добрый день, господа.
Пользовался своей надстройкой XLA, все было хорошо, пока не потерял её. Со временем восстановил коды и по Вашему образцу сделал надстройку XLAM. Все работало до поры до времени, пока не добавил пару макросов (последний — массовая замена).
Не знаю, в этом ли причина, и где копать, но почти на все макросы у меня одна и та же ошибка вылезает:
«Method or data member not found», везде, где есть строчка кода » Selection. «
Глюк это или фича. голову ломаю
Хотел бы надстройку прикрепить, но здесь, как я понял, нет возможности




Спасибо за информацию. Очень доступно и познавательно. Создал свою надстройку. Теперь буду в нее добавлять новые макросы. Кстати, можно импортировать из Personal.xlsb нужные модули с макросами, предварительно экспортируя их в какую-нибудь папку.



Подскажите пожалуйста, что делать, если понадобилось посмотреть/отредактировать содержимое листов надстройки?
Если я редактирую файл исходник xlsm и пересохраняю в xlam, то приходится заново рисовать интерфейс.
Спасибо

Добрый день! Николай, подскажите, пожалуйста, у меня при создании своей надстройки возникает следующая проблема: когда я сохраняю файл с расширением «надстройка Excel» ( в нем уже есть весь код), то он работает только в данной книге. Когда я открываю новую книгу (все остальные закрыты), то ексель просто не видит мой макрос Хотя сам файл с кодом я вижу в той папке в которую я его сохранил, вкладки, кнопки — все тоже есть. Как можно это исправить? надстройка подключена.
Туториал: создание VBA-надстройки с отдельной вкладкой в MS Excel
Многие из тех, кто часто работает в MS Excel, собрали коллекцию макросов на VBA, которые облегчают их ежедневный труд. У кого-то эти макросы хранятся в отдельной книге, кто-то собрал их в «личной книге макросов» (personal.xlsb), доступной на уровне всего приложения, и вручную добавил кнопки вызова нужных скриптов на панель инструментов. В первом случае коллекцией удобно делиться с коллегами — достаточно переслать файл, но чтобы ей воспользоваться, необходимо каждый раз открывать эту книгу. Во втором случае доступ к функциональности есть сразу при запуске Excel, но могут возникнуть проблемы с передачей наработок другим пользователям.
В данном посте описан способ создания VBA-настройки с пользовательской панелью инструментов на ленте Excel (Ribbon), которая позволяет воспользоваться преимуществами обоих подходов. Это файл в формате xlam, который можно передавать как обычную Excel-книгу. При её открытии пользователь видит появившуюся панель инструментов, которая даёт доступ к функциональности надстройки:

При желании можно установить её на постоянной основе, чтобы не возникало необходимости её открывать каждый раз.
Используемые инструменты: MS Excel, 7zip, Visual Sudio Code. Последние два необязательны, подойдёт любой архиватор с поддержкой zip-формата и любой текстовый редактор, умеющий в UTF-8 (если Вы хотите использовать кириллицу).
Также желательно обладать базовым представлением о формате XML.
Код и результат в виде книги xlsm можно найти на гитхабе:
Итак, для начала откроем новую книгу, и добавим модуль с образцом кода:

Сохраним книгу в формате xlsm (книга с поддержкой макросов). Современные форматы документов MS Office (xlsx, xlsm, docx, docm, pptx и т.д.) основаны на стандарте OpenXML и представляют из себя обычный zip-архив, который состоит из компонентов (например, XML-файлы, соответствующие листам, изображения, бинарный контент и прочее), а также файлов отношений (.rels), которые задают структуру всего документа, путём ссылок на компоненты.
Чтобы получить доступ к внутреннему содержимому книги, можно переименовать файл Sample.xlsm в Sample.zip , после чего открыть его любым архиватором. Некоторые архиваторы, например 7zip, умеют открывать файлы напрямую, без изменения имени файла:

Чтобы добавить ribbon-панель, нам нужно будет создать новый компонент customUI/customUI.xml, а также добавить ссылку на него в корневой файл отношений _rels/.rels
Разархивируем весь документ в отдельную папку («Распаковать в «Sample\»»), и создадим в ней новую папку customUI:

Теперь добавим собственно компонент:

Ниже приводится текстовая версия содержимого customUI.xml
<?xml version=»1.0″ encoding=»utf-8″?>
<tab label=»Sample Add-in» keytip=»XT»>
<group label=»Group 1″>
<button imageMso=»BlackAndWhiteAutomatic» keytip=»H» label=»Привет, Мир!»
onAction=»SayHelloWorld» screentip=»Поприветствовать мир» size=»large» />
<button imageMso=»SmartArtChangeColorsGallery» keytip=»D»
label=»Выделение цветом дублей» onAction=»DuplicateColors»
screentip=»Выделение парными цветами повторов в выделенном диапазоне» size=»large» />
Коротко расскажу о важных элементах и атрибутах.
Значения идентификаторов (атрибут id) должны быть уникальными. Для некоторых элементов (например, tab — в случае, если Вы объявляете новую вкладку, а не существующую, путем указания idMso) также обязательно указать label — иначе Excel не отобразит этот элемент.
С помощью атрибута imageMso можно определить иконку элемента из числа имеющихся в MS Office. Список доступных значений весьма объемный, поэтому здесь приводить не буду — он легко гуглится.
Элемент button — обычная кнопка. В зависимости от атрибута size может быть маленького размера или большой, во всю высоту вкладки.
Атрибут onAction задаёт название процедуры, которая будет выполнена при основном взаимодействии с элементом (например, при нажатии на кнопку button). Процедура должна иметь определённую сигнатуру (количество и тип аргументов), их можно найти в спецификации. Например, метод для onAction у элемента button принимает один аргумент типа IRibbonControl.
Название этого метода также не должно совпадать с названием модуля (либо необходимо явно указать имя модуля перед именем самого метода: «Module1.SayHelloWorld«).
Атрибут keytip поможет в навигации с помощью клавиатуры — с помощью клавиши Alt можно осуществлять навигацию по вкладкам MS Excel.
Вы можете скопировать образец вёрстки на официальном сайте с документацией от Microsoft:
Для тех, кто хочет подробно изучить стандарт, есть спецификация, также на docs.microsoft.com :
Обратите внимание, что при наличии не-ASCII символов (например, кириллицы) файл следует сохранить в кодировке UTF-8, иначе Вы можете столкнуться с тем, что Excel не будет отображать новую вкладку.
Чтобы MS Excel «увидел» и «понял», что за компонент мы добавили, нужно указать ссылку на него в корневом файле отношений, который лежит в папке _rels, и называется .rels
Он также имеет xml-формат, и для удобства можно отформатировать его (в VS Code для этого есть команда: Ctrl-Shift-P -> Format Document).
Добавляем элемент Relashionship, указав путь к customUI.xml, тип компонента, а также идентификатор (не имеет значения, какой именно. Главное, чтобы он был уникальным среди других элементов Relashionship):

Добавляю текст отношения для удобства копирования (чтобы парсер не «съел» URL, добавил пробел перед .com — не забудьте его убрать при копировании)
Теперь заархивируйте обратно все файлы, и верните исходное имя файла Sample.xlsm

Если всё было сделано правильно, то при открытии книги Вы увидите новую вкладку на ленте:

Однако при попытке запустить макрос HelloWorld Вы можете столкнуться с таким предупреждением:
Wrong number of arguments or invalid property assignment
Это связано с тем, что функция-коллбэк должна иметь определенную сигнатуру. Так, обработчик нажатия на кнопку button должен выглядеть следующим образом:

Добавьте аргумент «rc As IRibbonControl», и Вы увидите долгожданное приветствие:

Список сигнатур можно найти на сайте документации Microsoft
Теперь осталось лишь сохранить книгу с макросами как надстройку. В редакторе VBE выберите объект ThisWorkbook и установите свойство IsAddin в значение True.

Теперь нужно сохранить книгу в новом формате (Excel предупредит об этом, если Вы попытаетесь сохранить книгу нажатием Ctrl-S)

Теперь надстройку можно открыть, как обычную книгу Excel. Она не будет отображаться в отдельном окне, как книга, но её можно увидеть в Project Explorer’е редактора VBE:

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

. или через настройки Excel, в разделе Надстройки (Add-ins)

Готово! Теперь Вы можете использовать надстройку при работе с любым документом, а также легко делиться своими наработками с коллегами, просто пересылая файл надстройки.
P.S. В качестве бонуса приведу примеры использования различных элементов в Custom UI
toggleButton — кнопка, которая может быть в двух состояниях
splitButton — составной компонент из button или toggleButton и выпадающего меню
dropDown — выпадающее меню с заранее определённым набором элементов
comboBox — интерактивное поле ввода, которое может содержать заранее определённый набор элементов
dynamicMenu — выпадающий список, элементы которого определяются динамически в методе getContent
checkBox — чекбокс, который может быть в двух состояниях

Разметка и код VBA модуля ниже, также их можно найти на гитхабе
customUI.xml
<?xml version=»1.0″ encoding=»utf-8″?>
<tab label=»Sample Add-in» keytip=»XT»>
<button imageMso=»HappyFace» label=»Split Button» />
<button label=»Button 1″ onAction=»OnSplitButton1Click» />
<button label=»Button 2″ onAction=»OnSplitButton2Click» />
<toggleButton label=»Toggle Button» onAction=»OnToggleButtonClick» />
<dropDown label=»DropDown» onAction=»OnDropDownSelected» >
<comboBox label=»Combo Box» onChange=»OnComboBoxSelected» >
<dynamicMenu label=»Dynamic Menu» getContent=»GetMenuContent» />
<checkBox label=»Check Box» onAction=»OnCheckBoxToggled» />
VBA модуль SampleControls
Public Sub OnSplitButton1Click(rc As IRibbonControl)
MsgBox «Split button 1 was clicked»
Public Sub OnSplitButton2Click(rc As IRibbonControl)
MsgBox «Split button 2 was clicked»
Public Sub OnToggleButtonClick(rc As IRibbonControl, isButtonPressed As Boolean)
MsgBox «Toggle button was toggled, button now is » & IIf(isButtonPressed, «pressed», «not pressed»)
Public Sub OnDropDownSelected(rc As IRibbonControl, selectedItemId As String, selectedItemIndex As Integer)
MsgBox «DropDown was changed, selected item id is » & selectedItemId
Public Sub OnComboBoxSelected(rc As IRibbonControl, comboBoxValue As String)
MsgBox «Combo box was changed, value is » & comboBoxValue
Public Sub GetMenuContent(rc As IRibbonControl, ByRef returnedVal)
Dim xml As String
«<button but1″» imageMso=»»Help»» label=»»Help»» onAction=»»OnHelpPressed»»/>» & _
«<button but2″» imageMso=»»FindDialog»» label=»»Find»» onAction=»»OnFindPressed»»/>» & _
Public Sub OnCheckBoxToggled(rc As IRibbonControl, isButtonChecked As Boolean)
MsgBox «Check box was toggled, value is » & IIf(isButtonChecked, «checked», «not checked»)
Public Sub OnHelpPressed(rc As IRibbonControl)
MsgBox «Help button pressed»
Public Sub OnFindPressed(rc As IRibbonControl)
MsgBox «Find button pressed»
Более подробная информация о различных элементах Custom UI есть в документации:
P.P.S. Дополнительный бонус для тех кто дочитал до конца — горячие клавиши редактора VBE
Навигация по редактору
Ctrl-R — перейти в окно проектов (Project Explorer)
F4 — перейти к свойствам
Ctrl-G — перейти к Immediate window
F7 — перейти в окно редактора кода
Ctrl-Tab (Ctrl-Shift-Tab) — переключение между открытыми окнами модулей
Ctrl-F4 -закрыть текущий модуль
Alt-F11 — открыть редактор кода VBE
Редактирование и навигация по коду
Ctrl-Space — автодополнение
Ctrl-J — показать доступные варианты (IntelliSense)
Ctrl-I — показать информацию о методе (аргументах)
Shift-F2 — перейти к определению переменной/метода
F5 — запустить макрос/продолжить исполнение
F8 — шаг вперёд (с заходом во вложенные функции)
Shift-F8 — шаг вперёд (без захода вглубь)
F9 — установить/снять точку останова (breakpoint)
Shift-F9 — добавить наблюдателя (quick watch)
Ctrl-L — показать стек вызовов (кликабельный)

661 пост 14.8K подписчиков
Правила сообщества
2. Публиковать посты соответствующие тематике сообщества
3. Проявлять уважение к пользователям
4. Не допускается публикация постов с вопросами, ответы на которые легко найти с помощью любого поискового сайта.
По интересующим вопросам можно обратиться к автору поста схожей тематики, либо к пользователям в комментариях
Важно — сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.
Утверждения вроде «пост — отстой», это оскорбление автора и будет наказываться баном.

С утра уже с этим бьюсь. До момента сохранения как надстройки все работает — кнопочка нажимается, сообщение появляется. Как только сохранил как надстройку, подключил, выдает такое окно. В центре управления безопасностью все везде включено, виндовс 10, excel 2010.

Добрый день. Скажите, пожалуйста, это всё будет работать на 2007м экселе? Просто сделал всё как написано, но надстройка не появляется
Читать ещё на Пикабу

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


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


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

Установка рисунков в качестве маркеров позволяет разнообразить внешний вид документации, сделав её нагляднее. Установка смайлов (© http://www.kolobok.us/ ) сделана в качестве примера (помните про Aiwan то? Или забыли. ).
Для гармоничного отображения требуется проредить количество маркеров, в противном случае произойдёт наложение рисунков друг на друга. О прореживании писал ранее.

Заменить маркеры на рисунки, в данном случае они представлены смайлами, можно при помощи не сложного макроса
Sub Markers_Smiles()
ActiveSheet.ChartObjects(«Диаграмма 1»).Activate
For Each icell In [C2:C102]
ActiveChart.FullSeriesCollection(1).Points(icell.Row — 1).Select
‘ Убираю рамки вокруг маркеров
Selection.MarkerForegroundColorIndex = xlNone
‘ Установка типа маркера «Рисунок»
Selection.MarkerStyle = -4147
Selection.Format.Fill.UserPicture «D:\4.gif»
If icell.Value = 0 Then Selection.Format.Fill.UserPicture «D:\1.gif»
If icell.Value = 1 Then Selection.Format.Fill.UserPicture «D:\2.gif»
If icell.Value = 2 Then Selection.Format.Fill.UserPicture «D:\3.gif»
[C2:C102] — столбец с признаками маркера. Число элементов равно числу данных (Х или Y). Может как заполняться вручную, так и быть расчётным (см.рисунок ниже).
D:\1.gif . D:\4.gif — пути к рисункам.
Аналогично производится заполнение рисунками нескольких графиков на диаграмме

Sub Прореживание_маркеров()
‘ Активируем диаграмму
ActiveSheet.ChartObjects(«Диаграмма 1»).Activate
‘ Перебор по всем графикам диаграммы
For k = 1 To ActiveChart.FullSeriesCollection.Count
‘ Удаляем все маркеры на линии
For i = 1 To ActiveChart.SeriesCollection(k).Points.Count
ActiveChart.FullSeriesCollection(k).Points(i).Select
Selection.MarkerStyle = -4142
‘ Выставляем маркеры с требуемым шагом.
For i = 1 To ActiveChart.SeriesCollection(k).Points.Count Step 4
ActiveChart.FullSeriesCollection(k).Points(i).Select
With Selection
.MarkerStyle = 8
.MarkerSize = 15
Public Sub color_graph()
ActiveSheet.ChartObjects(«Диаграмма 1»).Activate
For k = 1 To ActiveChart.FullSeriesCollection.Count ‘ Перебор по всем графикам
For Each icell In [C2:C102]
ActiveChart.FullSeriesCollection(k).Points(icell.Row — 1).Select
Selection.MarkerStyle = -4147
Selection.Format.Fill.UserPicture «D:\4.gif»
If icell.Value = 0 Then Selection.Format.Fill.UserPicture «D:\1.gif»
If icell.Value = 1 Then Selection.Format.Fill.UserPicture «D:\2.gif»
If icell.Value = 2 Then Selection.Format.Fill.UserPicture «D:\3.gif»
Аналогично разным графикам одной диаграммы можно присвоить уникальные маркеры

Sub Markers()
ActiveSheet.ChartObjects(«Диаграмма 1»).Activate
For i = 1 To ActiveChart.FullSeriesCollection.Count ‘ Перебор по всем графикам
ActiveChart.FullSeriesCollection(i).Select
Selection.MarkerForegroundColorIndex = xlNone
Selection.MarkerStyle = -4147
If i = 1 Then Selection.Format.Fill.UserPicture «D:\1.gif»
If i = 2 Then Selection.Format.Fill.UserPicture «D:\2.gif»
If i = 3 Then Selection.Format.Fill.UserPicture «D:\3.gif»
If i = 4 Then Selection.Format.Fill.UserPicture «D:\4.gif»
If i = 5 Then Selection.Format.Fill.UserPicture «D:\5.gif»
Ну или просто разными штатными маркерами разные графики. Но в автоматическом режиме — очень сокращает время подготовки документации. Полезно при подготовке к печати в чёрно-белом варианте.

Sub Установка_разных_маркеров()
ActiveSheet.ChartObjects(«Диаграмма 1»).Activate
For i = 1 To ActiveChart.FullSeriesCollection.Count ‘ Перебор по всем графикам
ActiveChart.FullSeriesCollection(i).Select
Selection.Format.Line.ForeColor.RGB = RGB(0, 0, 0) ‘ Цвета линий и маркера
Selection.Format.Line.Weight = 0.75 ‘ Установка толщины линии
Selection.MarkerStyle = i ‘ Установка типа маркера
Selection.MarkerSize = 4 ‘ Установка размера маркера
Selection.Format.Fill.ForeColor.RGB = RGB(255, 255, 255) ‘ Установка заливки маркера
Можно ли это сделать без макросов? Несомненно. Долго и нудно кликать кнопочки.

Но как по мне — проще скопировать и немного поправить код простого макроса. А в остальном — ваш выбор.

Excel триальный
Немного отвлечённый пост о защите своей работы.
Итак, общеизвестны способы закрытия информации в Excel, а именно:
1. Защита листа/книги

Выбираем разрешения/допуски, вводим пароль, сохраняем файл.
Дополнительно для каждой ячейки можно указать защищается ли она или нет. По умолчанию — защищается.
2. Защита кода

Точно так же вводим пароль (с повторением), ок, сохраняем.
Но все эти способы не более чем игрушки, и вскрываются совершенно не сложно при наличии некоторых минимальных навыков и особенно при сохранении в *.xlsm (файл с поддержкой макросов). Сохраняйте в *.xlsb (двоичный код), если хотите хоть немного защитить свою работу.
Впрочем защита листа, даже без задания пароля, очень полезная вещь позволяющая ограничить вероятность порчи документа. Например если оставить без защиты (доступными для редактирования) только ячейки с исходными данными, то сам расчёт шаловливыми ручками испорчен не будет. Довольно часто пользуюсь.
Каким же образом можно ещё затруднить использование вашей работы, кроме как не давать её?
Ну для начала надо определиться что защищаем. Если это просто текст, и вы его кому то отдали, то забудьте о защите — он общедоступен. Но документ Excel это, прежде всего расчёты. Своей масштабируемостью они и ценны — при изменении исходных данных пересчёт произойдёт автоматически.
Этим можно воспользоваться выполнив передачу результатов расчёта в виде статических таблиц. Да, можно распечатать/сохранить в pdf, или банальным Ctrl+А / Ctrl+C / Ctrl+V /только значения/. А можно просто воспользоваться простым макросом:
‘ Замена всех формул на листе в значения
Sub Form_2_Dan()
Dim a As Integer
‘ Запрашиваем подтверждение
a = MsgBox(«Внимание!» & _
Chr(10) & «Вы точно хотите заменить все формулы на листе на значения?» & _
Chr(10) & «Это необратимо!», _
52, «Замена формул на значения.»)
‘ Если OK, то замену производим
If a = 6 Then
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
Расположение макроса — модуль.
Макрос сохраняется в личный набор/надстройку и кнопка запуска выводится на панель.
Внимание! Действие макроса необратимо!
Можно сделать «триальным» расчёт разместив в модулях листов вот такого вида макрос.
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
If Date >= #10/6/2022# Then ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
Application.ScreenUpdating = True
Т.е. после 10.06.2022 все расчёты с листа исчезнут. А цифры останутся.
Можно заменить проверку на заполнение ячейки, например проверить что в определённой ячейке записан автор труда «Вася Пупкин». 🙂 При смене которого всё превратится в набор цифр..
Естественно доступ к макросам должен быть закрыт/запаролен.
Ещё вариант — ввод пароля на саму книгу:
Private Sub Workbook_Open()
Dim i&, n&, P As Variant
Application.ScreenUpdating = False
If Date >= #1/2/2022# Then
For i = 1 To Sheets.Count
Sheets(i).Activate
Sheets(i).Protect «1234»
P = InputBox(«Время использования книги истекло, для продолжения введите пароль», «ВВОД ПАРОЛЯ»)
If P = «°0176» Then
For i = 1 To Sheets.Count
Sheets(i).Activate
Sheets(i).Unprotect «1234»
If n = 0 Then
Application.DisplayAlerts = False
ThisWorkbook.Close
Application.DisplayAlerts = True
MsgBox «Пароль не верный, у вас еще » & n & » попытки»
Application.ScreenUpdating = True
Расположение макроса — «Эта книга».
#1/2/2022# — дата с которой будет запрашиваться пароль
«°0176» – правильный пароль

И при открытии файл будет встречать весёлым окошком:

Естественно можно открыть файл без выполнения макросов, но если расчёт в экселе построен на использовании макросов, то цель достигнута — расчёт производиться не будет.
И да, это всё игрушки — серьёзные дяденьки с тётеньками при необходимости поломают сие поделия, и узнают как вы определяли дискриминант. (0_о). Даже если Вы применили обфускацию кода или перенос кода в dll.

Построение графиков
Сегодня разберём задачку, которая вставала перед каждым пользователем Excel — необходимость построить график функции.

Любой, кто решал эту задачку — действовал следующим способом:
1. Создаётся столбец Х;
2. Создаётся столбец Y, котором происходит расчёт согласно заданной функции;
3. Выделяются два созданных столбца и вставляется график.
Но это просто и скучно. Есть другой способ. Построить график непосредственно из макроса.
Начнём с простого — у нас есть набор точек соответствия X и Y.
Sub Построй_график_по_точкам()
Dim MyChart As Chart
Set MyChart = ActiveSheet.Shapes.AddChart2.Chart
With MyChart
.SeriesCollection.NewSeries
.SeriesCollection(1).Name = «xlXYScatterSmoothNoMarkers»
.SeriesCollection(1).XValues = Array(0#, 0.5, 1#, 1.5, 2#, 2.5, 3#, 3.5, 4#, 4.5, 5#)
.SeriesCollection(1).Values = Array(0#, 0.4794, 0.8415, 0.9975, 0.9093, 0.5985, 0.1411, -0.3508, -0.7568, -0.9775, -0.9589)
.ChartType = xlXYScatterLines ‘ Соединение точек прямыми
.SetElement msoElementLegendNone
Другие варианты отображения линии графика:
.ChartType = xlXYScatterLinesNoMarkers ‘ Соединение точек прямыми без маркеров
.ChartType = xlXYScatterSmoothNoMarkers ‘ Сглаженная линия
Более подробно о типах — тут
Сборка Array(. ) может быть выполнена с использованием программы, которую я выкладывал в 7-й части темы про оцифровку, ну или заполнить руками.
Как не трудно догадаться — вовсе не обязательно иметь готовый набор данных.
Рассмотрим ситуацию, когда требуется построить два графика на одной диаграмме.
Для упрощения восприятия использую две простые функции линий y1 = x — 20, y2 = x + 20.
Sub Создать_диаграмму()
Dim MyChart As Chart
Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _
Ymin As Single, Ymax As Single, dY As Single
Dim X() As Single
Dim Y() As Single
Dim Yp() As Single
Xmin = 0: Xmax = 300: dX = 20 ‘ Сие больше нужно для осей и оформления
Ymin = 0: Ymax = 160: dY = 20
ReDim X(0 To Xmax — Xmin): ReDim Y(0 To Xmax — Xmin, 1 To 2)
ReDim Yp(0 To Xmax — Xmin)
For i = 0 To Xmax — Xmin Step 1
X(i) = Xmin + i
‘ Заполнение данных первого графика
Y(i, 1) = X(i) — 20
‘ Заполнение данных второго графика
Y(i, 2) = X(i) + 20
‘ создадим новую диаграмму и зададим ей габаириты
Set MyChart = ActiveSheet.Shapes.AddChart2(, , , , 300, 200).Chart
For i = 1 To 2
For j = 0 To Xmax — Xmin Step 1
With MyChart
.SeriesCollection.NewSeries
.SeriesCollection(i).XValues = X
.SeriesCollection(i).Values = Yp
.ChartType = xlXYScatterSmoothNoMarkers
При задании новой диаграммы можно задать в том числе и положение диаграммы на листе
AddChart2(Стиль,XlChartType,слева,сверху,ширина,высота,NewLayout)
В итоге получим вот такую диаграмму:

В дальнейшем можно обработать её как обычную — задать цвета, толщины и т.д. Но можно это сразу поручить нашему макросу:
Sub Создать_диаграмму()
Dim MyChart As Chart
Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _
Ymin As Single, Ymax As Single, dY As Single
Dim X() As Single
Dim Y() As Single
Dim Yp() As Single
Xmin = 0: Xmax = 300: dX = 20 ‘ Сие больше нужно для осей и оформления
Ymin = 0: Ymax = 340: dY = 20
ReDim X(0 To Xmax — Xmin): ReDim Y(0 To Xmax — Xmin, 1 To 2)
ReDim Yp(0 To Xmax — Xmin)
For i = 0 To Xmax — Xmin Step 1
X(i) = Xmin + i
Y(i, 1) = X(i) — 20
Y(i, 2) = X(i) + 20
Set MyChart = ActiveSheet.Shapes.AddChart2(, , 0, 0, 400, 230).Chart
For i = 1 To 2
For j = 0 To Xmax — Xmin Step 1
With MyChart
.SeriesCollection.NewSeries
.SeriesCollection(i).XValues = X
.SeriesCollection(i).Values = Yp
.ChartType = xlXYScatterSmoothNoMarkers
With MyChart
.SetElement (msoElementPrimaryCategoryGridLinesMajor)
‘ Включаю отображение названия осей
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Text = «Расход Go т/ч»
.Axes(xlValue, xlPrimary).AxisTitle.Text = «Давление кгс/кв.см.»
‘ Выключаю отображение легенды
.SetElement (msoElementLegendNone)
‘ Выключаю отображения заголовка диаграммы
.SetElement (msoElementChartTitleNone)
‘ Выставляем параметры осей
.Axes(xlCategory).MinimumScale = Xmin
.Axes(xlCategory).MaximumScale = Xmax
.Axes(xlCategory).MajorUnit = dX
.Axes(xlValue).MinimumScale = Ymin
.Axes(xlValue).MaximumScale = Ymax
.Axes(xlValue).MajorUnit = dY
‘ Оформление гризонтальной оси
MyChart.Axes(xlCategory).Select
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Visible = msoTrue
.Weight = 1.25
‘ Оформление вертикальной оси
MyChart.Axes(xlValue).Select
With Selection.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.ForeColor.TintAndShade = 0
.ForeColor.Brightness = 0
.Transparency = 0
.Visible = msoTrue
.Weight = 1.25
‘ Оформление горизонтальной сетки
MyChart.Axes(xlValue).MajorGridlines.Select
With Selection.Format.Line
.Visible = msoTrue
.DashStyle = msoLineDash
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 176, 240)
.Transparency = 0
‘ Оформление вертикальной сетки
MyChart.Axes(xlCategory).MajorGridlines.Select
With Selection.Format.Line
.Visible = msoTrue
.DashStyle = msoLineDash
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 176, 240)
.Transparency = 0
По итогу диаграмма будет выглядеть так:

Как не трудно понять, данных, по которым построена диаграмма, на листе нет. И после удаления макроса останется только итоговый результат.
Кому то это покажется слишком сложным, однако открою маленький секрет — очень редкие люди пишут макрос с нуля. В 90% достаточно иметь готовый макрос (см листинг выше), заменить в нём пару строк (сменить функции, изменить диапазоны. ) и всё. По итогу построение занимает меньше времени чем построение классическим способом.
Такое построение позволит извлечь данные промежуточного расчёта, построить массово однотипные диаграммы и. и дальнейшее применение зависит только от фантазии.
Ну и всегда есть вариант удивить преподавателя (0_о).

Excel. Долгая дорога оцифровки. Часть 9. Оформление графиков, или отображение поиска решения
Итак, мы с вами имели рисунок на бумажке, перевели его в цифру (сняли точки), написали макрос, позволяющий определить значение Y по известным аргументам. В некоторых случаях этого достаточно, однако не всегда. Например для отчёта требуется указать поиск решения в графическом виде, поскольку заказчика «я фсио оцифровал! Вы не пониаити, у меня макрос!» не устраивает. Особенно когда речь идёт о больших деньгах, и проводятся гарантийные испытания с определением поправочных коэффициентов (например.). Или преподаватель в институте будет приятно удивлён красивому графику в курсовом проекте/дипломе.
Итак, по сути потребуется решить два вопроса:
1. Построить ход поиска с помощью стрелки/стрелок.
2. Совместить построенный график с изначальным рисунком.
Т.е. получить что то похожее на вот это:

На самом деле нет принципиальной разницы в начале построить поиск решения или в начале совместить рисунок с диаграммой. Но начну с построения, т.к. при этом меньше мусора на рисунках.
Часть 1. Построение поиска решения.
Итак, у нас есть заданные аргументы (G2, t1в) и результат расчёта Р2. На графике сие будет выглядеть как одна точка с координатами X = G2 = 200 (в нашем примере) и Y = Р2 = 0,065
Существуют минимум три метода построения стрелки поиска:
Вариант 1. Для вертикальной и горизонтальной части строим независимые линии.

После построения настраиваем цвета, указываем наличие стрелки, и т.д.
Для вертикальной линии второй точкой указывается точка с равным значением по Х и минимумом по бумажному графику Y.
Для горизонтальной линии второй точкой указывается точка с равным значением по Y и минимумом по бумажному графику X.
Минимумы и максимумы диаграммы выставляются равными минимумам и максимумам бумажного рисунка.
Хоть данный вариант и кажется наиболее раздутым, но на практике, когда линий поиска десяток, он наиболее удобен и понятен.
Вариант 2. Единая линия поиска.

Выставление значений дополнительных точек, и значений осей аналогично Варианту 1.
Вариант 3. Использование погрешностей для указания поиска решения.

Если точка одна, то для отображения линий погрешности необходимо перейти в настройки предела погрешности по Х и по Y поочерёдно и.

— величина погрешности «пользовательская».
В качестве отрицательной величины погрешности указываем соответственно значение X и Y

Если есть желание получить стрелку направленную к оси Y, а ось Х начинается не с 0 (в нашем случае с 2-ти), то потребуется сделать ячейку рассчитывающую смещение относительно 0.
В нашем примере сделаем такое и для X и Y:
ось Х сдвинута на 20. Соответственно имеем ячейку Хзаданное — Хсмещения = 200 — 20
ось Y сдвинута на 0,02 Соответственно имеем ячейку Yзаданное — Yсмещения
Это значения не статичны, т.е. они пересчитаются при изменении исходных данных.
При указании отображения погрешностей ссылаемся на данные ячейки.

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

Однако можно сделать выноску для той самой, единственной точки.
Результаты всех трёх способов не сильно отличаются:

Часть 2. Совмещение построенного графика с изначальным рисунком.
И опять есть минимум три варианта.
Вариант 1. Использование рисунка в качестве подложки под областью построения (то, что расположено внутри границ осей). Для этого рисунок сначала подготавливается (обрезается по размерам построения, при этом подписи осей оказываются обрезанными), а затем вставляется по пути: Формат области построения – Заливка – Рисунки и текстура – Файл / из буфера обмена;
Вариант 2. Использование рисунка в качестве подложки области диаграммы (вкладка Формат области диаграммы – Заливка – Рисунки и текстура — Файл) вставляется рисунок графика (предварительно подготовленный и очищенный. Необходимо также учитывать, что потребуется некоторая ширина полей для выставления подписей). Совмещаются границы графика Excel с границами графика рисунка перетягиванием за маркеры границы графика (перемещение указал стрелками).

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

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

при необходимости можно построить дополнительную линию. В качестве примера построена дополнительная кривая при 40°С при помощи созданной пользовательской функции при заданной температуре 40°С и переменной влажности. Аналогично построена дополнительная линия на первом рисунке

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

Отдельно стоят диаграммы состоящие из расположенных рядом двух и более диаграмм.
Их оформление, опять же, может быть реализовано тремя способами.
Способ 1 — применение третьего варианта наложения диаграмм на рисунок (описано выше). Т.е. строим два независимых графика для левой и правой части, делаем их прозрачными и накладываем на рисунок.
Способ 2 — применение первого варианта, наложение графика на область построения (описано выше). Т.е. строим два независимых графика для левой и правой части, накладываем области построения и размещаем взаимно друг другу до совпадения минимума и максимума.
Способ 3. — пригоден только для расположенных рядом двух диаграмм. Данный способ позволяет избавится от стыка, неизбежно возникающего при первых двух способах. Основано как правило на применении второго варианта описанного выше, а именно использовании рисунка как подложки под диаграммой.
Рассмотрим один из вариантов построения стрелки на диаграмме, состоящей из двух диаграмм, при этом ширина клеток и величина шага для правого и левого графика разная.

Для наглядности оси были ярко выражены и отодвинуты относительно области построения, а графики разнесены по цветам.
Шаг 1. Построение левого графика (синий график, синяя ось, синие данные).
1. Построить точечный график по исходным данным, причём заложить небольшой перехлёст по Х (установлено 80 вместо 70-ти по рисунку);
2. Сделать подложку под диаграмму (используется весь рисунок, без обрезок или разделения на две части);
3. Растянуть область построения на рисунок;
4. Задать значения оси (диапазон) Y в соответствии с оцифровкой;
5. Задать значения оси (диапазон) Х таким образом, чтобы Хмин было равно минимальному значению на рисунке (30), а Хмакс подобрать таким образом, чтобы совпали значения рисок (40=40, 50=50, 60=60, 70=70).
Шаг 2. Построение правого графика (красный график, красный ось, красный данные).
1. Построить точечный график по исходным данным, причём минимум Х заложить равным минимуму по второй оси (0);
2. Указать построение по вспомогательным осям;
3. Задать значения вспомогательной оси (диапазон) Y в соответствии с оцифровкой;
4. Задать значения оси (диапазон) Х таким образом, чтобы Хмакс было равно максимальному значению по второй оси рисунка, а Хмин подбрать таким образом, чтобы начало второго графика легло на минимум второй оси Х рисунка.
Шаг 3. Убрать отображение подписей осей, сетки и т.д. Настроить цвета линий.
Для кого то это покажется элементарным, но я на своей практике не один раз ломал голову как выполнить графическое оформление поиска решения. Базовыми знаниями поделился. Всё дальнейшее зависит от вас. Будут вопросы — помогу по мере сил.
Пожалуй на этом закончим и серию Excel. Долгая дорога оцифровки. Всё обещанное показал, а именно:
9. Отображение поиска решения (данный пост).

Excel. Долгая дорога оцифровки. Часть 7. Автоматическое создание макроса функции с использованием кусочной интерполяции
По аналогии с Excel. Долгая дорога оцифровки. Часть 4. Макрос по созданию макросов апроксимации простых графиков полиномом и Excel. Долгая дорога оцифровки. Часть 6. Кусочная интерполяция не сложно выполняется макрос по созданию макросов оцифровки простых графиков с использованием кусочной интерполяции.

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

Отличием от вводимых ранее данных является требование указания критериев через точку с запятой.
Основное нововведение — определение количества графиков. Если вспомните ещё в Excel. Долгая дорога оцифровки. Часть 2. Забираем данные с листа я писал, что что «снятие точек производить от меньшего Х к большему. При наличии диаграммы зависимости от двух аргументов типаY(X1, X2) начиная с графика меньшего Х2. С обязательным условием — каждая следующая линия должна начинаться с Х меньшего, чем закончилась предыдущая.«. И теперь можно этим воспользоваться — определить количество переходов на новую линию по уменьшению Х по сравнению с предыдущим.
For i = 2 To xVal.Count
If i = xVal.Count Then
Nkon(Ndiap) = i
If xVal.Rows(i) < xVal.Rows(i — 1) Then
Nkon(Ndiap) = i — 1
Ndiap = Ndiap + 1
Nna4(Ndiap) = i
Ну а дальше просто — перебираем поочерёдно все диапазоны, для каждого определяем уравнение апроксимации.
Результирующий макрос будет иметь вид:
‘ Поправки Сербия Панчево Страница 34 из 77 Нижний рисунок
Public Function ТЭХ_ПТ80_Рис3(ByRef Go As Single, ByRef CkH As Single) As Single
Dim krit_kriv As Variant
krit_kriv = array(2.96,3.06,3.15)
Dim kriv As Variant
kriv = Array(-0.00271242 * Go + 0.100817, _
-0.00252906 * Go + 0.230858, _
0.000276671 * Go ^ 2 -0.203078 * Go + 31.5862)
ТЭХ_ПТ80_Рис3= kus_interp(krit_kriv, kriv, CkH, 2)
End Function
Не забываем удалять кавычки в начале и конце макроса при копировании в модуль.
Давайте так, чтобы не утомлять читателя выкопировкой текстовок макросов — выкладываю сие для свободной скачки/использования/модернизации
Если возникнут вопросы как сие работает, распишу. Если у кого то что то не заработает — обращайтесь, посмотрю.
В программе есть не описанный мной макрос кубического сплайна, но т.к. автор не я, и макрос выложен в общественный доступ, для ознакомления с остальными сплайнами переходите по приведённой в макросе ссылке

За сим тему с оцифровкой считаю закрытой. Все базовые функции показал. С помощью данных функций, а так-же их комбинаций и расширений можно сделать автоматическую оцифровку совершенно разнообразных конфигураций диаграмм.
Например диаграмма с несколькими независимыми графиками типа такой. Можно либо сделать 3 независимых макроса, либо один с выбором графика.

С помощью автоматического создания макросов

Позволит получить (текстовка от графика отличного от представленного выше рисунка)
‘ ТЭХ ПТ80 Рис.3 Давление в отборах при конденсационном режиме [МПа]
Public Function ТЭХ_ПТ80_Рис3(ByRef Go As Single, ByRef Название_графика As Variant) As Variant
Dim krit_graph As Variant
krit_graph = array(1,2,3)
Select Case Название_графика
Case krit_graph(0)
ТЭХ_ПТ80_Рис3 = -0.0027124 * Go ^ 1 + 0.10082
Case krit_graph(1)
ТЭХ_ПТ80_Рис3 = -0.0025397 * Go ^ 1 + 0.23509
Case krit_graph(2)
ТЭХ_ПТ80_Рис3 = -0.0026659 * Go ^ 1 + 0.4529
ТЭХ_ПТ80_Рис3 = 999999999999999
End Function
При желании указывать название графика правится krit_graph = array(«Go»,»Qo»,»qt»).
Ну и гораздо более сложноподчинённые, например что реализовано у меня:
Создание макроса для варианта когда критерий зависит от своего критерия

Диаграммы режимов ПТ типа ПТ-80

Диаграммы режимов типа Т-250

Нормативной температуры сетевого подогревателя.

Все вышеперечисленные сложные диаграммы можно разбить на простые, и сделать в ручном режиме с помощью тех программ создания макросов что я дал. А можно потратить пару вечеров и создать удобный инструмент под свои задачи.
Из того на что стоит обратить внимание, или маленькие лайфхаки:
1. Не всегда есть разметка осей. Например на диаграмме на последнем скрине вертикальная ось не размечена. Но она в данном случае не нужно. Важно иметь одинаковое значение для левого и правого графиков. Как правило я принимаю в качестве минимального значения оси — 0, в качестве максимального — число клеток (например 12-ть).
2. Внимание! Ось Х не обязательно горизонтальная при «снятии точек»! Например на диаграмме на последнем скрине для правого графика удобно взять в качестве оси Х вертикальную ось а в качестве Y — горизонтальную. Тогда результат обработки левой номограммы будет сразу выступать в качестве аргумента для правой номограммы.
3. Есть варианты оцифровки, когда лучше привязываться не к значениям осей, а к клеточкам 🙂 Да, звучит дико, но иногда проще внести пересчёт внутри макроса, чем реализовать оцифровку по данным осей. Например диаграмма ниже — обратите внимание, что вертикальная ось не обозначена, зато горизонтальная в левой диаграмме разбита на 3 участка с разным масштабом.

Упд. Вспомнил ещё про важную часть — обратные функции. Т.е. есть макрос (готовый!), который по известным Х1, Х2. находит Y. Иногда требуется с использованием данного макроса и известных Y и X1 найти X2. Но об этом в следующий раз. А то и так пост разросся.

