Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Chiffres aléatoires conditionnés

  • Initiateur de la discussion Initiateur de la discussion Xorg
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

X

Xorg

Guest
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

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.
 
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
 
Re : Chiffres aléatoires conditionnés


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 !!
 
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 !
 
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

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

  • Question Question
Microsoft 365 MFC dans tableau
Réponses
2
Affichages
361
Réponses
3
Affichages
1 K
Réponses
10
Affichages
791
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…