Explication de lignes de code à un débutant

Bonjour à tous

Je suis un débutant senior qui souhaite qu'un d'entre vous me donne quelques explications aux lignes de code ci-dessous. J'ai trouvé cette macro sur le forum, mais je suis incapable de retrouver de qui elle est. Désolé pour l'auteur.

Sub Aleatoire()

Dim plage As Range, cel As Range, alea As Double

Set plage = Range("A1:A5") 'modifiable

plage.Value = ""

If plage.Count > 5 Then Exit Sub

Randomize

For Each cel In plage

1 alea = WorksheetFunction.RandBetween(1, 50)

If Application.CountIf(plage, alea) Then GoTo 1 Else cel = alea

Next

End Sub

Cette macro remplit les 5 cellules A1 à A5 de 5 nombres aléatoires compris entre 1 et 50, sans doublon.

Je ne comprends pas bien le sens de l'objet Range ?

Et surtout je ne comprends pas la ligne : If Application.Countif (plage, alea) then Goto 1 Else cel = alea

Il y a un Si mais pas de condition du genre > à, ou < à ou = quelque chose .

Je comprends ce que fait l'instruction : elle compte le nombre de case dans la plage dont la valeur est égale à alea, s'il y en a une on retourne à l'étiquette 1, sinon elle affecte alea à la case suivante. Ce qui évite les doublons.

Est-ce que la condition est implicite ?

Par ailleurs, je me demande où est le compteur qui permet à l'instruction " For each cel in plage" de savoir que les 5 cases sont remplies ?

Si quelqu'un peut m'éclairer, d'avance merci

Salut PapyJacky,

Réécrit, c'est plus joli..

Info : quand tu postes un code, utilise les balises </> disponibles dans la barre d'outils du message!

'
Dim rCells As Range, rCel As Range, iAlea%
'
Set rCells = Range("A1:A5") 'modifiable
rCells.Value = ""
For Each rCel In rCells
    Do
        Randomize
        iAlea = WorksheetFunction.RandBetween(1, 50)
    Loop Until Application.CountIf(rCells, iAlea) = 0
    rCel.Value = iAlea
Next
'
  • la condition est implicite, en effet = si Countif > 0 donc vrai, en fait ;
  • Range désigne... la plage de cellules ou la cellule, simplement ;
  • le compteur? Tu penses à FOR NEXT? Pas besoin puisque le code dit, en français, Pour chaque cellule de la plage ;
  • évite les GOTO, pas très élégant!

A+

Salut papyjacky le fil,

Il faut commencer par les bases dans l'aide d'Excel tu as tout un tas d'informations il faut prendre le temps de lire...

Sinon voilà..

Sub Aleatoire()
'Une plage peut être une cellule ou plusieurs cellule dans une feuille
    Dim plage As Range, cel As Range
    'alea et un reel double à virgule flotante
    Dim alea As Double
    'On definit le nom plage sur la plage de cellule de "A1" jusqu'à "A5" dans la feuille active
    Set plage = Range("A1:A5")
    'on efface les données de la plage de cellules
    plage.Value = ""
    'Si la plage comporte plus de 5 cellules on sort de la sub
    If plage.Count > 5 Then Exit Sub
    'On initialise le générateur de chiffre aléatoire
    Randomize
    'Pour chaque cellule dans la plage cellule A1; cellule A2....
    For Each cel In plage
    'On remplie la cellule par un nombre aléatoire entre 1 et 50
1       alea = WorksheetFunction.RandBetween(1, 50)
    'l'application countif va compter le nombre de valeur identique c'est implicite si on trouve donc on est > 0 alors on recré le nombre aléatoire.
        If Application.CountIf(plage, alea) Then GoTo 1 Else cel = alea
    'On boucle jusqu'à la dernière cellule
    Next
End Sub

Salut Curulis57

Merci de prendre du temps pour me répondre.

J'ai bien pris note de tes observations relatives à la mise en page des lignes de code. j'en tiendrai compte à l'avenir.

Je vois que tu as réécrit la macro avec la boucle do...loop until.

Mon bouquin Excel VBA dit :

la boucle s'exécute, puis se répète, jusqu'à ce que la condition soit respectée.

Tu as mis la condition = 0

A la première boucle iAlea est un nombre entre 1 et 50 ; toutes les cellules sont vides

La condition =0 est donc respectée. On sort de la boucle et on affecte iAlea à rCel.

On commence la deuxième boucle. Si, iAlea est le même nombre que celui de la première cellule, la condition = 0 n'est pas respectée, on recommence la boucle, jusqu'à ce la condition =0. On sort à nouveau de la boucle. Etc. jusqu'à ce que le tableau soit rempli.

OK

J'ai écrit ça pour moi, pour être sur de bien comprendre. La logique est inverse de la macro précédente.

En tout cas, merci.

Je voudrais clore cette discussion, mais je ne sais pas où il faut cliquer.

Bonsoir Jean-Paul

Merci à toi pour les explications.

Ma question concernait surtout l'instruction CountIf.

Je n'ai trouvé nulle part la condition implicite de cette instruction.

Maintenant je sais.

A+

Bonsoir papyjacky,

Petit truc sympa à faire :

Tu colles cette ligne dans un module

If Application.CountIf(plage, alea) Then GoTo 1 Else cel = alea

Tu mets le curseur de la souris sur CountIf et tu appuie sur la touche en haut à gauche du clavier notée [F1], tu vas voir c'est magique, trêve de plaisanterie il faut user et abuser de la touche F1 c'est notre meilleure amie

Rechercher des sujets similaires à "explication lignes code debutant"