Chiffres aléatoires conditionnés

Xorg

XLDnaute Nouveau
Bonjour à toutes zé à tous.

Dans un liste de données aléatoires (de 1 à 10), quelqu'un peut-il m'indiquer comment arrêter la fonction dès que : dans les lignes précédentes, les 10 chiffres sont déjà sortis. Bien sûr cette action ne peut s'exécuter à partir de la ligne 11. En rouge dans le fichier joint.

Merci de par avance de votre aide toujour pécieuse !
 

Pièces jointes

  • Alea.xls
    29.5 KB · Affichages: 43
  • Alea.xls
    29.5 KB · Affichages: 45
  • Alea.xls
    29.5 KB · Affichages: 45

Victor21

XLDnaute Barbatruc
Re : Chiffres aléatoires conditionnés

Bonsoir, Xorg.

J'ai du mal à comprendre votre question.

...comment arrêter la fonction dès que : dans les lignes précédentes, les 10 chiffres sont déjà sortis.

Est-ce à dire que vous voulez que dès que 10 nombres différents sont sortis dans la colonne A, la fonction Alea s'arrête ? Ou bien ...

Les deux seules manières, à ma connaissance, d'arrêter la modification de ces nombres sont :
1° calcul sur ordre (Outils, Options, Calcul)
1° Un copier, collage spécial, valeurs.
 

KenDev

XLDnaute Impliqué
Re : Chiffres aléatoires conditionnés

Bonjour,

Une macro, à coller dans un module standard, qui réalise la tache demandée (on peut choisir un autre nombre que 10 au départ), à lancer depuis une feuille dont la colonne 1 est vide. Cordialement

KD

VB:
Option Explicit

Sub NAleaAll()
Dim x As Long, rw As Long, cpt As Long, i As Long, b As Boolean
Dim oWs As Worksheet, MyTab() As Long

    
    Set oWs = ActiveSheet
    x = Application.InputBox(prompt:="Combien de chiffres ?", Type:=1, Default:=10)
    rw = 1 'ligne
    cpt = 1 'compteur
    
    Do While cpt < x
    
        'nombre aléatoire
        Randomize
        oWs.Cells(rw, 1) = Int(x * Rnd) + 1
        oWs.Cells(rw, 1).Copy
        oWs.Cells(rw, 1).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
        
        If rw = 1 Then
            'cas particulier 1ère écriture
            ReDim MyTab(1 To cpt)
            MyTab(cpt) = oWs.Cells(rw, 1)
            
        Else
            'sinon
            For i = 1 To cpt
                b = True
                If oWs.Cells(rw, 1) = MyTab(i) Then
                    'déjà sorti
                    b = False
                    Exit For
                End If
            Next i
            'nouveau
            If b = True Then
                cpt = cpt + 1
                ReDim Preserve MyTab(1 To cpt)
                MyTab(cpt) = oWs.Cells(rw, 1)
            End If
            
        End If
        rw = rw + 1
        
    Loop
    
        Set oWs = Nothing
End Sub
 

Xorg

XLDnaute Nouveau
Re : Chiffres aléatoires conditionnés

Bonsoir, Xorg.

J'ai du mal à comprendre votre question.



Est-ce à dire que vous voulez que dès que 10 nombres différents sont sortis dans la colonne A, la fonction Alea s'arrête ? Ou bien ...

Les deux seules manières, à ma connaissance, d'arrêter la modification de ces nombres sont :
1° calcul sur ordre (Outils, Options, Calcul)
1° Un copier, collage spécial, valeurs.

Oui c'est ça je souhaiterai que la fonction aléa s'arrête dès la sortie des 10 chiffres. Bon je me mets au boulot et j'assaie votre code. Je vous tiens au courant, merci !!
 

Xorg

XLDnaute Nouveau
Re : Chiffres aléatoires conditionnés

Je viens de tester la macro en l'associant à un bouton. C'est exactement ce que je cherchais comme solution. En plus ta macro affiche la cellule de fin, bravo!
Elle va servir à un pote prof de math pour son cours sur la théorie des Grands nombres.
Merci KenDev !
 

KenDev

XLDnaute Impliqué
Re : Chiffres aléatoires conditionnés

Bonjour Xorg, Victor

@Xorg Si c'est pour un prof de maths, ça change tout ;-) Une petite amélioration pour des tests en série :
Coller le code suivant dans un module et appeler par un bouton la macro 'NAleaAll_Param'. 4 entrées sont demandées : Chiffre de départ, Chiffre de fin, Pas et Nombre de boucle. Exemple, avec les entrées 10,25,5,3 l'opération du code précédent sera faite pour x=10, x=15, x=20, x=25 le tout 3 fois. Les 12 résultats (en nombre de tirages et en temps nécessaire) seront notés en colonnes 2, 3, 4 lignes 10, 15, 20, 25.
Il est toujours possible de lancer l'ancienne version en appelant cette fois la sub NAleaAll_Single.
Fichier joint.

VB:
Option Explicit

Dim oWs As Worksheet

Sub NAleaAll_Param()
Dim bcl As Long, dep As Long, pas As Long, i As Long, x As Long, fin As Long

    Set oWs = ActiveSheet
    oWs.Cells.ClearContents
    dep = Application.InputBox(prompt:="Chiffre de départ ?", Type:=1, Default:=10)
    If dep = 0 Then Exit Sub
    fin = Application.InputBox(prompt:="Chiffre de fin ?", Type:=1, Default:=25)
    If fin = 0 Then Exit Sub
    If fin < dep Then Exit Sub
    pas = Application.InputBox(prompt:="Pas des essais suivants ?", Type:=1, Default:=5)
    If pas = 0 And fin <> dep Then
        MsgBox "La fin ne sera jamais atteinte"
        Exit Sub
    End If
    bcl = Application.InputBox(prompt:="Combien de boucles ?", Type:=1, Default:=3)
    If bcl = 0 Then Exit Sub
    
    i = 1
    x = dep
    
    Do While i <= bcl
        Do While x <= fin
            Call NAleaAll(x)
            x = x + pas
        Loop
        i = i + 1
        x = dep
    Loop
    
    Set oWs = Nothing
    
End Sub

Sub NAleaAll_Single()
    Set oWs = ActiveSheet
    oWs.Columns(1).ClearContents
    Call NAleaAll
    Set oWs = Nothing
End Sub

Private Sub NAleaAll(Optional ByVal x)
Dim rw As Long, cpt As Long, i As Long, b As Boolean
Dim MyTab() As Long, vTim As Double, n As Long

    If IsMissing(x) Then x = Application.InputBox(prompt:="Nombre a atteindre  ?", Type:=1, Default:=10)
    If x = 0 Then Exit Sub
    rw = 1 'ligne
    cpt = 1 'compteur
    vTim = Now
    oWs.Columns(1).ClearContents
    Do While cpt < x
   
        'nombre aléatoire
        Randomize
        oWs.Cells(rw, 1) = Int(x * Rnd) + 1
        oWs.Cells(rw, 1).Copy
        oWs.Cells(rw, 1).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
       
        If rw = 1 Then
            'cas particulier 1ère écriture
           ReDim MyTab(1 To cpt)
            MyTab(cpt) = oWs.Cells(rw, 1)
           
        Else
            'sinon
           For i = 1 To cpt
                b = True
                If oWs.Cells(rw, 1) = MyTab(i) Then
                    'déjà sorti
                   b = False
                    Exit For
                End If
            Next i
            'nouveau
           If b = True Then
                cpt = cpt + 1
                ReDim Preserve MyTab(1 To cpt)
                MyTab(cpt) = oWs.Cells(rw, 1)
            End If
           
        End If
        rw = rw + 1
       
    Loop
    
    n = Int((Now - vTim) * 86400) + 1
    
    i = 2
    Do While oWs.Cells(x, i) <> ""
        i = i + 1
    Loop
    
    oWs.Cells(x, i) = rw & " tir, " & n & " s"
   
End Sub

Cordialement

KD

Edit : Texte, Code et fichier corrigés
 

Pièces jointes

  • CAC_v2.xls
    38.5 KB · Affichages: 45
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 297
Membres
104 092
dernier inscrit
karbone57