Функция для создания случайного числа, которого нет в существующей таблице - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь вставить случайное число, которого нет в существующем диапазоне, в ячейку.

Цель состоит в том, чтобы выбрать номер вопроса из набора проблем, но я не буду sh для повторения той же проблемы снова.

Каждая уже решенная проблема указана в отдельном столбце таблицы на листе 2.

Мне интересно, могу ли я использовать IF / THEN для продолжения работы через случайные числа до тех пор, пока значение, отсутствующее в столбце таблицы, не будет заполнено в ячейке B10 на листе 1.

Function random_number_PS()

    Dim wrksht As Worksheet
    Dim tbl As ListObject
    Dim Random_Value As Integer

    Set wrksht = ActiveWorkbook.Worksheets("Sheet2")
    Set tbl = wrksht.ListObjects("Table1").ListColumns(1).DataBodyRange.Select

    Random_Value = Int((100 * Rnd) + 1)

        IF Random_Value 'this is where I am stuck

            Random_Value = Int((100 * Rnd) + 1)

        Else: ActiveWorkbook.Worksheets("Sheet2").Range("B10") = Random_Value

        End If

End Function

Вот таблица на листе 2, в которой есть значения, которые я не буду sh повторять в столбце номера проблемы.

Таблица с исключительными значениями enter image description here

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Эта функция вернет случайное число, которого нет в вашем списке - ну, почти.

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()

0 голосов
/ 20 марта 2020

Вот функция, которая должна соответствовать вашим потребностям, вы вызываете вызов как функцию или в своем рабочем листе, например, =RandNotInList(1, 100, B1:B100)

Function RandNotInList(Low As Long, High As Long, ExcludesRange As Range) As Long    

Dim random As Long
Dim cell As Range

'loop until a random is generated that is not in the range (this should include error handling that is not implemented)
Do
    random = Low + Int(Rnd() * (High + 1 - Low))

    For Each cell In ExcludesRange
        If random = cell Then Exit For
    Next cell

Loop Until cell Is Nothing

RandNotInList = random

End Function
...