Знакомство с понятиями модуль, процедура, форма в VBA Excel. Модули разных типов. Создание пользовательской формы. Встроенные диалоговые окна.
Самый простой способ перейти в редактор VBA — при активном окне программы Excel нажать сочетание клавиш Alt+F11 (здесь используется левая клавиша Alt). Это сочетание работает во всех версиях программы. Если в открывшемся окне нет слева окна проводника «Project-VBAProject», вызовите его через главное меню, выбрав «View» — «Project Explorer». Внутренние окна в редакторе VBA можно перетаскивать и размещать в других местах главного окна.
Модули рабочей книги Excel представляют из себя файлы, предназначенные для создания и хранения программного кода в виде процедур (подпрограмм, функций и пользовательских свойств). Модули бывают нескольких типов: стандартные модули и модули классов (рабочих книг, рабочих листов, диаграмм, пользовательских форм).
Стандартный модуль
Стандартный модуль представляет из себя отдельный файл, встроенный в рабочую книгу Excel и принадлежащий всему проекту VBA (VBAProject) со всеми его объектами (ThisWorkbook, Worksheets, Charts, UserForms). Стандартный модуль можно экспортировать, импортировать или удалить. Его публичные процедуры с уникальными именами доступны во всех остальных модулях рабочей книги без дополнительной адресации. Для публичных процедур с неуникальными именами требуется указание имени модуля, из которого они вызываются.
Создание стандартного модуля:
- Откройте рабочую книгу Excel, в которую планируете добавить новый стандартный модуль, или создайте новую книгу в учебных целях.
- Откройте редактор VBA сочетанием клавиш Alt+F11.
- В окне редактора VBA нажмите на пункт меню «Insert» и в открывшемся списке выберите «Module».
Таким образом, вы создали новый стандартный модуль. В проводнике справа появилась папка «Modules» и в ней файл «Module1» (или «Module» с другим номером, если в вашей книге модули уже были). Такие же модули создаются при записи макросов встроенным рекордером.
Открыть или перейти в окно открытого стандартного модуля можно, дважды кликнув по его имени в проводнике, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, все уже открытые модули доступны во вкладке «Window» главного меню.
Важное примечание: в Excel 2007-2016 книги с программными модулями сохраняются как «Книга Excel с поддержкой макросов (.xlsm)». Если вы добавили модуль в книгу «Книга Excel (.xlsx)», то, при ее сохранении или закрытии, программа Excel предложит сохранить ее как «Книга Excel с поддержкой макросов (.xlsm)», иначе изменения (созданные или импортированные модули) не сохранятся.
Модули классов
К модулям классов относятся модули книг, рабочих листов, диаграмм и пользовательских форм.
Модуль книги
Модуль книги принадлежит только объекту Workbook (Рабочая книга). Открыть или перейти в окно открытого модуля книги можно, дважды кликнув в проводнике на пункте «ЭтаКнига», или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Модуль листа
Модуль листа принадлежит только объекту Worksheet (Рабочий лист). Открыть модуль листа можно, дважды кликнув в проводнике по его имени, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, перейти в модуль листа можно из рабочей книги, кликнув правой кнопкой мыши по ярлыку этого листа и выбрав в контекстном меню «Просмотреть код». Открытый модуль доступен во вкладке «Window» главного меню.
Модуль диаграммы
Модуль диаграммы принадлежит только объекту Chart (Диаграмма, вынесенная на отдельный лист рабочей книги). Открыть его можно так же, как и модуль рабочего листа.
Модуль формы
Модуль формы принадлежит только объекту UserForm (Пользовательская форма). Откройте редактор VBA сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert». В открывшемся списке выберите «UserForm». Таким образом вы создадите новую пользовательскую форму «UserForm1». В проводнике справа появилась папка «Forms» и в ней файл «UserForm1». Перейти в модуль формы можно, дважды кликнув по самой форме, или кликнув по имени формы в проводнике правой кнопкой мыши и выбрав в контекстном меню «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Стандартных модулей в одной книге можно создать любое количество, модуль книги только один, модулей листов или форм только по одному для каждого экземпляра листа или формы.
Между открытыми окнами форм и модулей можно переходить, нажав в главном меню вкладку «Window», где перечислены все открытые модули и формы (активный объект отмечен галочкой).
Процедура
Процедуры VBA Excel, размещаемые в любом модуле, подразделяются на 3 типа:
- Sub (подпрограмма),
- Function (функция),
- Property (пользовательские свойства).
Главное отличие функции от подпрограммы заключается в том, что функция возвращает результат вычислений, а подпрограмма — нет. Процедура Property предназначена для создания пользовательских свойств и управления ими (используется не часто).
В редакторе VBA Excel перейдите в стандартный модуль и нажмите на пункт меню «Insert». В открывшемся списке выберите «Procedure…». Появится окно с предложением ввести название процедуры, выбрать тип и зону видимости. Создайте пару процедур с разной зоной видимости, пусть одна будет Sub, а другая — Function. В промежутке между началом и концом процедуры пишется программный код.
Private Sub Test() ‘Здесь пишется программный код End Sub |
Зона видимости Private означает, что эту процедуру можно вызвать только из того же модуля, в котором она записана.
Зона видимости Public означает, что эту процедуру можно вызвать не только из того же модуля, в котором она записана, но и из любого другого модуля этой книги и даже из модулей других книг.
Публичная процедура (Public) может быть записана и без явного указания видимости — зона видимости Public предполагается по умолчанию.
Первая запись:
и вторая запись:
равнозначны.
Форма
Формы в VBA Excel используются для создания диалоговых окон. Процедура создания новой формы описана в параграфе «Модуль формы». Обычно, вместе с новой формой открывается панель «ToolBox» с элементами управления, которые можно добавлять на форму. Если вы закрыли панель с элементами управлениями, отобразить ее снова можно через главное меню, выбрав «View» — «ToolBox».
Стоит добавить, что в VBA Excel есть два встроенных диалоговых окна — MsgBox и InputBox.
MsgBox — это окно для вывода информации с возвратом числового значения кнопки, нажатой пользователем.
InputBox — это окно с приглашением пользователя ввести какую-либо текстовую информацию. Есть еще расширенная версия этого окна — Application.InputBox, которую можно использовать для записи адреса выделяемого диапазона ячеек и не только для этого.
Даже если вы не умеете программировать, то существует множество мест (книги, сайты, форумы), где можно найти готовый код макросов на 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):
В этом окне отображаются все открытые книги и запущенные надстройки 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
- после названия функции в скобках указываются её аргументы
- в теле функции производятся необходимые вычисления и затем результат присваивается переменной с названием функции
Также обратите внимание, что эту функцию не нужно, да и невозможно запустить как предыдущий макрос-процедуру через диалоговое окно Макросы и кнопку Выполнить. Такую макрофункцию нужно использовать как стандартную функцию листа (СУММ, ЕСЛИ, ВПР…), т.е. просто ввести в любую ячейку, указав в качестве аргумента значение суммы с НДС:
… или ввести через стандартное диалоговое окно вставки функции (кнопка 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 в левом верхнем углу добавьте заготовку кода для новой вкладки:
- В пустые кавычки нужно вписать id нашей вкладки и группы (любые уникальные идентификаторы), а в label — названия нашей вкладки и группы кнопок на ней:
- При помощи кнопки button на панели слева добавляем заготовку кода для кнопки и дописываем к ней теги:
— label — это текст на кнопке
— imageMso — это условное название изображения на кнопке. Я использовал иконку с красной кнопкой, которая имеет название AnimationCustomAddExitDialog. Названия всех доступных кнопок (а их несколько сотен!) можно найти на большом количестве сайтов в интернете, если искать по ключевым словам «imageMso». Для начала можно сходить сюда.
— onAction — это имя процедуры обратного вызова — специального короткого макроса, который будет запускать наш основной макрос FormulasToValues. Назвать эту процедуру можно как угодно. Мы добавим её чуть позже. - Проверить правильность всего сделанного можно с помощью кнопки с зеленой галочкой сверху на панели инструментов. Там же рядом нажмите на кнопку с дискетой для сохранения всех изменений.
- Закрываем Ribbon XML Editor
- Открываем Excel, заходим в редактор Visual Basic и добавляем к нашему макросу процедуру обратного вызова KillFormulas, чтобы она запускала наш основной макрос замены формул на значения.
- Сохраняем внесенные изменения и, вернувшись в Excel проверяем результат:
Вот и всё — надстройка готова к использованию. Наполните её своими процедурами и функциями, добавьте красивые кнопки — и использовать макросы в работе станет намного проще.
Ссылки по теме
- Что такое макросы, как их использовать в работе, где взять код макросов на Visual Basic.
- Как сделать заставку при открытии книги в Excel
- Что такое Личная Книга Макросов и как её использовать
Содержание
- Как в excel поставить модуль
- Функции программы Microsoft Excel: расчет модуля
- Функция ABS
- Суммирование по модулю в Excel
- Вариант 1 — Использование вспомогательного столбца
- Вариант 2 — Использование функции СУММ в формуле массива или СУММПРОИЗВ
- Вариант 3 — Использование СУММЕСЛИ
- Как сделать, чтобы Excel считал по модулю?
- Модуль числа
- Как вставить код в модуль листа? (Настройки Excel)
- Как создать модуль для вывода данных на Excel в приложениях WinForms?
- Функция «Модуль» в Microsoft Excel
- Функция ABS
Как в excel поставить модуль
Функции программы Microsoft Excel: расчет модуля
Смотрите такжеTerion References Стиль ссылок R1C1добавляю ABS соNortonЕсли ячейка A1= СУММ(<60,-120>*<1,-1>) = СУММ(<60,120>) понадобится просуммировать большое
Использовать формулу массива или же как и
Функция ABS
A1:A8180 диапазоне. Этот вопрос вниз до конца кнопку, размещенную справа положительное значение числаМодуль – это абсолютная: и более того,Добавляешь простанство имен
vsem medved скобками и нажимаю: Спасибо, Гуру! содержит -16, то: = 180 количество значений, скоростьСУММПРОИЗВ функция
– это полноценная: довольно регулярно всплывает таблицы. Таким образом, от формы ввода. 8.
положительная величина любого даже с этимC# using Excel: спасибо огромное господа. волшебную комбинацию ctrl+shift+enter,vsem medvedКОРЕНЬ(ABS(A1)) равняется 4Думаю, что теперь вы работы станет заметно(SUMPRODUCT) для решенияСУММ таблица данных. Поэтому= 10 + 10
на форумах, и в данном столбцеПосле этого, окно сворачивается,Существует ещё один способ числа. Даже у он может продолжать = Microsoft.Office.Interop.Excel;Пример работы:
жить стало легче но результата нету.: Как органичнее преобразоватьAdm123 знаете все основные замедляться. такой задачи –(SUM). Но есть при добавлении формулы + 20 + многие пользователи часто в ячейках появятся
а вам нужно расчета модуля. Он отрицательного числа модуль висеть в памяти.чтобыC# Excel.Application xlAppРусланв какой момент формулу?: =ABS(чего-то) способы подсчета суммы
Думаю, что данный подход очень грубый подход! и существенные отличия,=ABS(A2) 20 + 30
испытывают большие трудности значение по модулю кликнуть по ячейке, подойдет для тех будет всегда положительным.
эксель в итоге = new Excel.Application();: Подскажите пожалуйста как нужно нажимать ctrl+shift+enter?Сейчас такая ситуация:Hokmun™ абсолютных значений в самый удобный изФункция например,в ячейку + 40 + при работе с исходных данных. где содержится число, пользователей, которые не Давайте выясним, как
отпустило, надо создавать Excel.Workbook xlWorkBook = вставить код вкстати можно лизначение ячейки делится: ABS Excel. Если вы всех ранее перечисленных.СУММПРОМЕЖУТОЧНЫЕ.ИТОГИ
В2 50 = 180 этим, казалось бы,Важно заметить, что некоторые от которого хотите привыкли держать в рассчитать величину модуля отдельные объекты на xlApp.Workbooks.Add(misValue); Excel.Worksheet xlWorkSheet модуль листа (куда изменить в настройках
на максимальное значение
Суммирование по модулю в Excel
Возвращает модуль (абсолютную используете другой подход С помощью функциив формуле массива:(SUBTOTAL) полностью игнорирует, Excel расширил таблицуНа мой взгляд, лучший простым действием. пользователи пытаются записать рассчитать модуль. После голове различные формулы. в приложении Microsoft каждый чих, вплоть
= (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlApp.Visible заходить надо в excel вид названия из выбранного диапазона величину) числа. Абсолютная для суммирования чиселСУММЕСЛИ=СУММ(ABS(A2:A8))
числа, которые были
и автоматически заполнил способ подсчета суммыК сожалению, в Microsoft модуль, как это того, как число Кликаем по ячейке,
Excel. до объекта диапазона = true; //Заносим Excel) ячеек на классические
=R[-1]C/МАКС(R[-3]C[-2]:R[-2]C[-2]) величина числа - по модулю, поделитесь(SUMIF) значения делятся=SUM(ABS(A2:A8)) скрыты вручную или все ячейки в
абсолютных значений в Excel не существует принято в математике, добавлено, опять жмите в которой хотим,
Вариант 1 — Использование вспомогательного столбца
Скачать последнюю версию ячеек данные в ячейкувот код который A1, B2 иа очень хочется это число без им в комментариях.
При вводе формулы массива с помощью фильтрации. столбце. Далее я Excel – использовать встроенной функции способной то есть |(число)|, на кнопку справа чтобы хранился результат. Excelдобавьте ссылку на 1,1 xlWorkSheet = нужно вставить: т.д. С R[]C[] и нужно, чтобы
с положительными и не забудьте нажать Есть еще несколько перешел на вкладку вспомогательный столбец. В выполнить суммирование по например |-48|. Но, от поля ввода. Жмем на кнопкуДля расчета величины модуля нужную бибилиотеку экселя (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Cells[1, 1]Private Sub Worksheet_BeforeDoubleClick(ByVal я совсем не значение ячейки делилосьСинтаксисУрок подготовлен для Вас отрицательными числами иCtrl+Shift+Enter отличий, но этоКонструктор ячейку модулю, поэтому Вы в ответ ониСнова запускается окно с «Вставить функцию», размещенную в приложении Excel
в referencies = «hello world»; Target As Range, понимаю логики наименования на максимальное поABS(число) командой сайта office-guru.ru суммируются. Ноль по. мало относится к(Design), которая находитсяB2 должны немного поработать, получают ошибку, так аргументами функции. Как слева от строки существует специальная функцияЯ не работал //завершаем работу xlWorkBook.Close(false, Cancel As Boolean) ячеек модулю значение из
Число — этоИсточник: https://colinlegg.wordpress.com/2013/06/03/calculate-the-absolute-sum-in-excel/ понятным причинам игнорируется.Формула с теме данной статьи. в группе вкладоквводим формулу: чтобы получить правильный как Excel не видим, поле «Число» формул.
под названием ABS. с Екселем и null, null); xlApp.Quit();Target = Format(Time,Serge выбранного диапазона действительное число, модуль
Вариант 2 — Использование функции СУММ в формуле массива или СУММПРОИЗВ
Перевел: Антон Андронов Затем мы простоСУММПРОЗВСпособ со вспомогательным столбцомРабота с таблицами
=ABS(A2) ответ. понимает подобный синтаксис.
заполнено значением. Жмем
Запускается окно Мастера функций.
Синтаксис этой функции хотелось бы уточнить:planar «Long Time»)
:Владимир которого требуется найти.
Автор: Антон Андронов
вычитаем из положительной
: хорош тем, что(Table tools), иЗатем протянем ее доВот наши данные:Как видим, в расчете на кнопку «OK». В списке, который очень простой: «ABS(число)». А если было: Маленькая поправочка. ПриEnd SubSerge: ..И что, неAlex gordonЧертовка ангелина суммы отрицательную (т.е.=СУММПРОИЗВ(ABS(A2:A8))
Вариант 3 — Использование СУММЕСЛИ
дает большую гибкость, поставил галочку возле ячейкиМы видим, что сумма модуля из числаВслед за этим, в расположен в нем, Либо, формула может открыто несколько книг? таком окончании работыPelena: В момент ввода делится? Тогда пример,: Подробная инструкция в: ABS суммируем их). Формула
=SUMPRODUCT(ABS(A2:A8))
если необходимо использовать
чисел в диапазоне
в приложении Microsoft
ранее указанной вами нужно найти функцию принимать такой вид
то данная процедура
excel продолжает висеть: Почитайте здесь формулы. О том
что и где видео
Возвращает модуль (абсолютную выглядит вот так:Учитывая, что можно использовать данные в дальнейшем,Строка итогов. ФункцияA2:A8 Excel нет ничего ячейке выводится значение ABS, и выделить
«ABS(адрес_ячейки_с_числом)». закроет все? или
в памяти.
djbaze
что всё сделано
Как сделать, чтобы Excel считал по модулю?
не делится.https://www.youtube.com/watch?v=C_d7_azCgXY
величину) числа. Абсолютная=СУММЕСЛИ(A2:A8,»>0″)-СУММЕСЛИ(A2:A8,» более эффективную функцию например, в виде(Total Row). Все
ABS
дает результат
сложного, так как модуля того числа, её. Затем нажимаемДля того, чтобы рассчитать,
только одну.
Нужно заканчивать вот
: как создать модуль
правильно просигналят <>———
Norton
величина числа -=SUMIF(A2:A8,»>0″)-SUMIF(A2:A8,»
СУММЕСЛИ таблицы или сводной
значения в столбцевозвращает модуль числа.-60 данное действие выполняется которое вы выбрали.
на кнопку «OK».
например, модуль от
просто вот так так: для вывода данных
вокруг формулы19392: Всем привет!
это число без
Модуль числа
Можно записать и в(SUMIF), чтобы получить
таблицы. Кроме этого,B Так что теперь: с помощью простойЕсли значение расположено вОткрывается окно аргументов функции.
у меня выглядитC# Marshal.ReleaseComObject(xlWorkSheet); xlWorkBook.Close(true,
на Excel вvikttur
ikkiГоспода, помогите советом, знака.
тот же результат вспомогательный столбец можетавтоматически просуммировались, а
мы можем просто
= -10 + 10 функции. Единственное условие таблице, то формулу Функция ABS имеет вбить в строку код на 1С
Missing.Value, Missing.Value); Marshal.ReleaseComObject(xlWorkBook); приложениях windows form: О формулах массивов:: формула массива в ячейке получается
(см. вариант 3), использоваться для сортировки
результат отобразился в
просуммировать диапазон + 20 + состоит в том, модуля можно скопировать
всего один аргумент
формул или в1C Эксель =
xlApp.Workbooks.Close(); Marshal.ReleaseComObject(xlApp.Workbooks); xlApp.Quit();Johnny_DИзменить стиль ссылок:=B1/МАКС(ABS(A1:A3))
отрицательное число, какABS(число)
=SUM(SUMIF(A2:A8,<«>0″,» путь с использованием чисел по модулю. отдельной строке.B2:B8 -20 + 30 что данную функцию и на другие — число. Вводим
любую ячейку на Новый COMObject(«Excel.Application»); РабочаяКнига
Marshal.ReleaseComObject(xlApp);: Модуль — библиотека? Файл-Параметры-Формулы-Стиль_ссылок.Казанский сделать так чтоЧисло — это
Если мы возьмем первый этих двух формул
Это без сомнения оченьДля подсчета суммы в
и это даст + -40 +
нужно просто знать. ячейки. Для этого, его. Если же листе, следующую формулу: = Эксель.Workbooks.Open(ИмяФайла); КоличествоЛистов
djbazeЗачем его создавать,В 2003 (не
Как вставить код в модуль листа? (Настройки Excel)
: Добавить ABS и бы в этой действительное число, абсолютную вариант формулы, получим становится непредпочтительным. Обе хороший способ, но
строке итогов используется нам результат
-50 = -60Автор: Максим Тютюшев нужно стать на
вы хотите взять «=ABS(-8)».
= Эксель.Worksheets.Count; //
: эта ссылка не он уже есть.
Как создать модуль для вывода данных на Excel в приложениях WinForms?
точно): Параметры-Вычисления-Стиль_ссылок. ввести как формулу ячейке значение было величину которого требуется следующее:
формулы прекрасно работают что же делать,
функция180Если бы мы рассматривалиМой коллега однажды спросил
нижний левый угол число из данных,Чтобы произвести расчет, жмем
. Для Каждого
работает. tut posle Покури форум, тут
Guest массива (Ctrl+Shift+Enter)? по модулю числа? найти.= 60-(-120) = 180 с небольшими диапазонами когда необходимо всеПРОМЕЖУТОЧНЫЕ.ИТОГИ. абсолютные значения (числа меня, как использовать ячейки, в которой
которые хранятся в на кнопку ENTER. Книга Из Эксель.WorkBooks Microsofta 6 podmenu, такого полно.
: В 2003 (точно):=R[-1]C/МАКС(ABS(R[-3]C[-2]:R[-2]C[-2]))
Спасибо!ПримерыДля полноты картины, подсчитаем данных, уверен, вы
уместить в одну(SUBTOTAL). Это универсальная=СУММ(B2:B8) без знака «-«), формулы Excel, чтобы уже есть формула,
какой-либо ячейке документа, Как видим, программа Цикл Книга.Close(Ложь,Неопределено,Истина); КонецЦикла; v kotorix netukenny69 Сервис — Параметрыvsem medvedviktturABS(2) равняется 2 сумму с помощью даже не ощутите
формулу без каких-либо функция, которая может=SUM(B2:B8)
Источник
Функция «Модуль» в Microsoft Excel
Модуль – это абсолютная положительная величина любого числа. Даже у отрицательного числа модуль будет всегда положительным. Давайте выясним, как рассчитать величину модуля в Microsoft Excel.
Функция ABS
Для расчета величины модуля в Excel существует специальная функция под названием «ABS». Синтаксис этой функции очень простой: ABS(число) . Либо формула может принимать такой вид: ABS(адрес_ячейки_с_числом) . Чтобы рассчитать, например, модуль от числа -8, нужно вбить в строку формул или в любую ячейку на листе следующую формулу: «=ABS(-8)».
Для выполнения расчета жмем на Enter — программа выдает в ответ положительное значение.
Существует еще один способ расчета модуля. Он подойдет для тех пользователей, которые не привыкли держать в голове различные формулы.
- Кликаем по ячейке, в которой хотим, чтобы хранился результат. Жмем на кнопку «Вставить функцию», размещенную слева от строки формул.
- Запускается окно «Мастера функций». В списке, который расположен в нем, найдите функцию ABS и выделите ее. Подтверждаем на «OK».
- Открывается окно аргументов функции. ABS имеет всего один аргумент — число, поэтому вводим его. Если же вы хотите взять число из данных, которые хранятся в какой-либо ячейке документа, нажмите на кнопку, размещенную справа от формы ввода.
- Окно свернется, а вам нужно кликнуть по ячейке, где содержится число, от которого хотите рассчитать модуль. После его добавления опять жмите на кнопку справа от поля ввода.
Важно заметить, что некоторые пользователи пытаются записать модуль, как это принято в математике, то есть |(число)|, например |-48|. Но в такой ситуации вместо ответа появится лишь ошибка, так как Excel не понимает подобный синтаксис.
В расчете модуля из числа через Microsoft Excel нет ничего сложного, так как данное действие выполняется с помощью простой функции. Единственное условие состоит в том, что данную функцию нужно просто знать.
Источник
Хитрости »
1 Май 2011 300347 просмотров
Что такое модуль? Какие бывают модули?
Любой код VBA должен где-то храниться. Для хранения кодов в VBA используются модули, которые хранятся в книге. Книга может содержать сколько угодно модулей. Каждый модуль в свою очередь может содержать множество процедур(макросов).
Все имеющиеся в книге модули можно посмотреть через редактор VBA (Alt+F11). Имеющиеся модули отображены в левой части редактора в проводнeике объектов(Project Explorer).
рис.1
Сам проводник объектов может быть не отображен по умолчанию и тогда его необходимо отобразить: нажать Ctrl+R либо в меню редактора VBA-View—Project Explorer
Модули делятся на пять основных типов:
- Стандартный модуль
- Модуль листа
- Модуль книги
- Модуль пользовательской формы
- Модуль класса
- Перенос, импорт и экспорт модуля
Вообще, если точнее, то всего-то два типа модуля — обычный и модуль класса, т.к. Модуль листа, Модуль книги, Модуль пользовательской формы и Модуль класса по своей сути являются модулями классов. Но я специально разделил их на несколько типов, т.к. именно такие типы часто употребляются при пояснениях в различных учебниках и на всевозможных форумах и в самих книгах Excel они по виду и некоторому функционалу различны.
Для того, чтобы создать новый стандартный модуль(Module), модуль класса(ClassModule) или пользовательскую форму(UserForm) надо просто в окне Проводника объектов(Project Explorer) щелкнуть правой кнопкой мыши, выбрать пункт Insert и затем тип добавляемого объекта(Module, ClassModule, UserForm). Так же добавить модуль можно и через меню: Insert -тип модуля.
Удалить тоже просто: щелкнуть правой кнопкой мыши на нужном модуле в окне проекта и выбрать Remove. Подробнее про удаление описано в конце этой статьи: Удаление модулей
СТАНДАРТНЫЙ МОДУЛЬ
на рис.1 Module1.
Самый распространенный тип модулей, который используется в большинстве случаев. Именно в них макрорекордер создает записываемые макросы. Все коды и процедуры в таких модулях пишутся вручную, либо копируются из других источников(другого модуля, с этого сайта и т.п.). В основном именно в стандартных модулях содержится большая часть кодов. Они предназначены для хранения основных процедур и Public переменных, которые могут быть доступны впоследствии из любого модуля. Как создать стандартный модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Module. При записи макрорекордером модули создаются автоматически и им автоматически присваиваются имена.
Многие коды, опубликованные в статьях на сайте необходимо размещать именно в стандартных модулях. Для этого достаточно создать новый стандартный модуль, скопировать текст кода с сайта и вставить.
МОДУЛЬ ЛИСТА
Лист1 или Sheet1 — на рис.1: Лист1(Лист1),Лист2(Лист2),Лист3(Лист3).
Для каждого листа книги имеется свой отдельный модуль. Попасть в модуль листа проще, чем в остальные модули. Для этого надо просто щелкнуть правой кнопкой мыши по ярлычку листа и выбрать из контекстного меню пункт Исходный текст(View Code)
в зависимости от версии Excel этот пункт на русском может называться так же: Просмотреть код или Исходный код
:
Можно и более трудным путем пойти — через редактор VBA: Alt+F11 и в окне Проводника объектов(Project Explorer) дважды щелкнуть по объекту с именем листа или правая кнопка мыши на модуле листа —View code.
Размещая код в модуле листа следует помнить, что при копировании или переносе данного листа в другую книгу код так же будет скопирован, т.к. является частью листа. Это и плюс и минус одновременно. Плюс в том, что разместив код в модуле листа можно использовать этот лист в качестве шаблона для распространения со своими кнопками вызова этих кодов(в том числе создания книг кодом) и весь функционал будет доступен. Минус же заключается в некоторых нюансах обращения к ячейкам(подробнее можно ознакомиться в этой статье: Как обратиться к диапазону из VBA) и необходимости размещения ВСЕХ используемых процедур в этом листе, иначе при переносе в другие книги коды могут работать с ошибками.
В модуле листа содержатся встроенные событийные процедуры, каждая из которых отвечает за обработку определенного события на этом листе. Посмотреть их можно так: выбираете объект(на рисунке ниже список в левой части) Worksheet, а в правом списке выбираете событие(в этом списке все процедуры, доступные для выбранного листа):
Процедуры, события для которых уже используются, выделяются жирным шрифтом.
Названия событийных процедур носят достаточно информативные имена и большая их часть не нуждается в тщательной расшифровке. Но самые наиболее части применяемые в любом случае считаю нужным описать:
- Activate — возникает при активации самого листа(но не возникает, если произошел переход из одной книги в другую и этот лист является там активным)
- BeforeDoubleClick — возникает при двойном клике мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену режима редактирования
- BeforeRightClick — возникает при клике правой кнопкой мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену показа всплывающего меню
- Calculate — возникает при пересчете функций и формул на листе
- Change — возникает при изменении значений ячеек на листе. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на ячейку, которая была изменена. Может отличаться от активной в момент обработки ячейки
- Deactivate — возникает при переходе с этого листа на другой лист этой же книги
- FollowHyperlink — возникает при переходе по гиперссылке, созданной в этом листе
- SelectionChange — возникает при изменении адреса выделенной ячейки/области. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на диапазон ячеек, которые были выделены. Совпадает с выделенными на текущий момент ячейками
Достаточно важный момент: если захотите познакомиться поближе с событийными процедурами, всегда обращайте внимание на переменные, которые передаются в качестве аргументов в процедуру. В большинстве случаев рекомендую использовать именно эти переменные, а не выдумывать всякие возможности для вычисления объекта, который послужил причиной возникновения события. Для события листа Worksheet_Change это переменная Target. Для примера вставьте приведенный ниже код в модуль любого листа:
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Адрес измененной ячейки: " & Target.Address & _ "; Адрес активной ячейки: " & Selection.Address, vbInformation, "www.excel-vba.ru" End Sub
После этого запишите в ячейку A1 значение 5 и нажмите Enter. Событие Change сработает в момент завершения редактирования — т.е. в момент нажатия Enter. При этом будет произведен переход на ячейку A2(в большинстве случаев, если настройками не задано иное) и появится сообщение, которое покажет, что изменили ячейку A1, а выделена сейчас A2. Т.е. Target — это всегда ссылка именно на измененную ячейку независимо от того, что сейчас выделено. Данное событие(Worksheet_Change) не будет срабатывать при изменении значений ячеек с формулами. Только ручной ввод.
Примечание: для всех кодов, приведенных на сайте, достаточно просто открыть необходимый модуль(книги или листа) и вставить предложенный код. Корректировка может понадобиться только в случаях, когда в модуле Листа или Книги вашего файла уже имеется код в необходимой событийной процедуре.
МОДУЛЬ КНИГИ
ЭтаКнига или ThisWorkbook:
В модуль книги можно попасть только через проводник объектов(Project Explorer) редактора VBA — двойной щелчок по ЭтаКнига (ThisWorkbook) или правая кнопка мыши на модуле —View code. В модуле книги так же содержатся «встроенные» событийные процедуры. Так же как и для листа выбираем в списке объектов(вверху слева) Workbook. В правом окне выбора процедур, так же как и с модулем листа, будут все процедуры, доступные для объекта ЭтаКнига. Пример использования событийных процедур книги можно посмотреть в статье Как отследить событие(например выделение ячеек) в любой книге?
Но там применяются все те же правила — главное не забывать про аргументы, доступные из этих процедур и передаваемые им самим Excel. Например, для события Workbook_BeforeClose доступен аргумент Cancel. Это можно использовать, если не хотите, чтобы книгу закрыл пользователь, не заполнив ячейку A1. Вот пример подобного кода:
Private Sub Workbook_BeforeClose(Cancel As Boolean) If Me.Sheets("Отчет").Range("A1").Value = "" Then MsgBox "Необходимо заполнить ячейку A1 на листе 'Отчет'", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем закрытие книги End If End Sub
Из кода видно, что на листе «Отчет» должна быть не пустой ячейка A1(лист «Отчет» тоже должен существовать в этой книге). Но есть и еще одна вещь — какое-то Me. Это краткое обращение к объекту модуля класса, в данном случае это равнозначно обращению ThisWorkbook. И еще один пример кода для модуля ЭтаКнига, который запрещает сохранять исходную книгу, разрешая сохранить её только через пункт Сохранить как(SaveAs):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI = False Then 'используется простое сохранить MsgBox "Эта книга является шаблоном. Сохранять её можно только через Сохранить как", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем сохранение книги End If End Sub
Такое может потребоваться, если книга является шаблоном с полями для заполнения и необходимо предотвратить случайное сохранение исходного документа. Хотя это можно так же сделать без макросов — книгу можно сохранить с правами только на чтение.
МОДУЛИ ФОРМ
UserForm — на рис.1 UserForm1.
Содержатся внутри
Пользовательской формы(UserForm)
и её объектов. В Пользовательских формах в основном все завязано именно на событийных процедурах самой формы и на элементах этой формы(Кнопки, ТекстБоксы, КомбоБоксы(выпадающие списки) и т.д.). Очень удобно использовать Пользовательские формы в своих приложениях для общения с пользователем. Т.к. через формы очень удобно отслеживать действия пользователя и можно запретить доступ к листам с данными, путем их скрытия. Создается форма так же как и модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—UserForm. Примеры кодов с использованием форм можно посмотреть в статьях: Каждому пользователю свой лист/диапазон, Как оставить в ячейке только цифры или только текст?
МОДУЛЬ КЛАССА
ClassModule — на рис.1 Class1.
В большинстве случаев создается специально для отслеживания событий различных объектов. Вряд ли понадобиться начинающим изучение VBA, хотя все зависит от поставленной задачи. Но обычно начинающим изучать это кажется слишком сложным. В любом случае, перед работой с модулями классов лучше научиться хоть чуть-чуть работать с обычными модулями и самостоятельно писать процедуры. Как добавить такой модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Class Module. Подробнее про модули классов и работу с ними можно почитать в этой статье: Работа с модулями классов. Там описаны все основные принципы и приложен файл примера.
Действия по удалению любого из модулей одинаковы для всех типов. Для этого необходимо перейти в проект VBA нужной книги, выбрать нужный модуль, щелкнуть по нему правой кнопкой мыши и в появившемся меню выбрать Remove (Имя модуля)…(Remove Module1, Remove UserForm1, Remove Class1 и т.п.). После этого появится окно с запросом «Do you want to export (имя модуля) before removing it?». Это означает, что VBA спрашивает: хотите ли Вы сохранить копию кодов модуля перед удалением? Как правило выбирать следует Нет. Но если Вы хотите сохранить текст кодов из удаляемого модуля в отдельном файле, то соглашаетесь, нажав Да. Будет предложено выбрать папку для сохранения модуля и можно даже задать ему отдельное имя.
Иногда нужно модуль из одной книги переместить в другую. Сделать это можно несколькими способами. Самый простой — открыть обе книги, перейти в проводник проектов -найти нужный модуль -захватить его левой кнопкой мыши и не отпуская кнопку перетащить на проект другой книги:
Следует помнить, что так можно перенести и скопировать только стандартный модуль, модуль класса и модуль
UserForm
. Коды модулей листов и книги придется переносить как обычный текст: переходим в модуль
ЭтаКнига
(откуда хотим копировать) -копируем весь код -переходим в модуль ЭтаКнига второй книги и вставляем скопированное:
Экспорт модуля(сохранение в отдельный файл)
Если же надо сохранить стандартный модуль, модуль класса или модуль формы и не переносить сразу же в другую книгу, то можно экспортировать модуль. Для чего это может быть нужно? Как правило, чтобы перенести коды из дома на работу, переслать кому-то на другой ПК(пересылка файла с макросами может быть запрещена политикой безопасности компании) и т.п. Делается это просто: щелкаем на модуле правой кнопки мыши —Export file.
У экспортируемых модулей есть разные расширения, в зависимости от типа модуля. Для стандартных модулей это
.bas
(Module1.bas), для модулей класса —
.cls
(Class1.cls). А вот для модулей форм будет создано целых два файла:
UserForm1.frm
и
UserForm1.frx
. Их важно хранить вместе — один без другого не может быть импортирован в дальнейшем в файл. В файле
.frx
хранится информация об визуальном отображении формы и её элементах, если можно так сказать. В файле
.frm
хранятся непосредственно тексты кодов для формы и служебная информация(имя и размеры формы, некоторые глобальные директивы и ссылка на файл .frx). Поэтому не рекомендуется без соответствующих навыков переименовывать эти два файла в надежде, что потом все заработает.
Импорт модуля(перенос экспортированного ранее в новую книгу)
Для переноса экспортированного модуля в другую книгу надо просто в проводнике объектов выделить нужный проект правой кнопкой мыши —Import module -выбрать в диалоговом окне нужный модуль.
Экспортировать можно любой модуль, а вот импортировать — нет. Модули листов и книг хоть и экспортируются в отдельные файлы(кстати, с расширением .cls), но импортировать их не получится в том виде, как это предполагается. Они будут импортированы как новые модули класса и только. Поэтому для переноса кодов из модулей листов и книг придется использовать все равно копирование и вставку непосредственно кодов.
И в довершение — можно переносить модули автоматически, кодами VBA: Как добавить код процедуры программно, скопировать модуль
Также см.:
Копирование модулей и форм из одной книги в другую
Что такое макрос и где его искать?
Как удалить макросы в книге?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Время на прочтение
7 мин
Количество просмотров 2.1K
В статье описан простой контроллер инициализации модулей VBA Excel.
Все типы модулей VBA MS Excel позволяют создавать код, автоматически выполняемый при загрузке и/или выгрузке модуля.
Однако, для обычных модулей с макросами, VBComponent.Type=001, примера автоматической инициализации автор в сети не обнаружил.
Вступление
Автоматическая инициализация модуля VBA MS Excel производится по факту наличия в модуле подпрограммы с заданным интерфейсом.
Это удобно. Наличие подпрограммы с заданным интерфейсом включает автоматические инициализацию модуля. Удаление из кода модуля подпрограммы — выключает.
Например, для включения автоматической инициализации листа электронной таблицы, достаточно добавить две подпрограммы в модуль макросов листа.
Private Sub Worksheet_Activate()
' your code here
End Sub
Private Sub Worksheet_Deactivate()
' your code here
End Sub
Первая подпрограмма автоматически вызывается перед получением фокуса ввода. Например, для установки начальных значений переменных.
Вторая — перед тем как, как фокус ввода будет потерян.
В других листах электронных таблиц эти функции могут отсутствовать, если в инициализации там потребности нет.
Таким же образом устроен механизм инициализации классов, книг и форм MS Excel.
Но, иногда возникает потребность автоматической инициализации обычных модулей с макросами, Type=001.
Постановка задачи
-
Создать автоматический вызов процедур инициализации и завершения для обычных модулей VBA.
-
Повторить привычный механизм управления инициализацией — наличие в модуле VBA подпрограммы с известным именем.
-
Осуществлять автоматически инициализацию и завершение только тех модулей VBA, где присутствуют соответствующие подпрограммы.
Решение задачи
Синтаксис MS EXCEL VBA, допускает:
-
размещение в разных модулях подпрограмм с одинаковыми именами и интерфейсом;
-
косвенный вызов подпрограмм VBA по имени внутри переменной;
-
уточняющий синтаксис VBA.
Договоримся об именовании подпрограмм инициализации и завершения:
-
moduleInit(ByRef Wb As Workbook) — автоматически вызываемая процедура инициализации;
-
moduleLeave(ByRef Wb As Workbook) — автоматически вызываемая процедура завершения;
-
В любом модуле VBA, подпрограммы инициализации могут отсутствовать или присутствовать, совместно или по одной.
Подпрограммы инициализации принимают один параметр, Wb, хранящий ссылку на книгу, для которой производится инициализация модуля макросов.
Инициализируемый модуль определяется местоположением вызываемой подпрограммы.
Для включения автоматической инициализации добавляем в любое место модуля макросов подпрограмму инициализации:
Option Explicit
' Your VBA module code here
Public Sub moduleInit(ByRef Wb As Workbook)
' The starting code for your VBA module is here
End Sub
Для завершения работы модуля, помещаем соответствующую подпрограмму где-нибудь рядом:
Option Explicit
' Your VBA module code here
Public Sub moduleLeave(ByRef Wb As Workbook)
' The final code for your VBA module is here
End Sub
Public Sub moduleInit(ByRef Wb As Workbook)
' The starting code for your VBA module is here
End Sub
Удаляем текст договорных подпрограмм, если потребности в инициализации модуля нет.
Контроллер инициализации
Интерфейс контроллера инициализации содержит две константы и одну подпрограмму.
Public Const vbaMODULE_INIT As String = "moduleInit"
Public Const vbaMODULE_LEAVE As String = "moduleLeave"
Public Sub vbaWbModuleControl( _
subName As String, _
Optional printDebugOnly As Boolean = False)
Константы закрепляют договор вызова подпрограмм инициализации и завершения обычных модулей VBA MS Excel.
Прототипы подпрограмм инициализации завершения:
Public Sub moduleInit(ByRef Wb As Workbook) ' module initialization
Public Sub moduleLeave(ByRef Wb As Workbook) ' module completion
В подпрограмме контроллера инициализации vbaWbModuleControl два параметра:
-
subName — название подпрограммы инициализации или завершения;
-
printDebugOnly — запуск контроллера в режиме отладки.
Каждый раз при вызове, контроллер инициализации «пробегает» по всем модулям проекта VBA MS Excel, создаёт список подпрограмм с именем subName по факту их присутствия, запускает на исполнение передавая, как параметр, объект рабочей книги.
Порядок запуска подпрограмм инициализации определяется порядком создания модулей VBA.
Запуск vbaWbModuleControl с параметром printDebugOnly=True выдаёт на консоль отладки список всех функций инициализации или завершения в порядке вызова, но без вызова.
Для инициализации модулей макросов по событиям получения или потери фокуса ввода электронной таблицы, контроллер инициализации размещается в обработчике событий _Activate().
Private Sub Workbook_Activate()
vbaWbModuleControl vbaMODULE_INIT
End Sub
Private Sub Workbook_Deactivate()
vbaWbModuleControl vbaMODULE_LEAVE
End Sub
Для одноразового вызова процедур инициализации и завершения достаточно переместить вызов контроллера в обработчики открытия и закрытия книги электронной таблицы.
Private Sub Workbook_Open()
vbaWbModuleControl vbaMODULE_INIT
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
vbaWbModuleControl vbaMODULE_LEAVE
End Sub
Для восстановления инициализации после сбоя во время отладки контроллер запускается в ручном режиме.
Sub ReInitProject()
vbaWbModuleControl vbaMODULE_INIT
End Sub
Интеграция контроллера
Контроллер инициализации интегрируется в новый проект простым переносом исходного текста [^C;^V] в модуль макросов VBA Excel.
Контроллер работает без начальной инициализации.
В современных версиях MS Excel дополнительно отмечается чекбокс «Доверять доступ к объектной модели макросов VBA» в разделе «Центр управления безопасности».
Исходный код контроллера инициализации
Attribute VB_Name = "mWbInit"
'***************************************************************************
' Module "mWbInit.bas"
' Controller for automatic initialization of VBA modules
'
' Copyright (c) 2022, "Nikolay E. Garbuz" <nik_garbuz@list.ru>
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU Lesser General Public License version 3 as
' published by the Free Software Foundation.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU Lesser General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
'
' Authored by Nikolay Garbuz <nik_garbuz@list.ru>
' Modified by
'
' TAB Size .EQ 4
'***************************************************************************
Option Explicit
Option Compare Text
' Public Sub moduleInit(ByRef Wb As Workbook)
Public Const vbaMODULE_INIT As String = "moduleInit"
' Public Sub moduleLeave(ByRef Wb As Workbook)
Public Const vbaMODULE_LEAVE As String = "moduleLeave"
' Call vbaWbModuleControl vbaMODULE_INIT ' for initialization
' Call vbaWbModuleControl vbaMODULE_LEAVE ' for release
Public _
Sub vbaWbModuleControl( _
subName As String, _
Optional printDebugOnly As Boolean = False _
)
vbaWbModuleRun ThisWorkbook, subName, printDebugOnly
End Sub
Public _
Sub vbaWbModuleRun( _
ByRef Wb As Workbook, _
subName As String, _
Optional printDebugOnly As Boolean = False _
)
Dim i As Integer
Dim subList() As String
i = vbaSubroutineList(ThisWorkbook, subName, subList)
If i > 0 Then
If printDebugOnly Then
Debug.Print Join(subList(), vbCrLf)
Else
For i = LBound(subList) To UBound(subList)
Application.Run subList(i), Wb
Next i
End If
End If
Erase subList
End Sub
Private _
Function vbaSubroutineList( _
ByRef Wb As Workbook, _
sName As String, _
ByRef sList() As String _
) As Integer
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
Dim sc As Long
Dim fc As Long
Dim sLine As String
Dim modName As String
Dim subName As String
Dim chkName As String
ReDim sList(0)
i = InStr(sName, ".")
If i > 0 Then
modName = Left(sName, i - 1)
subName = Mid(sName, i + 1)
Else
modName = ""
subName = sName
End If
sc = vbaModuleIdx(Wb, modName)
If sc > 0 Then
fc = sc
Else
sc = 1
fc = Wb.VBProject.VBComponents.Count
End If
With Wb.VBProject.VBComponents
For i = sc To fc
l = .Item(i).CodeModule.CountOfLines
For j = 1 To l
chkName = ""
Do
sLine = .Item(i).CodeModule.Lines(j, 1)
If Right(sLine, 1) = "_" Then
chkName = chkName & Left(sLine, Len(sLine) - 1)
j = j + 1
Else
chkName = chkName & sLine
Exit Do
End If
Loop
chkName = vbaRemComment(chkName)
chkName = vbaRemPrefix(chkName)
chkName = vbaRemIdentLine(chkName)
chkName = vbaSubroutineName(chkName)
If chkName <> "" Then
If subName = "*" Or StrComp(subName, chkName) = 0 Then
If UBound(sList) < k Then
ReDim Preserve sList(UBound(sList) + 10)
End If
sList(k) = .Item(i).Name & "." & chkName
k = k + 1
End If
End If
Next j
Next i
End With
If k > 0 Then
ReDim Preserve sList(k - 1)
End If
vbaSubroutineList = k
End Function
Private _
Function vbaModuleIdx( _
ByRef Wb As Workbook, _
sModuleName As String _
) As Integer
Dim i As Integer
Dim m As String
vbaModuleIdx = 0
With Wb.VBProject.VBComponents
For i = 1 To .Count
m = .Item(i).Name
If StrComp(sModuleName, m) = 0 Then
vbaModuleIdx = i
Exit Function
End If
Next i
End With
End Function
Private _
Function vbaSubroutineName(sLn As String) As String
Const maskSubName As String = "sub *(*)*"
Const maskFuncName As String = "function *(*)*"
Dim p_space As Integer
Dim p_bra As Integer
Dim sn As String
sn = ""
If (sLn Like maskSubName) Or (sLn Like maskFuncName) Then
p_space = InStr(sLn, " ") + 1
p_bra = InStr(sLn, "(")
sn = Mid(sLn, p_space, p_bra - p_space)
End If
vbaSubroutineName = Trim(sn)
End Function
Private _
Function vbaRemComment(sLn As String) As String
Const comSymbols = "REM ,', REM ,: REM "
Dim i As Long
Dim s As String
Dim pc As Long
Static csym() As String
On Error GoTo InitArray
i = 0
Do
s = csym(i)
pc = InStr(sLn, s)
If pc = 1 Then
sLn = ""
Exit Do
Else
If pc > 1 And i > 0 Then
sLn = Left(sLn, pc - 1)
Exit Do
End If
End If
i = i + 1
Loop Until i > UBound(csym)
vbaRemComment = sLn
On Error GoTo 0
Exit Function
InitArray:
csym = Split(comSymbols, ",")
s = csym(0)
Resume Next
End Function
Private _
Function vbaRemPrefix(sLn As String) As String
Const prefixKeys = "Public ,Private ,Friend ,Static "
Dim i As Long
Dim s As String
Dim ps As Long
Dim pf As Long
Static pref() As String
On Error GoTo InitArray
i = 0
Do
s = pref(i)
ps = InStr(sLn, s)
If ps > 0 Then
pf = ps + Len(s)
If ps = 1 Then
sLn = Mid(sLn, pf)
Else
sLn = Left(sLn, ps - 1) & Mid(sLn, pf)
End If
End If
i = i + 1
Loop Until i > UBound(pref)
vbaRemPrefix = sLn
On Error GoTo 0
Exit Function
InitArray:
pref = Split(prefixKeys, ",")
s = pref(0)
Resume Next
End Function
Private _
Function vbaRemIdentLine(sLn As String) As String
Const lnSymbols = " " & vbTab & vbCr & vbLf
While sLn <> "" And InStr(lnSymbols, Left(sLn, 1)) > 0
sLn = Mid(sLn, 2)
Wend
vbaRemIdentLine = sLn
End Function