Как включить режим программирования в excel
Некоторое время назад меня попросили «помочь с Экселем», а потом и работа подвернулась такая, так что за последние пару месяцев я узнал много полезного, чем и хочу поделиться в догонку к недавней статье.
Предполагается, что вы знаете основы Visual Basic. Я не буду рассказывать, как создавать формы или модули, здесь только примеры кода.
Visual Basic
Опции
Во-первых, в VB массивы могут начинаться с индекса 1, что для многих странно, поэтому в начале модулей можно прописывать:
Так же рекомендуется прописать:
В этом случае интерпретатор потребует заблаговременного объявления всех переменных. Переменные объявлять нужно потому, что:
— VB запомнит их нАпиСание и не будет исправлять во всём коде на последний введенный вариант;
— иногда возникают ошибки с передачей переменных byRef, если они не объявлены (то есть надо или объявить переменную, или приписать в функции/процедуре перед ней byVal).
Ещё одним важным оператором является ON ERROR. Привожу варианты:
Возможности языка
Хотя VB довольно прост, полезно почитать документацию по его синтаксису. Я, например, с удивлением узнал, что можно прописывать сложные усолвия в SELECT'ах (аналог switch):
Ускорение работы макросов
Часто макросы требуют долгого времени выполнения, которое можно значительно сократить. В начале и в конце каждой ресурсоёмкой функции вызвать Prepare и Ended.
Важно понимать, что VBA выполняет все действия так же, как и пользователь. Поэтому для того, чтобы установить параметры страницы, он каждый раз открывает и закрывает окно параметров. У меня выставлялись параметры для 10 листов, это реально не быстро. Поэтому делаем так:
Далее, часто нужно просмотреть различные диапазоны ячеек и что-то с ними сделать. Тут важно не использовать циклы for с перебором индексов, они медленные. Можно использовать встроенные функции Экселя, но удобнее всего такой вариант:
Данный код просматривает указанный диапазон, выбирает в нем «специальные ячейки», в данном случае все, в которых есть формулы (т.е. начинаются со знака равно). Для каждой ячейки смотрится, если она не закрашена, то её надо защитить (см. далее) и покрасить. Такой код работает очень быстро.
Для любых переменных, которым вы собираетесь присвоить книгу, лист, диапазон (ячейку) нужно предварительно объявить как Variant.
Естественно, что если вам нужны однотипные значения в ячейках, нужно использовать автозаполнение, всё равно как «растягивание» ячеек пользователем.
Второй диапазон должен включать первый, а второй необязательный параметр указывает тип автозаполнения.
Загрузка книги и события
При открытии книги каждый раз срабатывает процедура.
В данном случае настройки печати (поля, ориентация) сбрасываются на дефолтные. Можно и другую инициализацию выполнять. Важно, что если макросы отключены, то и не выполнится ничего. Если в Экселе вылезла вверху панелька с предупреждением о макросах и пользователь нажал «Включить», то именно в этот момент выполнится процедура Workbook_open().
Список доступных событий можно посмотреть вверху редактора VB. Например, я делал на событие Change проверку, где лежит ячейка, в которой было изменения, и если это нужный диапазон, то делалась запись в лог со старым и новым значением.
Защита
Во-первых сразу отмечу, что MS Office не исполняет макросы на компьютерах, где он не нашел антивируса, если книга зашифрована. Сталкивался на компьютерах, где антивирус был, но видимо Windows XP об этом не знала.
Ещё антивирус может странным образом мешать работе, вызывать ошибки, не совсем объяснимые. Показал айтишникам, сказали ок, что-то сделали, не знаю.
Итак, нам надо защитить книгу, чтобы ввод был разрешен только в нужные ячейки (формулы и заголовки поменять нельзя). Во-первых, нужно сделать соответствующие ячейки «не защищенными». Для этого делаем одно из:
— выделяем диапазон, формат ячеек, снять галочку «Блокировать ячейку»;
— выводим кнопку «Блокировать ячейку» в быстрый доступ и нажимаем её, очень удобно смотреть на неё чтобы понять, защищена ячейка или же нет;
— а это пригодится, чтобы проверить третий вариант — написать макрос, который снимает защиту с нужных ячеек сам.
Далее нужно защитить лист. На вкладке Рецензирование есть такая кнопка. Окошко просит ввести пароль и установить исключения (что можно будет делать пользователю). К сожалению, список исключений маловат. Самое обидное, что нельзя разрешить сворачивать/разворачивать группы столбцов/строк. Поэтому действуем так, на загрузку книги прописываем:
Знак подчеркивания продолжает логическую строку на следующей физической строке. Итак, здесь мы:
1. Сняли защиту.
2. Включили группировку.
3. Поставили защиту, при этом:
— защита только от юзера, макросы продолжают иметь полный доступ (!), крайне важно;
— разрешили сортировку, фильтрацию и форматирование строк/столбцов (высота/ширина);
— DrawingObject в данном случае снимает защиту с примечаний к ячейкам, может и ещё с чего.
Тут мы сталкиваемся с парой сюрпризов. Во-первых, не все макросы будут работать даже так. Известный баг, ничего не сделаешь. Нельзя вставить строку, например. Приходится снимать и тут же ставить защиту. Если «злоумышленник» в этот момент нажмет ctrl+break, то защита слетит.
Во-вторых, скажем никаким способом нельзя удалять строки (AllowDeletingRows), в которых есть защищенные ячейки, хоть одна. Подробнее вот тут.
Решением (костылем) является добавление кнопки или сочетания клавиш для удаления. Заодно можно проверить, чтобы пользователь не удалил чего не надо. В Workbook_open добавляем:
Теперь процедура будет вызываться при нажатии shift+delete.
Знаю, код некрасивый, простите. Здесь я пытался проверить, что выделена строка, то есть строк там 1, а ячеек не меньше тысячи. Чтобы удалить не то, придется выделить тысячу ячеек начиная не с первого столбца. Далее проверяется имя листа и номера строк. Вместо 50 был расчет последенй строки (ведь их число меняется, если мы их удаляем и добавляем).
Заключение
VBA — весьма глючная вещь, которая позволяет сворачивать горы в MS Office. Многие предприятяи используют модели на Excel годами, и если они сделаны хорошо, то всё работает.
Для изучения VBA подходит он сам, во-первых там хорошая справка. Например, чтобы узнать все варианты что можно разрешить в методе Protect, нажимаем F1, Protect, ввод. И вуаля.
Во-вторых, можно проделать требуемые действия вручную, записав макрос, а потом просмотрев его код. Код будет ужасен (например, при изменении параметров страницы, макрос запишет значения всех параметров и полей, а не только измененного вами), но ответы найдутся. Хотя, например, .AutoFit, который записывается при изменении высоты ячейки по содержимому (двойной клик на границе слева), на самом деле не работает.
Предлагаю знатокам поделиться своим опытом, дать советы в комментариях. Спасибо за внимание, удачных разработок вам.
Эта статья предназначена для тех, кто желает научиться программировать в VBA Excel с нуля. Вы увидите, как это работает, и убедитесь, что не все так сложно, как кажется с первого взгляда. Свою первую программу вы напишите за 7 простых шагов.
Знакомство с редактором VBA
- Создайте новую книгу Excel и сохраните ее как книгу с поддержкой макросов с расширением .xlsm. В старых версиях Excel по 2003 год – как обычную книгу с расширением .xls.
- Нажмите сочетание клавиш «Левая_клавиша_Alt+F11», которое откроет редактор VBA. С правой клавишей Alt такой фокус не пройдет. Также, в редактор VBA можно перейти по ссылке «Visual Basic» из панели инструментов «Разработчик» на ленте быстрого доступа. Если вкладки «Разработчик» на ленте нет, ее следует добавить в настройках параметров Excel.
В левой части редактора VBA расположен проводник проекта, в котором отображены все открытые книги Excel. Верхней строки, как на изображении, у вас скорее всего не будет, так как это – личная книга макросов. Справа расположен модуль, в который записываются процедуры (подпрограммы) с кодом VBA. На изображении открыт модуль листа, мы же далее создадим стандартный программный модуль.
После нажатия кнопки «Module» вы увидите ссылку на него, появившуюся в проводнике слева.
Первая программа на VBA Excel
Добавляем на стандартный модуль шаблон процедуры – строки ее начала и завершения, между которыми мы и будем писать свою первую программу (процедуру, подпрограмму).
- Откройте стандартный модуль двойным кликом по его ссылке в проводнике. Поместите в него курсор и нажмите кнопку «Procedure…» во вкладке «Insert» главного меню. Та же ссылка будет доступна при нажатии на вторую кнопку после значка Excel на панели инструментов.
В результате откроется окно добавления шаблона процедуры (Sub).
Имя процедуры может быть написано как на латинице, так и на кириллице, может содержать цифры и знак подчеркивания. Оно обязательно должно начинаться с буквы и не содержать пробелы, вместо которых следует использовать знак подчеркивания.
- Вставьте внутрь шаблона процедуры следующую строку: MsgBox "Привет" .
- Проверьте, что курсор находится внутри процедуры, и запустите ее, нажав клавишу «F5». А также, запустить процедуру на выполнение можно, нажав на треугольник (на изображении под пунктом меню «Debug») или на кнопку «Run Sub/UserForm» во вкладке «Run» главного меню редактора VBA Excel.
Работа с переменными
Чтобы использовать в процедуре переменные, их необходимо объявить с помощью ключевого слова «Dim». Если при объявлении переменных не указать типы данных, они смогут принимать любые доступные в VBA Excel значения. Комментарии в тексте процедур начинаются со знака «'» (апостроф).
Вкладка с инструментами, связанными с VBA Excel, называется «Разработчик». Если этой вкладки нет на вашей ленте, добавьте ее через окно «Параметры»:
- Откройте окно «Параметры» через меню «Файл».
- Выберите вкладку «Настроить ленту».
- В правой колонке установите галочку у пункта «Разработчик» и нажмите «OK».
Кнопка – элемент управления формы
Вставка кнопки на лист
- Выберите вкладку «Разработчик» и нажмите на кнопку «Вставить».
- Нажмите на значок кнопки в коллекции «Элементы управления формы».
- Кликните в любом месте на рабочем листе Excel.
- Откроется окно «Назначить макрос объекту». Нажмите «Отмена», так как макрос для этой кнопки еще не готов.
- После нажатия кнопки «Отмена», на рабочем листе появится новая кнопка из коллекции «Элементы управления формы» в режиме редактирования.
Ухватив мышкой за один из кружочков, можно изменить размер кнопки. Ухватив кнопку за границу, можно перетащить ее в другое место. Также, в режиме редактирования, можно изменить название кнопки прямо на ее поверхности.
Чтобы выйти из режима редактирования кнопки из коллекции «Элементы управления формы», кликните в любом месте на рабочем листе.
Чтобы вернуться в режим редактирования кнопки, кликните по ней правой кнопкой мыши и выберите из контекстного меню нужный пункт. Если вы хотите изменить размер или размещение кнопки перетаскиванием, кликните левой кнопкой мыши в любом месте рабочего листа. После первого клика контекстное меню закроется, а кнопка останется в режиме редактирования.
Создание процедуры для кнопки
Кнопке из коллекции «Элементы управления формы» можно назначить макрос (процедуру), размещенную в стандартном программном модуле.
Создайте или откройте файл Excel с расширением .xlsm (Книга Excel с поддержкой макросов) и перейдите в редактор VBA, нажав сочетание клавиш «Левая_клавиша_Alt+F11».
Если вы не создавали ранее в этом проекте VBA стандартный программный модуль, нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку (после значка Excel) на панели инструментов.
Ссылка на модуль появится в проводнике слева. Если модуль создан ранее, дважды кликните по его ссылке в проводнике, и он откроется справа для редактирования.
В открывшемся окне добавления шаблона процедуры оставьте выбранным переключатель «Sub», вставьте в поле «Name» название процедуры «NovayaProtsedura» и нажмите «OK».
В стандартный программный модуль будет вставлен шаблон процедуры «NovayaProtsedura».
Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?
Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.
Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.
Да, это возможно:
Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?
Просто отследить, какая кнопка нажата.
По предыдущему вопросу. Я вставил sendkeys… в конец макроса, который запускается при нажатии кнопки на листе. Окно фильтра появляется и тут же закрывается. А как сделать, чтобы окно осталось, и пользователь мог выбрать данные?
Евгений, я разобрался, почему не выводилось окно с фильтром.
Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.
Вставьте в стандартный модуль (в примере — Module1) объявление глобальной переменной и код процедуры для кнопки:
Range("A1").CurrentRegion можно заменить на имя таблицы.
Евгений, а формулу в поле B2 оставлять или её можно удалить?
Можно удалить, если в таблице есть другие формулы. Я изменил код процедуры Worksheet_Calculate() в предыдущем примере, чтобы она не реагировала на изменение формул, а только на нажатие кнопки «OK» автофильтра. Range("A1") — это ячейка с кнопкой фильтра.
Евгений, спасибо за корректировку процедуры. Думаю, в ней и поле myString1 необязательно (и связанная проверка с ним), т.к. пользователь может выбрать все значения.
Но… после команды SendKeys "%" событие Worksheet_Calculate() отрабатывается только один раз :(.
Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%" . Ограничение стоит здесь:
Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1") . Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.
В переменную myString записывается состояние таблицы до применения фильтра, в переменную myString1 — после применения. Затем их содержимое сравнивается: если они содержат разные значения — значит, фильтр был применен.
Здравствуйте! может я не туда пишу. вопрос
нужно посчитать кол-во строк в столбце «В» (от 100 до 5000) и вставить в формулу вместо 744
table = Range("B2:C744")
спасибо.
В столбце «B» не должно быть пустых ячеек до последней строки таблицы.
Как определить в VBA есть узор в ячейке?
Спасибо за достаточно полную информацию.
Был бы очень вам признателен, если бы вы подсказали:
как изменить ширину блоков верхнего колонтитула.
«Введена слишком длинная строка. Уменьшите число знаков.»
При изменении шрифта с полужирного на обычный всё нормально
воспринимается,
Прошу прощения, если не по адресу.
Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:
Добрый день, Владислав!
Замените строку
Добрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))
Здравствуйте, помогите, пожалуйста, решить задачу((
Разработать программу «Кредитный калькулятор» для расчета выплат по кредиту в условиях начисления процентов по аннуитетной схеме постнумерандо. Форма должна предусматривать ввод:
1) сумма кредита, допустимы 2 знака после запятой;
2) процентная ставка (годовая), допустимы 2 знака после запятой;
3) количество периодов (месяцев), целое положительное число.
Также форма должна содержать две кнопки:
1) «Ok» (выполнить расчет, заполнить лист Excel, освободить форму и закончить работу программы);
2) «Отмена» (освободить форму и закончить работу программы).
На лист Excel следует вывести 5 колонок:
1) номер периода;
2) остаток кредита;
3) сумма процентов за пользование кредитом, подлежащая к оплате;
4) сумма погашения основного долга (кредита);
5) общая сумма выплат за период.
Форма должна быть открыта из макроса «main» и там же освобождена по завершению своего использования. Форма должна содержать только код работы с формой и ввода данных. Логика верификации данных должна быть, по возможности, отделена от кода формы. Бизнес-логика обязательно должна быть отделена от кода формы.
Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.
Добрый день, Евгений! Я только начинаю работать с VBA. Помогите, пожалуйста, прописать код для автоматического перемещения курсора на ячейку вправо после заполнения предыдущей.
Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).
Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 for Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Excel Starter 2010 Еще. Меньше
Существует несколько способов запуска макроса в Microsoft Excel. Макрос — это действие или набор действий, с помощью которых можно автоматизировать различные задачи. Макрос записывется на Visual Basic для приложений программирования. Макрос всегда можно запустить, нажав кнопку Макрос на вкладке Разработчик на ленте. В зависимости от того, как макрос назначен для запуска, его также можно запустить, нажав сочетание клавиш сочетание клавиш, нажав кнопку на панели быстрого доступа или в настраиваемой группе на ленте либо щелкнув объект, рисунок или элемент управления. Кроме того, макрос можно запускать автоматически при запуске книги.
Перед запуском макроса
Перед началом работы с макросами следует включить вкладку Разработчик.
Чтобы Windows, перейдите в меню Параметры > >Настроить ленту.
Для Macперейдите на Excel > параметры. >ленты & панели инструментов.
Затем в разделе Настройка ленты в разделе Основныевкладки, в разделе Разработчик, нажмите кнопку ОК.
Откройте книгу, содержащую нужный макрос.
На вкладке Разработчик в группе Код нажмите кнопку Макросы.
В поле Имя макроса выберите макрос, который вы хотите запустить, и нажмите кнопку Выполнить.
У вас также есть другие варианты:
Параметры: добавление сочетания клавиш или описания макроса.
Шаг. Откроется Visual Basic редактора в первой строке макроса. Нажатие F8 позволит вам по одной строке пролиться между кодами макроса.
Изменить. Откроется редактор Visual Basic и вы сможете при необходимости изменить код макроса. После внесения изменений можно нажать F5, чтобы запустить макрос из редактора.
Вы можете добавить сочетание клавиш в макрос при его записи, а также добавить его к существующему макросу:
На вкладке Разработчик в группе Код нажмите кнопку Макросы.
В поле Имя макроса выберите макрос, который нужно назначить сочетанием клавиш.
Откроется диалоговое окно Параметры макроса.
В поле Сочетания клавиш введите любую букву в нижнем или верхнем регистре, которую вы хотите использовать с сочетаниями клавиш.
Для Windowsклавиша для букв в нижнем регистре — CTRL+letter. Для букв верхнего регистра это CTRL+SHIFT+Letter.
Для Macдля букв в нижнем регистре есть клавиши OPTION+COMMAND+LETTER,но клавиши CTRL+letter также будут работать. Для букв верхнего регистра это CTRL+SHIFT+Letter.
Будьте внимательны при назначении ярлыков, так как они будут переопределять все эквивалентные стандартные Excel, пока открыта книга с макросом. Например, если назначить макрос CTRL+Z,вы потеряете возможность отменить. В связи с этим обычно лучше использовать клавиши CTRL+SHIFT+БУКВА С верхнего регистра, например CTRL+SHIFT+Z, для которых в Excel нет эквивалентных Excel.
Список сочетаний клавиш CTRL, которые уже назначены в Excel, см. в статье Excel сочетания клавиш и клавиши для работы с функцией.
Введите описание макроса в поле Описание.
Чтобы запустить макрос нажатием кнопки на панели быстрого доступа, сначала необходимо добавить соответствующую кнопку на панель. Для этого см. назначение макроса кнопке.
Вы можете создать пользовательскую группу, которая появится на вкладке ленты, а затем назначить макрос кнопке в этой группе. Например, можно добавить настраиваемую группу "Мои макросы" на вкладку Разработчик, а затем добавить в новую группу макрос (который отображается как кнопка). Для этого см. назначение макроса кнопке.
Запуск макроса путем щелчка области графического объекта
Вы можете создать хот-спот на графическом элементе, который пользователи могут щелкнуть, чтобы запустить макрос.
На компьютере вставьте графический объект, например рисунок, или нарисуйте фигуру. Распространенный сценарий — нарисовать фигуру Скруглённый прямоугольник и отформатировали ее так, чтобы она выглядела как кнопка.
Чтобы узнать о вставке графического объекта, см. добавление, изменение и удаление фигур.
Щелкните правой кнопкой мыши созданный хот-спот и выберите пункт Назначить макрос.
Выполните одно из указанных ниже действий.
Чтобы назначить существующий макрос графическому объекту, дважды щелкните макрос или введите его имя в поле Имя макроса.
Чтобы записать новый макрос для назначения выбранному графическому объекту, нажмите кнопку Запись ,в диалоговом окне Запись макроса введите имя макроса и нажмите кнопку ОК, чтобы начать запись макроса. Завершив запись макроса, нажмите кнопку Остановить на вкладке Разработчик в группе Код.
Совет: Вы также можете нажать в левой части панели состояния.
Чтобы изменить существующий макрос, щелкните его имя в поле Имя макроса и выберите изменить.
На вкладке Разработчик нажмите кнопку Visual Basic, чтобы запустить редактор Visual Basic(VBE). Перейдите Project проводнике, чтобы найти модуль, содержащий макрос, который вы хотите запустить, и откройте его. Все макрос в этом модуле будут перечислены в области справа. Выберите макрос, который вы хотите запустить, разместив курсор в любом месте макроса и нажимая F5или выбрав в меню пункт Выполнить > Макрос.
Создайте Workbook_Open события.
В следующем примере событие Open используется для запуска макроса при открытии книги.
Откройте или создайте книгу, в которую нужно добавить макрос.
На вкладке Разработчик в группе Код нажмите кнопку Visual Basic.
В окне Project проводника щелкните правой кнопкой мыши объект ThisWorkbook и выберите просмотр кода.
Совет: Если окно Project проводника не отображается, в меню Вид выберите пункт Project проводник.
В списке Объект над окном Код выберите книга.
При этом автоматически создается пустая процедура для события Open, например:
Private Sub Workbook_Open()
Добавьте в процедуру следующие строки кода:
Private Sub Workbook_Open()Листы даты
MsgBox("Лист1").
Диапазон("A1"). Value = Date
End Sub
Переключитесь на приложение Excel и сохраните данную книгу как книгу с поддержкой макросов (.XLSM).
Примечание: Ячейка A1 на листе "Лист1" также содержит дату в результате Workbook_Open процедуры.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Читайте также: