VBA Excel. Выбор случайной ячейки

Выбор случайной ячейки из диапазона Excel с помощью кода VBA и присвоение ее значения переменной. Заполнение диапазона ячеек случайными числами.

Выбор случайной ячейки из диапазона

Задание

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

Решение

Для решения поставленной задачи в качестве произвольного диапазона ячеек отлично подойдет объект Selection, который при тестировании кода позволит не менять адрес диапазона в процедуре, а выбирать его непосредственно на рабочем листе.

Выделенный диапазон для выбора случайной ячейки

Выделенный диапазон для выбора случайной ячейки

Кнопка CommandButton1 добавлена из набора элементов управления рабочего листа ActiveX. Модуль листа открывается двойным кликом по кнопке в режиме конструктора.

Для выбора случайной ячейки будем использовать свойство диапазона Cells, функцию Rnd и оператор Randomize, инициализирующий генератор случайных чисел функции Rnd и задающий начальное число для генерации первого псевдослучайного числа.

1. Объявляем переменную x с универсальным типом данных (Variant), так как в конечном итоге ей будет присваиваться содержимое случайной ячейки, которое может быть любым:

2. Определяем количество ячеек в выделенном диапазоне:

3. Инициируем генератор случайных чисел функции Rnd, используя оператор Randomize без аргумента:

В этом случае, в качестве аргумента оператора Randomize, используется текущее значение системного таймера.

4. Выбираем случайный порядковый номер ячейки в выделенном диапазоне:

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

5. Присваиваем значение случайной ячейки переменной x, используя свойство диапазона Cells:

Как известно, индексация ячеек в диапазонах осуществляется не только по строкам и столбцам, но и по порядковым номерам. Нумерация идет слева направо и сверху вниз, ее мы здесь и используем.

6. Выводим значение переменной в информационное окно MsgBox:

Теперь весь код выбора случайной ячейки из выделенного диапазона и присвоения ее значения переменной в сборе:

И тот же код VBA Excel в сокращенном виде:

Заполнение ячеек случайными числами

Задание

Необходимо заполнить произвольный диапазон ячеек случайными числами с помощью кода VBA Excel.

Решение

В качестве заданного диапазона, как и в предыдущем решении, будем использовать блок выделенных ячеек. Пройти по всем ячейкам диапазона из кода VBA Excel нам поможет цикл For Each… Next.

Этот код заполняет по очереди все ячейки выделенного диапазона случайными числами в интервале от 0 до 10000. После нажатия кнопки процесс заполнения виден визуально, но его можно ускорить.

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

При запуске этого кода VBA Excel ячейки выбранного диапазона заполнятся случайными числами практически мгновенно.

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

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

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

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

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора. При добавлении в комментарий кода VBA Excel, вставьте перед его началом тег <pre> и по окончании кода </pre>.