从Excel范围中选择随机数

时间:2015-02-02 22:18:51

标签: excel vba random excel-formula

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

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

  

一个
  30个
  60
  70个
  40

3 个答案:

答案 0 :(得分:1)

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

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

这里是结果

enter image description here

这里是验证重复对的代码

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

这里是结果

enter image description here

答案 1 :(得分:0)

您的数据在 A1 A4,中尝试此宏:

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

答案 2 :(得分:0)

假设您的范围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