2017-10-13 81 views
0

所以我有一个按钮,随机挑选的数的范围为1至100和发生在一个细胞:VBA /宏按钮

Public Sub RangeValue() 
    Dim i As Long 
    Static n As Long, s As String 
    Const MIN = 1, MAX = 100, OUT = "L10", DEL = "." 
    Randomize 
    Do 
     i = Rnd * (MAX - MIN) + MIN 
     If 0 = InStr(s, i & DEL) Then 
      n = n + 1: s = s & i & DEL 
      Range(OUT) = i 
      If n > MAX - MIN Then n = 0: s = "" 
      Exit Do 
     End If: DoEvents 
    Loop 
End Sub 

我希望它现在挑从该范围和地点2数分成两个小区。我曾尝试过:

Public Sub RangeValue() 
    Dim i As Long 
    Static n As Long, s As String 
    Const MIN = 1, MAX = 100, OUT = "L10""L11", DEL = "." 
    Randomize 
    Do 
     i = Rnd * (MAX - MIN) + MIN 
     If 0 = InStr(s, i & DEL) Then 
      n = n + 1: s = s & i & DEL 
      Range(OUT) = i 
      If n > MAX - MIN Then n = 0: s = "" 
      Exit Do 
     End If: DoEvents 
    Loop 
End Sub 

但它不起作用。目标是将2个数字选取并放入2个单元格中,并让它们不重复,直到使用所有100个数字为止。

回答

0

我没有仔细看过你的代码,但为了你的代码,你也可以尝试下面的代码,这样更容易维护,并且会得到类似的结果。

Sub RandomValues() 
    With Range("L10:L11") 
     .Formula = "=RANDBETWEEN(1,100)" 
     .Value = .Value 
    End With 
    End Sub 
+0

它会重复。我希望它在重新使用数字前通过所有100个号码 – user8772722

0

如何:

Public arr(1 To 100) As Variant 

Sub ButtonCode() 
    If arr(1) = "" Then 
     For I = 1 To 100 
      arr(I) = I 
     Next I 
     Call Shuffle(arr) 
     Range("L10").Value = arr(1) 
    Else 
     N = Application.WorksheetFunction.Count(Range("L10:L" & Rows.Count)) 
     Range("L10").Offset(N) = arr(N + 1) 
    End If 
End Sub 

Public Sub Shuffle(InOut() As Variant) 
    Dim I As Long, J As Long 
    Dim tempF As Double, Temp As Variant 

    Hi = UBound(InOut) 
    Low = LBound(InOut) 
    ReDim Helper(Low To Hi) As Double 
    Randomize 

    For I = Low To Hi 
     Helper(I) = Rnd 
    Next I 


    J = (Hi - Low + 1) \ 2 
    Do While J > 0 
     For I = Low To Hi - J 
      If Helper(I) > Helper(I + J) Then 
      tempF = Helper(I) 
      Helper(I) = Helper(I + J) 
      Helper(I + J) = tempF 
      Temp = InOut(I) 
      InOut(I) = InOut(I + J) 
      InOut(I + J) = Temp 
      End If 
     Next I 
     For I = Hi - J To Low Step -1 
      If Helper(I) > Helper(I + J) Then 
      tempF = Helper(I) 
      Helper(I) = Helper(I + J) 
      Helper(I + J) = tempF 
      Temp = InOut(I) 
      InOut(I) = InOut(I + J) 
      InOut(I + J) = Temp 
      End If 
     Next I 
     J = J \ 2 
    Loop 
End Sub 

此代码将值添加到起始细胞L10,不重复的名单。

编辑#1:

这应该会更好:

Dim arr(1 To 100) As Variant 
Dim clicks As Integer 

Sub ButtonCode2() 
    If arr(1) = "" Then 
     For I = 1 To 100 
      arr(I) = I 
     Next I 

     Call Shuffle(arr) 

     Range("L10").Value = arr(1) 
     Range("L11").Value = arr(2) 
     clicks = 3 
    Else 
     Range("L10").Value = arr(clicks) 
     Range("L11").Value = arr(clicks + 1) 
     clicks = clicks + 2 
    End If 
End Sub 

(离开洗牌代码是)

+0

它给了我一个错误:常量,固定长度的字符串,数组,用户定义的tyoes不允许作为公共成员 – user8772722

+0

@ user8772722奇怪的........ ..........如果您使用** Dim **代替** Public **,会发生什么? –

+0

这种工作。但我的目标是在1-100范围内有两个数字,并显示在单元格L10和L11中。我需要这些数字永远不会重复或相同。意思是,它需要50个点击该按钮才能通过所有数字 – user8772722