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

  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
    En fait avant de répondre moi j'aimerais savoir : A quoi ça sert ?

  6. #6
    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

  7. #7
    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

  8. #8
    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 ?

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

  10. #10
    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

  11. #11
    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

  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
    dans le même acabit de résultat pour unparia ou cerede si on se contentais d'être fainéants hein!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test3()
        With Sheets(1)
            .Range("d1:d10").FormulaLocal = "=ALEA.ENTRE.BORNES(1;10)"
            .Range("d1:d10") = .Range("d1:d10").Value
        End With
    End Sub
    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
    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
    Peut-on me montrer la faille (doublon cité par cerede2000 ou limitation évoquée par Patrictoulon) dane ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' on prépare 300 articles en colonne A
    For i = 1 To 300
     Range("A" & i).Value = i
    Next
     
     tabl = Range("A1:A300")
     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:B300") = tabl
    J'aurais pu mettre n'importe quoi d'autre que des chiffres en colonne A, entre parenthèses !

  14. #14
    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
    re
    si c'est un déplacent des items oui alors ceci fonctionne aussi
    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
    Sub test2()
    For i = 1 To 300
     Range("A" & i).Value = i
    Next
    tablo = Range("a1:a300").Value
    ReDim tablo2(UBound(tablo))
     Do
     nvw = Round((Rnd * 299))
     If tablo2(nvw) = "" Then
     c = c + 1
     tablo2(nvw) = tablo(c, 1)
     End If
    Loop Until c = 300
    Range("d1:d300") = Application.Transpose(tablo2)
    End Sub
    je genere pas le contenu aléatoirement mais son emplacement
    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

  15. #15
    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
    Voilà qui devient plus raisonnable.
    Et pour s'en tenir à la demande, qui était simplement de décider en colonne B de l'ordre de parcours , le voilà (quelles que puissent être les données en colonne A :
    Pour mémoire :
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    derlig = Range("A" & Rows.Count).End(xlUp).Row
     ReDim tabl(1 To derlig, 1 To 2)
     For i = 1 To derlig
       tabl(i, 1) = i
     Next
     Range("B1:B" & derlig).Value = tabl
     nb = UBound(tabl) + 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:B" & derlig).Value = tabl
    ce ne sont pas les données, que l'on va voir en colonne B, mais l'ordre de parcours.

  16. #16
    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
    Salut tout le monde !
    Merci pour vos messages rapides.

    La solution de unparia me convient tout à fait. Et mon programme marche comme je le souhaitais

    Merci à tous.

  17. #17
    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 a tous meme si résolu

    j'aimerais pointer le détail important sur model de unparia

    il ne fonctionne qu'a condition que les valeurs dans les cellules soient numériques

    sinon on se retrouve avec les valeurs mélangée certes mais pas les indexs de ligne si les valeurs sont en string
    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

  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
    Dommage aussi d'utiliser deux boucles.....
    Je préfère largement la version de @Patricktoulon avec le dictionary

  19. #19
    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 cerede
    non c'est pas forcement mauvais son truc
    je suis en train de voir si je peut me passer dans plage

    après ma version sans dictionnaire le rejoins un peu dans ce sens sauf que moi je réalise aucun calcul
    je test seulement si mon item de tableau est vide
    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

  20. #20
    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
    Citation Envoyé par patricktoulon Voir le message
    bonjour a tous meme si résolu

    j'aimerais pointer le détail important sur model de unparia

    il ne fonctionne qu'a condition que les valeurs dans les cellules soient numériques

    sinon on se retrouve avec les valeurs mélangée certes mais pas les indexs de ligne si les valeurs sont en string
    Qu'est-ce que tu racontes-là ?
    Je crois que tu n'as pas compris du tout ce que veut afficher le demandeur en colonne B.
    Ce qui se trouve en colonne A n'a absolument aucune importance !
    Tu devrais relire.

+ 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