2017-10-13 1 views
0

donc j'ai un bouton pour choisir au hasard un nombre d'une plage de 1 à 100 et dans une cellule:VBA/bouton Macro

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 

Je veux de choisir maintenant 2 numéro de cette gamme et lieu en deux cellules. J'ai essayé:

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 

Mais cela ne fonctionne pas. Le but est d'avoir 2 nombres choisis et mis dans 2 cellules, et ne les répète pas jusqu'à ce que tous les 100 nombres aient été employés.

Répondre

0

Je n'ai pas regardé votre code de près mais pour le même, vous pouvez également essayer le code comme ci-dessous qui est plus simple à maintenir et donnera des résultats similaires.

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

Il répétera. Je veux qu'il passe par tous les 100 numéros avant qu'il ne réutilise un nombre – user8772722

0

Que diriez-vous:

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 

Ce code ajouter des valeurs à la liste à partir de cellules L10, sans répétitions.

EDIT # 1:

Cela devrait être mieux:

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 

(laisser le code aléatoire comme cela est)

+0

Il me donne une erreur: Constantes, chaînes de longueur fixe, tableaux, tyoes définis par l'utilisateur ne sont pas autorisés en tant que membres du public – user8772722

+0

@ user8772722 Étrange ........ .......... Que se passe-t-il si vous utilisez ** Dim ** à la place de ** Public **? –

+0

Cela a fonctionné. Mais mon objectif est d'avoir 2 nombres de 1 à 100 et de les afficher dans les cellules L10 et L11. J'ai besoin que les chiffres ne soient jamais répétés ou soient les mêmes. ce qui signifie, il faudrait 50 clics de ce bouton pour parcourir tous les chiffres – user8772722