mail mail

Выборка случайных строк из двумерного массива

Функция RandomRowsFromArray предназначена для выборки из двумерного массива случайных строк.

К примеру, исходный массив (таблица) имеет размер 1000*20 (1000 строк, и 20 столбцов)
Нам требуется выбрать из этой таблицы, случайным образом, 50 строк
(получив, таким образом, таблицу размерами 50*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

ВложениеРазмер
RandomRowsFromArray.xls47 КБ

Комментарии

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

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
14 + 0 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.