Commentaires concernant un code VBA

Bonjour,

J'ai trouvé ce code qui fonctionne très bien

Afin de parfaire mes connaissances en vba quelqu'un pourrait il me mettre quelques commentaires sur chaque ligne.

Je vous remercie

Sub a()
Dim x, y, z As Long
Dim cell1, cell2 As String
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
    z = Int(Range("A" & Rows.Count).End(xlUp).Row * Rnd) + 1
    cell1 = Cells(z, 1)
    y = Int(Range("A" & Rows.Count).End(xlUp).Row * Rnd) + 1
    cell2 = Cells(y, 1)
    Cells(y, 1) = cell1
    Cells(z, 1) = cell2
Next
End Sub

Bonsoir Joco7915, le forum,

De ce que je comprends (les pros me corrigeront si je dis une ânerie,):

Sub a()
 Dim x, y, z As Long  '.............Les variables x,y & z sont utilisées comme indices de lignes
 Dim cell1, cell2 As String '.......Les variables cell1 & cell2 stockent des textes
  'La boucle commence à la ligne 2 et continue jusqu'à la dernière ligne non vide de la colonne A
  For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
    z = Int(Range("A" & Rows.Count).End(xlUp).Row * Rnd) + 1 '...z génèrent un indice aléatoire
    cell1 = Cells(z, 1) '........................................valeur de la cellule (ligne z, colonne A)
    y = Int(Range("A" & Rows.Count).End(xlUp).Row * Rnd) + 1 '...y génèrent un indice aléatoire
    cell2 = Cells(y, 1) '........................................valeur de la cellule (ligne y, colonne A)
    'Les valeurs des cellules aux lignes y et z en colonne A sont permutées
    Cells(y, 1) = cell1
    Cells(z, 1) = cell2
 Next x '.........ligne suivante
End Sub

En gros tu mélanges aléatoirement les données de la colonne A,

Cordialement,

Hello,

j'ajouterais qu'il y a une sainte axe qui n'est pas correcte dans les déclarations des variables

x, y sont des variables de type "Variant" alors que z est un type "Long"

Cell1 est aussi un type "Variant" alors que cell2 est de type "String"

La syntaxe correcte est

Dim x As Long, y As Long, z As Long

Dim cell1 As String, cell2 As String

bonjour le fil,

si c'est pour un tirage aléatoire, ceci est plus efficace et pratique

Sub a()
     Dim x As Long, r As Long
     Dim Temp  As Variant
     Dim Derl  As Long: Derl = Range("A" & Rows.Count).End(xlUp).Row

     For x = 2 To Derl - 1                   'boucler de la 2eme à la avant-dernière ligne
          r = WorksheetFunction.RandBetween(x, Derl)     'valeur aléatoire entre x et derl
          Temp = Cells(r, 1)                 'stocker temporaire
          Cells(r, 1).Value = Cells(x, 1).Value     'écraser la cellule "r" avec la valeur de la cellule "x"
          Cells(x, 1) = Temp                 'écraser la cellule "x" avec la valeur de temp
     Next
End Sub

Bonjour à tous,

Le code présenté semble être écrit pour des données ayant une ligne de titre. Tel que votre code est écrit, il mélange aussi la cellule de titre en A1.

Personnellement, j'utiliserai plutôt le code commenté suivant plus rapide et qui permet d'exclure les lignes des titres (le cas échéant) :

Sub Melanger()
Dim ndeb&, der&, t, i&, n&, aux
   ndeb = 2    ' --> n° ligne à partir de laquelle mélanger - permet de sauter le(s) titre(s)
   der = Cells(Rows.Count, "a").End(xlUp).Row      ' n° de la dernière ligne de la colonne A
   t = Range(Cells(ndeb, "a"), Cells(der, "a"))    ' lecture des données dans un array (plus rapide)
   Randomize                        ' initialisation de la fonction randomize
   For i = 1 To UBound(t)           ' depuis le 1er élément de t jusqu'au dernier
      n = 1 + Int(Rnd * UBound(t))  ' n = entier au hasard parmi les indices de t
      aux = t(i, 1): t(i, 1) = t(n, 1): t(n, 1) = aux    ' échange des éléments i et n
   Next i
   Range(Cells(ndeb, "a"), Cells(der, "a")) = t          ' transfert en retour de t sur la feuille
End Sub

Re,

Une autre méthode qui trie une plage de 3 colonnes à partir de la colonne A (sans boucle) :

Le code :

Sub Mélanger2()
Dim ndeb&, NbrColonnes&, der&, dercol&
   Application.ScreenUpdating = False
   ndeb = 2          ' --> n° ligne à partir de laquelle mélanger - permet de sauter le(s) titre(s)
   NbrColonnes = 3   ' nombre de colonnes à prendre en compte à partir de la colonne A (incluse)
On Error GoTo FIN
   der = Cells(Rows.Count, "a").End(xlUp).Row                     ' n° de la dernière ligne de la colonne A
   Columns("a:a").Insert                                          ' une colonne auxiliaire est insérée
   Columns("a:a").Resize(der).Formula = "=rand()"                 ' on y place un nombre aleatoire
   Columns("a:a").Resize(der) = Columns("a:a").Resize(der).Value  ' passage en valeur
   ' tri de la plage selon la colonne A (nombres aléatoires insérés)
   dercol = Columns("a:a").Column + NbrColonnes                   ' n° dernière colonne de la plage à trier
   Range(Cells(ndeb, "a"), Cells(der, dercol)).Sort key1:=Cells(ndeb, "a"), Header:=xlNo     ' tri
FIN:
   Columns("a:a").Delete                                          ' suppression de la colonne auxiliaire
End Sub

Bonjour

Merci à tous pour vos explications

Cordialement

re,

@mafraise,

Le code présenté semble être écrit pour des données ayant une ligne de titre. Tel que votre code est écrit, il mélange aussi la cellule de titre en A1.

tous ces codes commencent avec la 2eme ligne en supposant que ligne 1 était le title et ils ne le touchent pas, non ?

Bonjour BsAlv,

@mafraise,

Le code présenté semble être écrit pour des données ayant une ligne de titre. Tel que votre code est écrit, il mélange aussi la cellule de titre en A1.

tous ces codes commencent avec la 2eme ligne en supposant que ligne 1 était le title et ils ne le touchent pas, non ?

Je ne comprends pas trop. Dans mes deux codes, la ligne suivante indique quelle est la première ligne à prendre en compte pour le mélange.

ndeb = 2 Ici, les données commencent à la ligne 2. Les deux codes mélangent à partir de cette ligne et laissent les lignes au-dessus de ndeb inchangées.

Si la colonne n'a pas de ligne de titre, on indiquera ndeb = 1

Si je me trompe, fais le moi savoir... Merci.

A plus.

@mafraise, c'est la différence entre explicit et implicit, chez vous, il y a un variable "ndeb" et dans les codes, il n'y a pas, mais il commencent à la ligne 2 et, si nécessaire, on doit modifier cela.

Donc, non, c'est question d'interprétation.

Re @BsAlv,

@mafraise, c'est la différence entre explicit et implicit,

D'accord avec toi. Et pour te paraphraser, comme on dit chez nous: "ça va mieux en le disant". Ici, en l'occurrence, en l'écrivant .

Si on avait eu droit à un classeur de la part du demandeur, nous aurions tranché tout de suite.

Bonne après-midi .

Rechercher des sujets similaires à "commentaires concernant code vba"