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

Доработка макроса IV в vba excelВ прошлых статьях мы отредактировали записанный в макрорекордере макрос и начали писать часть этого макроса вручную.

Записали первый цикл, который протягивает наименование департамента до ячейки с нижней жирной границей.

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

Запись 2-го цикла

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

  • Начало 2-го цикла
    • Начало 1-го цикла
      • Скопировать значение переменной
      • Сместить переменную на 1 строку вниз
      • Вставить скопированное значение
    • Закончить цикл на ячейке с толстой нижней границей
    • Сместить переменную на 1 строку вниз
  • Закончить цикл если ячейка на две колонки справа от переменной пустая

Выглядеть дополненный макрос будет так:

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

Условие будет проверяться с помощью наиболее часто используемой логической команды «Если … То …». Выглядит она так: «If … Then … End If«. Вот так будет выглядеть окончательный вариант макроса, протягивающего наименования департаментов.

Завершение редактирования макроса

Но у нас есть еще отделы! Фактически, там те же самые циклы, только со смещением на одну колонку. Поэтому можно просто скопировать предыдущий макрос с момента, когда мы определяем адрес переменной, и сменить, во первых, этот адрес на B4, и там, где проверяется условие на пустые ячейки, делаем смещение не на две, а на одну колонку.

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

Это же условие вставляем в начало цикла, работающего с департаментами.

Вот что получилось у меня:

Теперь идем в старый макрос, удаляем оттуда все команды протягивания (они все типичные и выглядят как на картинке), и вставляем наш макрос без заголовка «Sub Протягивание()» и команды окончания макроса внизу «End Sub«. В конце макроса остаются команды изменения параметров колонок (их я удалять не стал) и команды скроллинга (их я удалил).

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

P.S.: К слову казать, нередко отчеты из 1С  тоже нуждаются в исправлениях. Можно, конечно, попросить об отладке программиста 1С, но не всегда такие есть под рукой. А заранее записанный макрос по типу этого вполне справится с исправлением любого выгруженного из 1С отчета.

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

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