2017-10-10 3 views
3

Je suis assez nouveau à VBA. J'essaie de randomiser une liste avec VBA. La liste comporte deux en-têtes "Nom" et "Cadrans". Je veux essayer de randomiser la liste avec une macro puis l'appliquer avec un bouton. J'ai essayé d'utiliser le code ci-dessous mais il randomise les noms et les nombres mais ne les garde pas ensemble. Signification Si Mon nom est Jon et que j'ai eu 3 cadrans, cela déplace mes cadrans ailleurs. Toute aide serait appréciée.Randomize List VBA

Merci,

Sub Random() 
     Dim tempString As String 
     Dim tempInteger As Integer 
     Dim i As Integer 
     Dim j As Integer 

     For i = 1 To 5 
      Cells(i, 2).Value = WorksheetFunction.RandBetween(0, 1000) 
     Next i 

    For i = 1 To 5 
     For j = i + 1 To 5 

     If Cells(j, 2).Value < Cells(i, 2).Value Then 

     tempString = Cells(i, 2).Value 
     Cells(i, 2).Value = Cells(j, 2).Value 
     Cells(j, 2).Value = tempString 
     tempInteger = Cells(i, 2).Value 
     Cells(i, 2).Value = Cells(j, 2).Value 
     Cells(j, 2).Value = tempInteger 

     End If 

     Next j 
    Next i 
End Sub 
+0

Salut, vérifiez la indentation de votre code et il serait utile si vous avez ajouté une image des données que vous travaillez avec s'il vous plaît. – QHarr

+0

Appel pour 'Randomize' avant la partie aléatoire de votre code – Moacir

+0

Possible duplicata de [Pourquoi le premier nombre aléatoire est toujours le même?] (Https://stackoverflow.com/questions/17046713/why-is-the-first -random-number-is-always-the-same) – Moacir

Répondre

4

Comme @jsotola dit, le tri semble la meilleure façon de le faire:

Sub Randomer() 
Dim i As Long, startRow As Long, endRow As Long 
Dim ws As Worksheet 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

Set ws = ActiveSheet 

startRow = 2 
endRow = WorksheetFunction.Max(_ 
    ws.Cells(ws.Rows.Count, 1).End(xlUp).Row, _ 
    ws.Cells(ws.Rows.Count, 2).End(xlUp).Row) 

For i = startRow To endRow 
    Randomize 
    ws.Cells(i, 3).Value = WorksheetFunction.RandBetween(1, 1000) 
Next i 

ws.Sort.SortFields.Clear 
ws.Sort.SortFields.Add Key:=Range("C" & startRow & ":C" & endRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 

With ws.Sort 
    .SetRange Range("A" & startRow & ":C" & endRow) 
    .Header = xlNo 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

ws.Range(ws.Cells(startRow, 3), ws.Cells(endRow, 3)).ClearContents 

Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 

End Sub 
+0

Y at-il un moyen de faire cela dans une boucle afin qu'il continue à vérifier tant que les lignes ont des données? – Dan

+0

J'ai édité ma réponse pour qu'elle exécute la boucle car autant de lignes ont des données (voir 'endRow = ...'), c'est ce que vous cherchiez? –

+0

Oui, merci. J'essayais de faire la boucle moi-même, mais je ne pouvais pas tout à fait enrouler ma tête autour d'elle. – Dan