Эта функция вернет случайное число, которого нет в вашем списке - ну, почти.
Function RandomNumber_PS() As Integer
' let your function return the random number found
Dim Fun As Integer ' this will be the function's return value
Dim Ws As Worksheet
Dim Fnd As Range
Dim Tbl As Range
Dim i As Integer
Set Ws = ActiveWorkbook.Worksheets("Sheet2")
Set Tbl = Ws.ListObjects("Table1").DataBodyRange.Columns(1)
Randomize ' selects a random seed number
Do
Fun = Int((100 * Rnd) + 1)
Set Fnd = Tbl.Find(Fun, LookAt:=xlWhole)
' leave the loop if Fun wasn't found in the table.
If Fnd Is Nothing Then Exit Do
i = i + 1 ' emergency exit
Loop While i < 300
If i = 300 Then
MsgBox "I haven't been able to find a random number.", _
vbInformation, "Failure notice"
End If
RandomNumber_PS = Fun
End Function
По мере того, как вы подходите к концу выбора, который вы можете предложить, - если ваша система когда-либо допускает такой вхождение может произойти - может быть лучше создать список доступных номеров и выбрать один из них случайным образом. Если вы решите сделать это, возникнет вопрос, почему вы не делаете это с самого начала, для всех.
Система будет состоять в том, чтобы создать массив всех доступных чисел, скажем Arr = Array(1,3,7,13)
, а затем выбрать случайный индекс. В этом случае выберите число от 1 до 4, и ваше случайное число будет Arr (rnd). Я запрограммирую это и добавлю в свой ответ после обеда.
Вот обещанный вариант.
Function RandomNumber_PS2() As Integer
' let your function return the random number found
Const RandomLimit As Integer = 100 ' reset to suit
Dim Ws As Worksheet
Dim TblRng As Range
Dim Fnd As Range
Dim Arr As Variant, Lst() As Integer
Dim Idx As Integer
Dim R As Long
Set Ws = ActiveWorkbook.Worksheets("Sheet2")
Set TblRng = Ws.ListObjects("Table1").DataBodyRange.Columns(1)
ReDim Lst(1 To RandomLimit)
Arr = TblRng.Value
For R = 1 To RandomLimit
Set Fnd = TblRng.Find(R, LookAt:=xlWhole)
If Fnd Is Nothing Then
Idx = Idx + 1
Lst(Idx) = R
End If
Next R
ReDim Preserve Lst(1 To Idx)
Select Case Idx
Case 0
MsgBox "There are no more tasks to alot.", _
vbInformation, "Failure notice"
Case 1
RandomNumber_PS2 = Lst(1)
Case Else
Randomize ' selects a random seed number
RandomNumber_PS2 = Lst(Int((Idx * Rnd) + 1))
End Select
End Function
Кстати, вы можете развернуть решение как UDF и вызвать функцию из лист:
Лист2! [B10] =RandomNumber_PS2()