Найти тему
VBA Excel с нуля

VBA Excel № 114. Дублирование строк на известное значение.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Доброго времени суток уважаемые читатели!

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

Скриншот с моего ноутбука
Скриншот с моего ноутбука

В столбце "А" вводятся имена участников, в столбце "В" указывается количество кассовых чеков, предоставленных каждым покупателем в магазине с названием, например, "Хочу купить". Столбец "С" содержит случайные числа, сгенерированные функцией СЛЧИС(). Победитель определяется путем сортировки данных в третьем столбце, где наибольшее случайное число соответствует выигрышу.

Теперь необходимо продублировать строки так, чтобы количество строк для каждого участника лотереи соответствовало количеству предоставленных им кассовых чеков. Например, если участник Иван предоставил три чека, то для него создаются три строки.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Объектная переменная КЧек инициализирована ячейкой B2 – первой ячейкой с числовым значением. Вставка новых строк выполняется в цикле, а копирование осуществляется методом FillDown (заполнить).

Метод FillDown в VBA (Visual Basic for Applications) предназначен для копирования содержимого ячеек вниз по столбцу. Этот метод используется для быстрого заполнения ячеек в столбце данными из верхней ячейки.

Значение переменной КЧек увеличивается на единицу, после чего выбирается следующий участник лотереи. Цикл выполняется до тех пор, пока не встретится пустая ячейка.

И конечно, давайте разберем построчно код:

  • Sub ДубликатыСтрок(): Объявление подпрограммы (макроса) с именем "ДубликатыСтрок". Все инструкции макроса будут выполняться при его вызове.
  • Dim КЧек As Range: Объявление переменной КЧек как объекта типа Range, предназначенного для представления ячейки или диапазона в Excel.
  • Set КЧек = Range("B2"): Инициализация переменной КЧек объектом Range, представляющим ячейку B2.
  • Do While Not IsEmpty(КЧек): Начало цикла "Do While", который будет выполняться до тех пор, пока ячейка, представленная переменной КЧек, не станет пустой.
  • If КЧек > 1 Then: Проверка условия: если значение ячейки КЧек больше 1, то выполняются следующие действия.
  • Range(КЧек.Offset(1, 0), КЧек.Offset(КЧек.Value - 1, 0)).EntireRow.Insert: Вставка новых строк в листе Excel. КЧек.Offset(1, 0) представляет следующую ячейку после КЧек, а КЧек.Offset(КЧек.Value - 1, 0) представляет последнюю из добавляемых строк. Метод EntireRow.Insert вставляет пустые строки между ними.
  • Range(КЧек, КЧек.Offset(КЧек.Value - 1, 1)).EntireRow.FillDown:Копирование данных из верхней строки (исходной строки) в добавленные строки. Метод EntireRow.FillDown заполняет значения из верхней строки в добавленные строки.
  • End If: Завершение блока условия.
  • Set КЧек = КЧек.Offset(КЧек.Value, 0): Увеличение переменной КЧек на количество строк, равное значению в текущей ячейке КЧек. Таким образом, переходим к следующему участнику лотереи.
  • Loop: Завершение блока цикла "Do While". Если ячейка КЧек все еще не пуста, то цикл повторяется.
  • End Sub: Завершение подпрограммы.

На скриншоте представлен рабочий лист после выполнения данной процедуры.

Скриншот с моего ноутбука
Скриншот с моего ноутбука