For i = 1 To intMax
aintValues(i) = i
Next i
' Занесение значений в выходной массив aintOut, в произвольном _
порядке выбирая их из aintValues
Randomize
For intRow = 1 To Application.Caller.Rows.Count
For intCol = 1 To Application.Caller.Columns.Count
' Определение номера элемента из aintValues
i = Rnd * intMax
If i = 0 Then i = 1
' Занесение этого элемента в выходной массив
aintOut(intRow, intCol) = aintValues(i)
' Уменьшение массива aintValues (то есть еще один его _
элемент выбран) – замена выбранного элемента последним _
в массиве
aintValues(i) = aintValues(intMax)
intMax = intMax – 1
Next intCol
Next intRow
' Возвращение массива значений
dhGetRandomValues = aintOut
End Function
Характерной особенностью данной функции является то, что она не имеет аргументов. Пример результата выполнения функции представлен на рис. 2.9.
Рис. 2.9. Случайные числа в диапазоне
Синтаксис созданной функции выглядит так:
=dhGetRandomValues()
Данную формулу нужно применить сразу ко всему предварительно выделенному диапазону – для этого после ввода ее в строку формул следует нажать комбинацию клавиш Ctrl+Shift+Enter. На рис. 2.9 в произвольном порядке разбросано 40 разных чисел, так как в диапазоне 40 ячеек (10 по высоте и 4 по ширине).
Случайные числа – на основании диапазона
Трюк, который мы рассмотрим в данном подразделе, по своей функциональности несколько напоминает предыдущий. Различие заключается в том, что здесь в случайном порядке генерируются числа, содержащиеся в определенном диапазоне (этот диапазон является единственным аргументом рассматриваемой функции). Код функции выглядит следующим образом (листинг 2.76).
Function dhGetRandomValues1(rgSource As Range) As Variant
Dim intRow As Integer ' Номер текущей строки
Dim intCol As Integer ' Номер текущего столбца
Dim avarOut() As Variant ' Выходной массив (двумерный)
Dim avarValues() As Variant ' Массив с возможными значениями
Dim intValCount As Integer ' Количество возможных значений
Dim cell As Range
Dim i As Integer
ReDim avarOut(1 To Application.Caller.Rows.Count, 1 To _
Application.Caller.Columns.Count)
' Всего нужно чисел...
intValCount = rgSource.Rows.Count * rgSource.Columns.Count
ReDim avarValues(1 To intValCount)
' Заполнение массива avarValues значениями из указанного _
диапазона
For Each cell In rgSource
i = i + 1
avarValues(i) = cell.Value
Next cell
' Занесение значений в выходной массив avarOut, в произвольном _
порядке выбирая их из avarValues
Randomize
For intRow = 1 To Application.Caller.Rows.Count
For intCol = 1 To Application.Caller.Columns.Count
' Определение номера элемента из avarValues
i = Rnd * intValCount
If i = 0 Then i = 1
' Занесение этого элемента в выходной массив
avarOut(intRow, intCol) = avarValues(i)
Next intCol
Next intRow
' Возвращение массива значений
dhGetRandomValues1 = avarOut
End Function
Для применения данной функции необходимо иметь диапазон с исходными данными. Синтаксис функции выглядит следующим образом (пример):
=dhGetRandomValues1(A1:C5)
Здесь А1: С5 – диапазон с исходными данными. Как и в предыдущем примере, данная функция применяется ко всему предварительно выделенному диапазону—с помощью сочетания клавиш CtrL+Shift+Enter. После применения функции данные исходного диапазона будут в произвольном порядке разбросаны в новом диапазоне.