Функция RandomRowsFromArray предназначена для выборки из двумерного массива случайных строк.К примеру, исходный массив (таблица) имеет размер 1000*20 (1000 строк, и 20 столбцов) В прикреплённом к статье файле вы найдете пример такого макроса: Sub ПримерИспользования_RandomRowsFromArray() ' считываем массив с листа arr = [a1:e20].Value ' считываем количество строк в выборке Количество = Val([NewCount]) ' выбираем строки из массива случайным образом (получаем новый массив newarr) newarr = RandomRowsFromArray(arr, Количество) ' заносим результат на лист (справа от исходных данных) Range("g1").Resize(UBound(newarr, 1), UBound(newarr, 2)).Value = newarr End Sub Код функции RandomRowsFromArray: Function RandomRowsFromArray(ByRef arr, ByVal count&) ' Функция выбирает из двумерного массива arr в случайном порядке count& строк. ' Возвращает массив (равный исходному по ширине), содержащий выбранные строки ' Подразумевается нумерация строк массива с единицы (Option Base 1) On Error Resume Next If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical, _ "Ошибка в функции RandomRowsFromArray": End rc& = UBound(arr, 1) ' если строк в массиве меньше, чем требуется выбрать, - возвращаем исходный массив If rc <= count& Then RandomRowsFromArray = arr: Exit Function If count& <= 0 Then MsgBox "Количество выбираемых строк должно быть >0", vbCritical, _ "Ошибка в функции RandomRowsFromArray": End Dim coll As New Collection, i As Long While coll.count < count& ' генерируем несовпадающие случайные числа в количестве count& Randomize n& = Fix(Rnd() * rc + 1): coll.Add n, CStr(n) iter& = iter& + 1: If iter& > count& * 100# Then MsgBox "Зацикливание функции", vbCritical, _ "Ошибка в функции RandomRowsFromArray": End Wend ReDim newarr(1 To count&, LBound(arr, 2) To UBound(arr, 2)) For i = 1 To coll.count n& = coll(i): For j = LBound(arr, 2) To UBound(arr, 2): newarr(i, j) = arr(n, j): Next j Next RandomRowsFromArray = newarr ' возвращаем сформированный массив End Function
|
|||||||

Комментарии
Отправить комментарий