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 :

Parcourir une plage de cellules de manière aléatoire [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de luclucdu38
    Homme Profil pro
    autre
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Par défaut Parcourir une plage de cellules de manière aléatoire
    Bonjour,
    j'ai un petit problème en VBA que je n'arrive pas a solutionner.

    ===== Problème =====

    J'ai une plage de cellules allants de A1 à A10.
    Pour chaque cellule je voudrai écrire sur sa voisine de droite (plage de cellules allants de B1 à B10) l'ordre dans lequel mon programme à parcouru la plage de cellule.

    Or je ne sais trop comment faire. Je sais qu'il y a la fonction Random qui existe mais c'est tout.

    ===== Idée 1 =====

    Initialiser une liste {1,2,3,4,5,6,7,8,9,10}

    Mélanger cette liste

    Parcourir cette liste dans l'ordre

    ===== Questions =====

    1) Comment parcourir une plage de cellules aléatoirement ?

    2) Comment mélanger une liste ?

    ===============

    Je débute en VBA, pourriez-vous m'aider s'il vous plait ?

    Merci beaucoup

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Exemple :
    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
    Option Explicit
    '
    ' Etablir une référence à Microsoft Scripting Runtime (Outils / Références ...)
    '
     
    Sub Test()
    Const adrAléa As String = "B2"    '1° cellule recevant les N° aléatoires
    Const nbreN° As Integer = 10      'Nombre de N° aléatoires
    Dim dicOrdre As Dictionary        'Ordre aléatoire des N°
     
      Set dicOrdre = New Dictionary
      Call OrdreAléatoire(nbreN°, dicOrdre)
      Feuil1.Range(adrAléa).Resize(dicOrdre.Count, 1) = Application.Transpose(dicOrdre.Keys)
     
    End Sub
     
    Private Sub OrdreAléatoire(Quantité As Integer, dicOrdre As Dictionary)
    ' Renvoi un dictionnaire contenant les numéros de 1 à Quantité dans un ordre aléatoire
    '
    Dim ctr As Integer
    Dim aléa As Integer
     
    Randomize
    dicOrdre.RemoveAll
    For ctr = 1 To Quantité
      aléa = Int(Rnd * Quantité) + 1
      If Not dicOrdre.Exists(aléa) Then
        'si le numèro n'as pas déja été tiré, l'ajouter
        dicOrdre.Add aléa, ctr - 1
      Else
        'sinon réitérer le tirage
        ctr = ctr - 1
      End If
    Next
     
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Dans le même esprit :
    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
     
    Sub Aleatoire()
     
        Dim Dico As Object
        Dim I As Integer
        Dim Result As Integer
        Dim Max As Integer
     
        Max = 10
     
        Set Dico = CreateObject("Scripting.Dictionary")
     
        'initialise
        Randomize
     
        'boucle jusqu'à obtention des X nombres (ici Max = 10)
        Do
     
            'résultat
            Result = Int((Max * Rnd) + 1)
     
            'si pas déjà tiré...
            If Dico.exists(Result) = False Then
     
                'mémorise dans un dico
                Dico.Add Result, Result
     
                I = I + 1
     
                'et l'inscrit en colonne B
                Range("B" & I).Value = Result
     
            End If
     
        Loop While Dico.Count <> Max
     
    End Sub

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    un truc dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim dico,plage as range ,e as long,i as long 
    Set plage = Range("A1:A10")
    Set dico = CreateObject("Scripting.dictionary")
    Do
    e = Round((Rnd * plage.Cells.Count ))
    If Not dico.exists(e) And e > 0 Then
    dico(e) = ""
    i = i + 1
    plage.Cells(e).Offset(0, 1) = i
    End If
    Loop Until i = plage.Cells.Count
    End Sub
    les chiffres qui seront en colonne b seront l'ordre de passage
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    @patricktoulon on est dimanche tu est encore fatigué et tes yeux sont encore collés.
    Tu n'as pas prit la dernière version proposé par @unparia qui elle utilise deux boucles
    #15

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bon j'ai beau tourner cela dans tous les sens sans dico c'est pas possible

    seulement avec le meme nombre d'item que le plus grand

    comma ca c'est assez facile on inverse a chaque fois le i et le ind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test3()
    Dim tbl(300)
    For i = 1 To 300
    tbl(i) = i
    Next
    For i = 1 To UBound(tbl)
    ind = Round((Rnd * UBound(tbl)))
    temp = tbl(i)
    tbl(i) = tbl(ind): tbl(ind) = temp
    Next
    Range("A1:A300") = Application.Transpose(tbl)
    End Sub


    mais si je veux créer une liste de nombre aléatoire de 1 à 1000 sur un tableau de 100 je suis obligé de créer un dico pour la création
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut



    Salut !

    Patrick, tu peux te passer d'un Dictionary par permutations au sein d'une matrice …



    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re c'est bon j'ai trouvé
    oui marc c'est ce que l'exemple que j'ai donné fait on permute l'index( rnd*x)avec le i(itération de la boucle )

    mais pour cela il faut avoir une matrice remplie

    mais j'ai trouvé c'est bon en moins de 10 ligne et sans doublons!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test4()
    Dim tablo(1000), tabl, i As Long, ind As Long
    Randomize
    Do
    : ind = Round((Rnd * 1000))
    If tablo(ind) = "" Then tablo(ind) = "|" & ind: i = i + 1
    Loop Until i = 100
    Debug.Print Replace(Join(tablo, ","), ",", "")
    tabl = Split(Replace(Join(tablo, ","), ",", ""), "|")
    Range("A1:A100") = Application.Transpose(tabl)
    End Sub
    et la on a pas de matrice remplie ,on a qu'un tablo (1000) vide au départ et en une seule boucle

    après cerede dit que je suis mal réveillé hein !!!!
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    En fait avant de répondre moi j'aimerais savoir : A quoi ça sert ?

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    Utiliser un dictionnaire, pourquoi donc ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     tabl = Range("A1:A10")
     nb = UBound(tabl, 1) + 1
     For i = 1 To nb \ 2
      ou = Int(((nb - i) * Rnd) + 1)
      temp = tabl(ou, 1)
      tabl(ou, 1) = tabl(nb - i, 1)
      tabl(nb - i, 1) = temp
     Next
     Range("B1:B10") = tabl

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    @Patrick : Oui pas mal
    Même si ça ne correspond pas en effet à la demande de départ du topic
    Qui n'est pas générer des nombres aléatoires dans une colonne mais avec une colonne remplie d'informations, générer un parcours aléatoire de ces données et indiqué l'ordre de parcours dans la colonne d'à côté

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    oui je sais mais comme on est dans les nombres aléatoires j'ai voulu pousser un peu plus loin et rafraichir mes macros toutes prêtes dans ce domaine et sans dico pour changer
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Pour le fun sans boucle....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        tabl = Range("A1:A10")
        nb = UBound(tabl, 1)
        rd = Application.Rept("RANDBETWEEN(1," & nb & ")&"",""&", nb)
        rd = Left(rd, Len(rd) - 5)
        rd = Split(Evaluate(rd), ",")
        Range("B1:B10") = Application.WorksheetFunction.Transpose(rd)
    End Sub

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour cerede2000
    Pourquoi ai-je de temps en temps des doublons avec ton code ?

  15. #15
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour cerede2000
    Pourquoi ai-je de temps en temps des doublons avec ton code ?
    De la même manière que j'en ai avec le tiens

    Je fais un simple random, pas de contrôle sur les doublons, juste pour le fun de le faire sans boucle.

  16. #16
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    d'autant plus que int limitera les occurrences a 99 car après c'est pas des doublons mais des triples et plus selon la longueur de l'opération
    un dico étant catégoriquement sans doublons .peut importe la longueur de la boucle pas de doublons!!!!!
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #17
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, pour info

  18. #18
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    J'ai très bien comprit le principe !
    Mais l'exemple précédent utilise deux boucles.....
    J'aurais voulut la même chose que ton dernier code qui fonctionne pour tout

    Et en plus on peux se passer de tableau en utilisant un string et InStr

  19. #19
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Par contre ça limite un peu ton truc !
    Si on veut juste par exemple des nombre entre 0 et 100 ?

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    oui et ben
    tu n'a pas compris le principe

    je veut 100 nombres au hasard de 1 a 1000

    si tu veux 100 nombre de 1 a 100 l'exemple précédent suffit
    après en modifiant un peu on peut garder cette structure
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 08h06
  2. Parcourir une plage de cellules
    Par youbewt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2013, 21h03
  3. [VBA] Parcourir une plage de cellule
    Par Dinytro dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/09/2005, 08h18
  4. [VBA-E] Image d'une plage de cellule
    Par flogreg dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/07/2004, 12h30
  5. [VBA-E] [Excel] Protection d'une plage de cellules
    Par fikou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/11/2002, 11h28

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