На основании некоторого быстрого тестирования функция ShuffleArray
в размещенной ссылке фактически не возвращает рандомизированный массив.Поскольку вы храните свой массив в переменной strRandoms
, вы можете использовать функцию «на месте» в любом случае (функция «на месте» также будет более эффективной, поскольку ей не нужно создавать и заполнять совершенно новый массив, когдаnamed).
При вызове функции и передаче массива в качестве аргумента не включайте скобки после массива.Так что сделайте это:
ShuffleArrayInPlace a
' Or this:
Call ShuffleArrayInPlace(a)
Однако, чтобы сделать это успешно, вы должны слегка изменить сигнатуру метода ShuffleArrayInPlace
из этого (как сейчас):
Sub ShuffleArrayInPlace(InArray() As Variant)
к этому:
Sub ShuffleArrayInPlace(InArray As Variant)
Обратите внимание, что скобки после InArray
пропали.Зачем это делать?
Первоначально, в скобках, функция ожидает массив значений Variant
.Однако функция split
возвращает массив значений string .Изменяя сигнатуру метода для удаления скобок, вы в основном говорите, что можете передать в функцию все что угодно (массив строк, массив вариантов или даже что-то, что вообще не является массивом).По этой причине вы можете обновить ShuffleArrayInPlace
, чтобы выдавать ошибку, если аргумент не является массивом (используя функцию IsArray ).
Говоря о рефакторинге: в то время как алгоритм ShuffleArrayInPlace
использование для перемешивания массива понятно, это не обязательно лучший.Я бы пересмотрел случайное перемешивание Фишера-Йейтса и попытался реализовать его самостоятельно в VBA в качестве упражнения.
Итак, в заключение ...
- При вызове функции, которая принимает массив в качестве аргумента, не ставьте скобки после массива: `Call ShuffleArrayInPlace (strRandoms)
- Использование
ShuffleArrayInPlace
, а не ShuffleArray
. - Измените функцию
ShuffleArrayInPlace
, чтобы InArray
было Variant
, а не Variant()
.