Книга: Excel. Трюки и эффекты

Быстрое заполнение диапазона

Быстрое заполнение диапазона

Рассмотрим несколько несложных трюков, с помощью которых можно быстро заполнить любой диапазон необходимыми данными.

Первый способ

Предположим, что нам необходимо заполнить какой-нибудь диапазон последовательностью чисел от 1 до 100. Для решения этой задачи удобно воспользоваться макросом, код которого приведен в листинге 2.22 (этот код следует набрать в стандартном модуле редактора VBA).

Листинг 2.22. Быстрое заполнение диапазона

Sub FillCells()

Dim intStartVal As Integer ' Начальное значение

Dim intStep As Integer ' Шаг при изменении значения

Dim intEndVal As Integer ' Конечное значение

Dim intVal As Integer ' Текущее значение

Dim intCellOffset As Integer ' Смещение от начальной ячейки

' Установка параметров заполнения

intStartVal = 1

intStep = 1

intEndVal = 100

' Заполнение ячеек текущего столбца значениями от 1 до 100

For intVal = intStartVal To intEndVal Step intStep

ActiveCell.Offset(intCellOffset, 0).Value = intVal

intCellOffset = intCellOffset + 1

Next intVal

End Sub

Сразу после выполнения макроса диапазон, расположенный ниже текущей ячейки (в том же столбце), будет заполнен числами от 1 до 100 (заполнение начнется с активной ячейки).

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

Листинг 2.23. Заполнение через интервал

Sub FillCells()

Dim intStartVal As Integer ' Начальное значение

Dim intStep As Integer ' Шаг при изменении значения

Dim intEndVal As Integer ' Конечное значение

Dim intVal As Integer ' Текущее значение

Dim intCellOffset As Integer ' Смещение от начальной ячейки

Dim intCellStep As Integer ' Шаг при перемещении между _

заполняемыми ячейками

' Установка параметров заполнения

intStartVal = 3

intStep = 3

intEndVal = 30

intCellStep = 3

' Заполнение ячеек текущего столбца значениями от 3 до 30

For intVal = intStartVal To intEndVal Step intStep

ActiveCell.Offset(intCellOffset, 0).Value = intVal

intCellOffset = intCellOffset + intCellStep

Next intVal

End Sub

После выполнения данного макроса последовательность будет заполнена числами с 3 до 30, причем числа будут расположены в каждой третьей ячейке следующим образом: 3 (активная ячейка), 6, 9, 12…., 27, 30.

Второй способ

Допустим, что нам нужно быстро заполнить диапазон, состоящий из 10 ячеек в высоту и 5 ячеек в ширину, последовательностью чисел, расположенных по порядку от 1 до 50. Для решения данной задачи напишем в стандартном модуле редактора VBA представленный ниже код (листинг 2.24).

Листинг 2.24. Заполнение указанного диапазона

Sub FillCellRect()

Dim lngRows As Long, intCols As Integer ' Количество ячеек по _

горизонтали и вертикали

Dim lngRows As Long, intCol As Integer ' Координаты текущей

ячейки

Dim lngStep As Long, lngVal As Long

' Установка начального значения и шага заполнения

lngVal = 1

lngStep = 1

' Ввод количества ячеек по горизонтали и вертикали, которое _

необходимо заполнить

lngRows = Val(InputBox(«Количество ячеек в высоту»))

intCols = Val(InputBox(«Количество ячеек в ширину»))

' Отключение обновления экрана

Application.ScreenUpdating = False

' Заполнение ячеек значениями

For lngRow = 0 To lngRows – 1

For intCol = 0 To intCols – 1

ActiveCell.Offset(lngRow, intCol).Value = lngVal

lngVal = lngVal + lngStep

Next intCol

Next lngRow

' Включение обновления экрана

Application.ScreenUpdating = True

End Sub

В результате написания кода будет создан макрос FillCellRect. После его запуска откроется окно, в котором с клавиатуры нужно ввести количество ячеек в высоту (в нашем примере нужно указать значение 10). После нажатия в данном окне кнопки О К откроется аналогичное окно, в котором точно так же нужно ввести количество ячеек в ширину (в нашем примере нужно задать 5) и нажать ОК. После этого в соответствии с выполненными настройками будет автоматически заполнен диапазон, начиная с ячейки, которая была выделена (данная ячейка будет являться левой верхней в заполненном диапазоне). Изменив соответствующим образом код макроса, можно корректировать шаг последовательности, ее первое число (в строке IngVal = 1, которая входит в состав приведенного выше кода, указано, что первое число последовательности – 1) и другие параметры.

Третий способ

Данный способ заполнения диапазона также предусматривает написание макроса. Его преимущество состоит в том, что он быстрее способа, о котором рассказано в предыдущем примере. Код макроса (он должен быть написан в стандартном модуле редактора VBA) выглядит следующим образом (листинг 2.25).

Листинг 2.25. Заполнение диапазона

Sub FillCellRect1()

Dim lngRows As Long, intCols As Integer

Dim lngRow As Long, intCol As Integer

Dim lngStep As Long, lngVal As Long

Dim alngValues() As Long

Dim rgRange As Range

' Установка начального значения и шага заполнения

lngVal = 1

lngStep = 1

' Ввод количества ячеек по горизонтали и вертикали, которое _

необходимо заполнить

lngRows = Val(InputBox(«Количество ячеек в высоту»))

intCols = Val(InputBox(«Количество ячеек в ширину»))

ReDim alngValues(1 To lngRows, 1 To intCols)

Set rgRange = ActiveCell.Range(Cells(1, 1), _

Cells(lngRows, intCols))

' Заполнение массива alngValues значениями

For lngRow = 1 To lngRows

For intCol = 1 To intCols

alngValues(lngRow, intCol) = lngVal

lngVal = lngVal + lngStep

Next intCol

Next lngRow

' Перенос значений из массива в таблицу

rgRange.Value = alngValues

End Sub

Порядок заполнения диапазона такой же, как и в предыдущем примере, – после запуска макроса нужно последовательно указать количество ячеек в высоту и ширину. Результатом работы макроса будет заполненный диапазон (начиная с активной ячейки). Так же, как и в предыдущем примере, для изменения параметров заполнения диапазона (начальное число последовательности, шаг и др.) можно внести соответствующие изменения в код макроса.

Более высокая скорость работы данного алгоритма достигается благодаря тому, что сначала формируется двухмерный массив со значениями. Этот массив целиком передается объекту Range. Тем самым мы избегаем множества обращений к таблице, заменяя их одним, но эффективным.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.006. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз