从 Excel 范围内选择随机数

Choose random number from an Excel range

在下面的列表中它是一个 Excel 范围,我需要选择两个等于 100 的数字,所以在 return 中我想得到 (30 & 70) 或 (60 & 40)。我可以动态地做到这一点

我使用 Excel,但如果您对其他程序有任何建议,那就没问题了。

A
30
60
70
40

使用 A1A4 中的数据, 试试这个宏:

Sub JustKeepTrying()
    Dim N As Long, M As Long, wf As WorksheetFunction
    Set wf = Application.WorksheetFunction
    Do
        N = wf.RandBetween(1, 4)
        M = wf.RandBetween(1, 4)
        If N <> M Then
            If Cells(M, 1) + Cells(N, 1) = 100 Then
                MsgBox Cells(M, 1).Address & vbTab & Cells(M, 1).Value & vbCrLf _
                     & Cells(N, 1).Address & vbTab & Cells(N, 1).Value
                Exit Sub
            End If
        End If
    Loop
End Sub

这里是没有验证重复对的代码

Sub test()
    Dim x&, lastR&, oCell1 As Range, oCell2 As Range, Key As Variant
    Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
    x = 1
    lastR = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    For Each oCell1 In ActiveSheet.Range("A1:A" & lastR)
        For Each oCell2 In ActiveSheet.Range("A1:A" & lastR)
            If oCell1.Value + oCell2.Value = 100 Then
                Dic.Add x, "(" & oCell1.Value & " & " & oCell2.Value & ")"
                x = x + 1
            End If
        Next
    Next
    For Each Key In Dic
         Debug.Print Key, Dic(Key) 'output in immediate window all possible
    Next
    MsgBox Dic(WorksheetFunction.RandBetween(1, Dic.Count))
End Sub

这里是结果

这里是验证重复对的代码

Sub test()
    Dim x&, S$, S2$, check%, lastR&, oCell1 As Range, oCell2 As Range, Key As Variant
    Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
    x = 1
    lastR = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    For Each oCell1 In ActiveSheet.Range("A1:A" & lastR)
        For Each oCell2 In ActiveSheet.Range("A1:A" & lastR)
            check = 0
            If oCell1.Value + oCell2.Value = 100 Then
                S = "(" & oCell1.Value & " & " & oCell2.Value & ")"
                S2 = "(" & oCell2.Value & " & " & oCell1.Value & ")"
                For Each Key In Dic
                    If Dic(Key) = S Or Dic(Key) = S2 Then
                        check = 1: Exit For
                    End If
                Next
                If check = 0 Then
                    Dic.Add x, S
                    Debug.Print x, Dic(x)
                    x = x + 1
                End If
            End If
        Next
    Next
    MsgBox Dic(WorksheetFunction.RandBetween(1, Dic.Count))
End Sub

这里是结果

假设您的 A1:a11 范围内的数字从 0 到 100 步进 10 [0,10,20,...,90,100] 您可以使用此逻辑(此处,结果以蓝色突出显示)

Set BaseRange = Range("A1:a11")
    BaseRange.ClearFormats

'first number- rundomly find
With BaseRange.Cells(Int(Rnd() * BaseRange.Cells.Count) + 1)
    .Interior.Color = vbBlue
    FirstNo = .Value
End With

'second number find by difference- error handling required if there is no matching value for each number
BaseRange.Find(100 - FirstNo).Interior.Color = vbBlue