Доработка макроса I

Доработка макроса I в vba excelВ прошлой статье мы освоили макрорекордер.

Однако, к сожалению, он не всегда дает ожидаемый результат.

Вот и в этот раз, как я заметил позднее, после первого обновления таблица начала сбоить.

Поэтому, как ни крути, придется нам все-таки влезть в код, и поправить ситуацию. А, за одним, рассмотрим логику программирования VBA.

Язык программирования, это, по сути, обозначение неких объектов (в Excel объектами являются, например, ячейки и листы), придание этим объектам каких-либо свойств (например, присвоение ячейке какого-либо значения) и назначение им команды (например, скопировать или вставить).

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

Итак — займемся разборкой записанного ранее макроса.

Изучение записанного макроса

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

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

Входим в закладку меню «Разработчик» и жмем на кнопку «Visual Basic«. Это мы открываем редактор для ручного ввода макросов на языке VBA. Вот что мы видим (с небольшими вариациями):

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

Вроде бы ничего сложного, правда?

Внесение исправлений в макрос

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

Но, собственно, нам нет необходимости выделять ненужные колонки.  Мы просто удалим их без выделения. А для этого нужно просто удалить команду выделения (select), и вместо нее вставить команду удаления обозначенных колонок. Таким образом строка будет выглядеть так: Columns(«F:J»).Delete Shift:=xlToLeft

К слову сказать — очистка буфера нам совсем не помешает. Зачем нам в оперативной памяти иметь скопированную таблицу прайса. Поэтому до команды удаления оставим команду очистки буфера.

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

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

Команда очистки пишется так: Clear. Это единственное слово, которое отсутствовало в макросе, но  его не мешало бы и запомнить. Для очистки листа нужно его выделить (Sheets(«Прайс123»).Select), и дать команду на очистку всех ячеек (Cells.Clear).

Далее, для вставки скопированного диапазона, я не выделял весь лист, а просто активировал ячейку A1 (Range(«A1»).Select). Полностью исправленный макрос выглядит так:

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *