К сожалению, цель вашей функции не различима. Поэтому я изменил это намерение. Приведенная ниже функция не будет возвращать как само случайное число, так и местоположение в 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.
Конечно, функция возвращает значение сгенерированного случайного числа.