Создать пользовательскую функцию для возврата случайного значения ячейки из диапазона - PullRequest
0 голосов
/ 21 апреля 2020

Я любитель VBA и пытаюсь создать пользовательскую функцию, которая возвращает случайное значение из известного диапазона. Я, должно быть, что-то делаю не так с приведенным ниже кодом, потому что это приводит к тому, что программа обрабатывает sh.

. Вы представляете, как я могу внести исправления, которые позволят функции проходить через l oop через каждый ячейка диапазона, пока значение ячейки не станет равным случайному числу, которое было произвольно связано 1 и 1000?

Большое спасибо за любые мысли!

Function RandinList(InRange As Range) As Long

Dim random As Long
Dim cell As Range

Do

    random = Int((1000 - 1 + 1) * Rnd + 1)

    For Each cell In InRange
        If Not random = cell Then Exit For
    Next cell

Loop Until cell.Value = random

RandinList = random

End Function

1 Ответ

0 голосов
/ 21 апреля 2020

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

Function RandInList(InRange As Range) As Long

    Dim Random As Long
    Dim Fnd As Range

    Random = Int((1000 - 1 + 1) * Rnd + 1)
    Set Fnd = InRange.Find(Random, , xlValues, xlWhole)
    If Fnd Is Nothing Then
        MsgBox "The generated random number " & Random & vbCr & _
               "wasn't found in the given range.", _
               vbInformation, "Number not found"
    Else
        Set InRange = Fnd
    End If
    RandInList = Random
End Function

Как видите, я не подхватил вашу идею про l oop через клетки. Просмотр 1000 ячеек вызовет заметную задержку. Find мгновенно.

Я использовал следующий код для проверки моей функции.

Private Sub TestRandInList()

    Dim Rng As Range
    Set Rng = Range("A2:G20")
    Debug.Print RandInList(Rng), Rng.Address
End Sub

Как видите, сначала он устанавливает Set Rng = Range("A2:G20"), а затем запрашивает Rng.Address после вызов функции. Фактически, адрес мог быть изменен в функции, здесь: Set InRange = Fnd. Итак, если Random был найден, он содержит адрес ячейки. С другой стороны, если он не был найден, адрес Rng остается без изменений. В своей процедуре вызова вы можете проверить успех следующим образом: If Rng.Cells.Count = 1 Then ячейка была найдена. Это связано с тем, что если диапазон не изменился, он будет иметь гораздо больше ячеек, чем 1.

Конечно, функция возвращает значение сгенерированного случайного числа.

...