Выбор случайного числа из набора без повторения в Excel - PullRequest
0 голосов
/ 03 марта 2019

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

Example

Это картина того, что я хотел бы сделать, таблица результатов - это то, чего я хотел бы достичь.По сути, у вас есть выбор различных номеров, которые вы можете выбрать в столбце выбора.Я хочу заполнить столбцы «Результат» случайно выбранными числами из столбца «Выбор», без повторений, всегда начиная с самого большого номера из столбца «Выбор» и начиная с него вниз.

Существуют столбцы «Проверить», чтобы определитьсколько будет розыгрышей.Если строка «Сумма проверки» равна 1, то результат для этого столбца всегда будет равен 0,8, что является максимальным возможным отбором.Если сумма строки проверки равна 2, то ячейки Outcome, связанные с ячейками Check со значением 1 в этой строке, будут либо 0,8, либо 0,1 - но я бы хотел, чтобы это была случайная ничья относительно того, какая ячейка равна0,8 и 0,1, если это имеет смысл.

Любое понимание на основе листов или VBA, как это сделать, будет высоко оценено.Спасибо как всегда за вашу помощь!

1 Ответ

0 голосов
/ 03 марта 2019

Может попробовать

Sub RandSel()
Dim Sel As Range, ChkRng As Range, OutRng As Range, RandSel As Double
Dim Sel2 As Range, ChkRng2 As Range, OutRng2 As Range, Cel As Range
Dim Rw As Long, Col As Long, Offs As Long, Sm As Long
RandSel = 0
Set Sel = Range("A2:A6")              ' may change to your requirement
Set ChkRng = Range("E2:I7")           ' may change to your requirement 
Set OutRng = Range("K2:O7")           ' may change to your requirement

For Rw = 1 To OutRng.Rows.Count
Set ChkRng2 = Range(ChkRng(Rw, 1), ChkRng(Rw, ChkRng.Columns.Count))  'set range to the row only to evelte repeatation of value
Set OutRng2 = Range(OutRng(Rw, 1), OutRng(Rw, OutRng.Columns.Count)) 'set range to the row only to evelte repeatation of value
    For Col = 1 To OutRng.Columns.Count
    Sm = Application.WorksheetFunction.Sum(ChkRng2)
        If ChkRng(Rw, Col).Value = 0 Or Sm = 0 Then
        RandSel = 0
        Else
        Set Sel = Range(Sel(1, 1), Sel(Sm, 1))
        idx = WorksheetFunction.RandBetween(1, Sm)
        RandSel = Sel(idx, 1)

        If Col > 1 Then
        Set OutRng2 = Range(OutRng(Rw, 1), OutRng(Rw, Col - 1)) ' set to upto the column in process
        Do While WorksheetFunction.CountIf(OutRng2, RandSel) > 0 ' check only after 1st col
            Set Sel2 = Nothing                                      ' set Sel to range Sel2 - Used value
                For Each Cel In Sel.Cells
                 If Cel.Value <> RandSel Then
                        If Sel2 Is Nothing Then
                        Set Sel2 = Cel
                        Else
                        Set Sel2 = Union(Sel2, Cel)
                        Sm = Sel2.Cells.Count
                        End If
                        End If
                    Next
                    If Sm > 1 Then
                    idx = WorksheetFunction.RandBetween(1, Sm)
                    Else
                    idx = 1
                    End If
                RandSel = Sel2(idx, 1)
            Loop
        End If
    End If
    OutRng(Rw, Col).Value = RandSel
    Next Col
Next Rw
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...