IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Création de 1000 ordres aléatoire avec règles de précédence


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Par défaut Création de 1000 ordres aléatoire avec règles de précédence
    Bonjour à tous,

    Alors voila je vous explique mon problème. Je cherche à avoir 1000 ordres aléatoires de chiffre entre 1 et 12. Jusque la rien de bien compliqué. Or je voudrais dans mes ordres aléatoires des groupements comme ceci :
    Groupement 1 : 2,7,9,10
    Groupement 2 : 11,12


    Exemple d'un ordre :
    5,2,7,9,10,4,6,11,12,1,3,8

    Le groupe 2 peut arriver avant le groupe 1.

    Ainsi j'aimerai avoir 1000 ordres aléatoires différents qui suit ces deux groupements obligatoirement. Je ne vois pas comment programmer cela. Si quelqu'un a une idée de la démarche à adopter. J'ai commencé à développer des trucs en vba sur excel mais rien de concret .

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 705
    Par défaut
    Bonjour,
    Je ne sais pas comment tu as écrit ton code pour trouver les ordres aléatoires, mais j'imagine que tu utilises chacun des nombres séparemment et que tu fais des combinaisons/permutations. Au lieu d'utiliser les nombres séparemment, tu pourrais utiliser une liste d'ensemble : ({1};{2;7;9;10};{3};{4};{5};{6};{8};{11;12}) et faire des permutations avec cette liste.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Par défaut
    Tout d'abord merci pour ta réponse riaolle. Je ne vois pas comment permuter des listes. Peux tu me donner la démarche à adopter stp ?

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 705
    Par défaut
    Ca dépend un peu de ce que tu veux faire avec tes combinaisons aléatoires. A quoi te servent-elles?
    En fait la question qui est pour moi la plus importante, c'est : est-ce qu'on a le droit à des doublons. En effet, tu dis :
    Je cherche à avoir 1000 ordres aléatoires
    Or aléatoire n'implique pas qu'il n'y a pas de doublons.

    Cas où les doublons d'ordre sont acceptés (plus facile ) :
    On a une liste : liste = ({1};{2;7;9;10};{3};{4};{5};{6};{8};{11;12}). Pour repérer un élément dans une liste, on utilise son range dans la liste. Par exemple liste(0) = {1}, liste(2) = {3}, liste(7) = {11;12} etc...
    On veut mettre ces éléments dans un autre ordre : il suffit d'appeler les éléments dans un autre ordre que celui de leur range. Tu as déjà un algorithme qui te permet d'avoir un ordre aléatoire de chiffres entre 1 et 12. Ici, il nous faut la même chose, mais entre 1 et 7 (il y a 7 éléments dans la liste). En lançant l'algo pour des chiffres entre 1 et 7 (on notera cet algo ordreAlea), tu auras un ordre des éléments dans ta liste. Par exemple :
    ordreAlea renvoie 7-5-2-4-3-1-6, à partir de cela tu créés l'ordre aléatoire avec la liste : liste(7)-liste(5)-liste(2)-liste(4)-liste(3)-liste(1)-liste(6), soit {11;12}-{6}-{2;7;9;10}-{4}-{3}-{1}-{6}
    Ca c'est pour l'explication. En ce qui concerne le code VBA. Ca dépend de ce que renvoie le code que tu as fait (combinaison aléatoire de 12 nombres). Supposons que ton code (pour moi ordreAlea) renvoie une liste de 7 chiffres (1 à 7) en ordre aléatoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Function combinaison() As String
        Dim listeOrdre(7) As Integer
        listeOrdre = ordreAlea          'liste de chiffres de 1 à 7 en ordre aléatoire
        Dim listeElements(7) As String
            listeElements(0) = "1"
            listeElements(1) = "2-7-9-10"
            listeElements(2) = "3"
            listeElements(3) = "4"
            listeElements(4) = "5"
            listeElements(5) = "6"
            listeElements(6) = "11-12"
        Dim i As Integer
        For i = 0 To 5      'on fait une boucle sur les éléments de la listeOrdre
            combinaison = combinaison & listeElements(listeOrdre(i)) & "-"      'listeOrdre(i) est un chiffre de 1 à 7, on récupère le listeOrdre(i)ème élément de listeElements
        Next i
        combinaison = combinaison & listeElements(listeOrdre(6))        'pour éviter le "-" à la fin
    End Function
    Bon, je ne sais pas si mes explications sont très claires...

    Cas où il ne peut pas y avoir de doublons
    Il faut faire un algorithme où tu récupères toutes les permutations possibles des chiffres de 1 à 7 et ensuite, tu fais (même principe que ci-dessus) les combinaisons.
    Dans une autre discussion, il était aussi question des algorithmes de permutations. Je peux te ré-écrire le principe d'un algo de permutations (bon, j'avoue, c'est un copier-coller )
    Si tu fais une recherche "algorithme de permutation" sur internet, tu trouveras des explications sur ce que c'est et sur la façon de l'implémenter.
    Voici une explication rapide :
    Soit une liste de n éléments dont on veut trouver toutes les permutations possibles : 1-2-3- ... - n. Il y a n! (n factoriel) permutations possibles.
    Pour trouver toutes les permutations possibles on suit les étapes suivantes :
    • on fixe le premier élément :1- 2-3-...-n
    • on trouve toutes les permutations de n-1 éléments à droite du premier élément --> il y en a (n-1)!
    • on fixe un autre élément en premier élément : 2- 1-3-...-n
    • on trouve les permutations des n-1 éléments à droite de ce nouveau premier élément --> il y en a (n-1)!
    • on fixe un autre élément en premier élément : 3- 1-2-...-n
    • on trouve les permutations des n-1 éléments à droite de ce nouveau premier élément --> il y en a (n-1)!
    • etc...

    On fait cela n fois, donc on trouve bien n fois (n-1)! permutations, soit n! permutations.
    Maintenant, me diras-tu : comment fais-t-on pour trouver les (n-1)! permutations quand on a fixé le premier élément? Ben..on fait la même chose avec les n-1 éléments. On fixe une élément, on trouve les (n-2)! permutations des autres éléments etc ...
    Ceci est donc un algorithme récursif, càd qu'on va faire appel à l'algorithme qu'on écrit dans l'algorithme même : attention à bien mettre une condition d'arrêt (un cas où on passera dans tous les cas et où l'on ne fait pas appel à l'algorithme lui-même). Ici, ce sera, si le nombre d'élément est égal à 1, alors la fonction retournera l'élément lui-même.
    Vu qu'on a parlé de factoriel (n!), on n'est pas trop trop étonné qu'on a affaire à un algorithme récursif. En effet, un exemple "simple" d'algo récursif est le calcul du factoriel.
    J'ai pas de code en tête, il faudrait y réfléchir en partant du principe que j'explique ci-dessus.

    Est-ce que tu comprends mon charabia?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Par défaut
    Ok j'ai compris ton raisonnement. Oui je ne peux pas avoir d'ordres doublons. En faite j'ai besoin d'un tableau excel avec 1000 ordres différents. Ici la fonction me renvoi une liste. Comment puis-je inserer cette liste dans 12 colonnes (étant donnée qu'il y a 12 chiffres ) dans mon tableau excel.

    Le code que j'ai actuellement insère dans chaque ligne sur 12 colonnes les chiffres de 1 a 12 de façon aléatoire. Le voici : >

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Sub Exple()
     
    '
    ' Test1 Macro
    '
        Dim pos As Integer
        Dim lig As Integer
        Dim limit As Integer
     
    '    lig = 3 'ligne de départ (1ère ligne à être remplie)
       For j = 3 To 1002
        lig = j
     
    '    Cells(lig, 2).Select
        For i = 1 To 12  'les 42 cas'
     
        pos = WorksheetFunction.RandBetween(1, 12)
     
        If IsEmpty(Cells(lig, pos)) Then
    '        MsgBox "pos vide " & pos
            Cells(lig, pos) = i
     
        Else
            limit = 1
            Do
            pos = pos + 1
            If pos = 14 Then
                pos = 2
            End If
            limit = limit + 1
            If limit = 14 Then
                Exit Do
            End If
    '        MsgBox "pos ? " & pos
            Loop While Not (IsEmpty(Cells(lig, pos)))
            Cells(lig, pos) = i
     
        End If
     
        Next
     
        Next
     
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2016
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 28
    Par défaut
    Finalement j'ai reussi à faire ce que je voulais. Voici ma solution pour les personnes interessées :

    Je lance ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Sub Exple()
     
    '
    ' Test1 Macro
    '
        Dim pos As Integer
        Dim lig As Integer
        Dim limit As Integer
     
    '    lig = 3 'ligne de départ (1ère ligne à être remplie)
       For j = 3 To 1002
        lig = j
     
    '    Cells(lig, 2).Select
        For i = 1 To 7 'les 42 cas'
     
        pos = WorksheetFunction.RandBetween(1, 7)
     
        If IsEmpty(Cells(lig, pos)) Then
    '        MsgBox "pos vide " & pos
            Cells(lig, pos) = i
     
        Else
            limit = 1
            Do
            pos = pos + 1
            If pos = 9 Then
                pos = 2
            End If
            limit = limit + 1
            If limit = 9 Then
                Exit Do
            End If
    '        MsgBox "pos ? " & pos
            Loop While Not (IsEmpty(Cells(lig, pos)))
            Cells(lig, pos) = i
     
        End If
     
        Next
     
        Next
     
    End Sub
    qui me permet d'avoir 1000 ordres différents de chiffre allant de 1 à 7.
    Ensuite via ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Function combinaison() As String
    Dim ligne  As Integer
     
     
    For ligne = 3 To 1002
     
            'On recupere l'ordre precedemment etablis dans excel
            Dim monTab(0 To 6) As String
            Dim j, colonne As Integer
     
            colonne = 2
            For j = 0 To 6
                monTab(j) = Cells(ligne, colonne).Value
                colonne = colonne + 1
            Next j
                '    Dim strMessage As String, Boucle As Integer
                '        strMessage = ""
                '            For Boucle = 0 To 6
                '                strMessage = strMessage & monTab(Boucle) & vbLf
                '            Next Boucle
                '
                '            MsgBox strMessage
     
     
        'On crée le nouvel ordre aleatoire prenant en compte les regroupement grace a l'ordre aleatoire precedemment etablis
        Dim listeElements(7) As String
            listeElements(1) = "1"
            listeElements(2) = "2;7;9;10"
            listeElements(3) = "3"
            listeElements(4) = "4"
            listeElements(5) = "5"
            listeElements(6) = "6"
            listeElements(7) = "11;12"
        Dim i As Integer
        For i = 0 To 5      'on fait une boucle sur les éléments de la monTab
            combinaison = combinaison & listeElements(monTab(i)) & ";"      'monTab(i) est un chiffre de 1 à 7, on récupère le monTab(i)ème élément de listeElements
        Next i
        combinaison = combinaison & listeElements(monTab(6))        'pour éviter le "-" à la fin
     
        'MsgBox combinaison
     
        'On insere le  nouvelle ordre dans excel
        Dim Ws As Worksheet
        Set Ws = Worksheets("Feuil3")
     
     
        Ws.Cells(ligne, 1).Value = combinaison
     
        Erase monTab
        combinaison = ""
     
     
    Next ligne
     
    End Function
    Je crée des nouveaux ordres (en utilisant les ordres générés précédemment )respectant les groupements dont j'ai parlé en debut de post et je les insères dans la feuil2 de mon excel.

    Merci de votre aide.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 493
    Par défaut
    salut

    dans ta recherche aléatoire tu oublis simplement les éléments qui se suivent
    ce qui fait que ton recherche aléatoire ne se fait que sur les valeurs
    1,2,3,4,5,6,8,11

    le plus simple étant de te créer un tableau avec ces 8 valeurs
    et de faire une recherche aléatoire dans se tableau
    si tu tombe sur le 2 .. tu impose la suite et pareil pour le 11
    mais cela va quand même bien flinguer ta distribution aléatoire

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2013
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Février 2013
    Messages : 317
    Par défaut Les ordes
    ça paraît simple de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pour ordre de 1 à 1000
    créer ordre aléatoire
    //tester ordre un par un
    si test plus grand que 10 alors
      stocker en groupe 2
    sinon
      stocker en groupe 1
    ordre suivant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/01/2017, 13h33
  2. Connection ou création d'une base interbase avec Delphi
    Par vincentj dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/01/2005, 10h59
  3. Réponses: 4
    Dernier message: 20/07/2004, 21h53
  4. Réponses: 2
    Dernier message: 26/05/2003, 19h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo