Signification d'un code VBA

Bonsoir

est ce que quelqu'un peut m'éclairer

je voudrais savoir ce que signifient les codes VBA suivants :

If 0 = (i Mod 5) Then ActiveWorkbook.Save

For i = Range("G1048576").End(xlUp).Row To 1 Step -1

If Not IsNumeric(Range("G" & i).Value) Then Range("A" & i & ":L" & i).Delete Shift:=xlUp

Next i

Merci d'avance

Bonjour raphdas,

Mod est l'opération mathématique « modulo » : a mod b retourne le reste de la division de a / b

J'ai modifié le test :

a) j'ai enlevé les parenthèses inutiles

b) j'ai inversé l'ordre : c'est à la fois pareil et plus compréhensible

If i Mod 5 = 0 Then signifie : si le reste de i / 5 vaut 0 alors

ActiveWorkbook.Save : sauvegarder le classeur actif


Range("G1048576") : dernière cellule de la colonne G ; .End(xlUp) : idem que si depuis G1048576,

tu appuies sur Ctrl ↑ (en remontant vers le haut, ça s'arrête sur la 1ère cellule non vide) .Row : ligne de

cette 1ère cellule non vide rencontrée ; comme c'est du bas vers le haut, c'est donc, en colonne G, la

dernière cellule non vide du tableau.

La boucle For i ... Next i va donc de la dernière ligne du tableau à la 1ère ; Step -1 : par pas de -1

Si la cellule G de la ligne i n'est pas numérique on supprime la ligne correspondante du tableau, mais ce n'est

pas une vraie suppression de la ligne : des colonnes A à L, on fait avec xlUp un décalage vers le haut ➯ toutes

les lignes en dessous remontent d'une ligne, et donc la ligne i + 1 écrase la ligne i.

Cordialement

Bonjour,

je vais essayer...

If 0 = (i Mod 5) Then ActiveWorkbook.Save

"i" doit être une variable qui prend différente valeur

MOD 5 signifie que l'on garde "le reste" d'une division par 5

i MOD 5 signifie donc que l'on prend le reste de la division de "i" par 5

Ce reste on le compare à 0

Si 0 = reste de la division alors (then) on sauvegarde le classeur

En gros la sauvegarde du classeur ne se fait que pour "i" = multiple de 5

For i = Range("G1048576").End(xlUp).Row To 1 Step -1
     If Not IsNumeric(Range("G" & i).Value) Then Range("A" & i & ":L" & i).Delete Shift:=xlUp
Next i

ici on a une boucle qui va de la ligne "Range("G1048576").End(xlUp).Row" à la ligne 1 par "pas" de -1

Range("G1048576").End(xlUp).Row => on cerche dans la colonne G la dernière cellule "non vide" de la colonne en par du bas (dernière ligne de la feuille : 1048576) et en remontant (xlUP)

du coup si la dernière cellule non vide de la colonne G est la cellule G34, la boucle tournera de i=34 à 1 pas step de -1 ligne

If Not IsNumeric(Range("G" & i).Value) => on test ici à chaque boucle si la valeur de la cellule testée (G34 pour la première cellule dans notre exemple) est non numérique (NOT pour non IsNumeric pour le teste de savoir si c'est numérique), si c'est non numérique alors (then) on efface les cellule de la ligne testée de la colonne A à la colonne L en stipulant que les cellules du dessous doivent "remonter" (Shift:=xlUp)

Lorsqu'il y a des suppression de ligne il en effet "obligatoire" de commencer la boucle du bas vers le haut, sinon à chaque suppression il y aurait un "trou" dans la boucle du fait que les cellules "remontent".

@ bientôt

LouReeD

Toujours présent dhany !

Bonjour LouReeD,

Ton explication est un bon complément de la mienne, notamment pour le "trou" dans la boucle

et l'obligation de procéder du bas vers le haut en cas de suppression de ligne.

De même qu'un homme averti en vaut deux, deux explications valent mieux qu'une !

si avec ça le demandeur ne trouve pas son bonheur, c'est à déséspérer ! mais si

une tierce personne vient donner une 3ème explication, pourquoi pas ?

Cordialement, dhany (toujours présent et fidèle au poste) !

PS : j'ai remarqué que tu as de nouveau changé d'avatar : fini le chapeau de Catherinette !

c'est quoi ton nouvel avatar ? on dirait un genre de code barre bizarre ! ou le genre de

code qu'on scanne pour voir une émission télé ? franchement, je préférais la grotte !!!

ça m'plairait bien qu'tu la remettes de nouveau (malgré c'que j'en avais dit) !!!

merci d'avance si tu le fais, mais fais quand même comme tu préfères !!!

Salut Dhany, LouReed !

mais si une tierce personne vient donner une 3ème explication, pourquoi pas ?

Pourquoi pas !

Ça devient un peu difficile pour le premier code, Dhany a été particulièrement complet, et vraiment je ne vois pas ce que je pourrais trouver à ajouter !

Je vais donc rester sur le second où je peux encore m'attaquer à deux points !

D'abord la fin de l'expression utilisant la méthode Delete :

   (...).Delete Shift:=xlUp

Cette expression est issue de l'enregistreur ou copiée sur l'enregistreur (écrite de la façon dont l'enregistreur l'écrit). A quoi le voit-on ?

D'abord par le fait que l'argument de la méthode est passé par nom (présence de Shift:=, nom de l'argument). Le passage normal et préconisé des arguments étant par position, on pouvait donc se dispenser de cet ajout du nom, en gagnant du temps dans l'écriture. On pourrait certes penser que le concepteur du code a jugé utile à cet endroit d'utiliser un passage par nom plutôt que par position. Certes, le passage par nom peut parfois s'avérer utile, aussi bien pour l'écriture que pour la compréhension ! Toutefois, lorsque les arguments sont passés dans l'ordre (lorsqu'il y en a plusieurs) et en utilisant les noms ou lorsqu'il s'agit du premier, il y a de très fortes présomptions pour que cette façon d'écrire soit copiée sur l'enregistreur...

Un autre élément vient le conforter dans ce cas particulier : xlUp est une survivance non mise à jour par Microsoft depuis certainement très longtemps pour l'enregistreur, la constante VBA de direction dévolue à ce cas est xlShiftUp (déjà référencée sous ce nom avec Excel 2000), dénomination qui élimine d'elle-même tout problème éventuel de compréhension, d'autant que la méthode n'admet qu'un seul argument...

Une écriture plus conforme à VBA aurait donc été :

   (...).Delete xlShiftUp

Autre point, les expressions débutant par Range... sont "nues", j'entends par là qu'il n'y pas de point devant Range, c'est à dire que la propriété Range ainsi invoquée, et destinée à renvoyer un objet Range, ne réfère pas à l'objet susceptible de contenir ladite plage, soit une feuille de calcul (objet Worksheet). VBA permet d'écrire ainsi car en l'absence de qualificateur d'objet l'expression réfère par défaut à l'objet Application et que Application.Range est une expression licite, mais qui conduit VBA à rechercher la feuille active du classeur actif dans l'application pour y référer l'objet Range recherché.

On le voit, une telle façon d'écrire est imprécise, et généralement plus lente à l'exécution.

Une façon plus efficace aurait été de mentionner l'objet référent, en utilisant un bloc With pour n'avoir à le mentionner qu'une fois tout en accélérant l'exécution...

Je dois reconnaître que je n'apporte aucun élément nouveau relatif à l'interprétation du code qui a été donnée, et qui ne changera pas si on l'écrit autrement. Mais il est toujours utile d'indiquer une écriture visant à en écrire le moins possible et à obtenir l'exécution la plus rapide.

Cordialement.

dhany, en effet c'est un QR-Code, qu'il faut "flasher" à l'aide d'une application... A voir maintenant où cela vous mènera...

Pas très loin je vous rassure bien que j'aurais pu y mettre l'adresse de ma page de téléchargement qui se trouve sur ce merveilleux site !

Quant à la troisième explication du code, quelque part je me doutais qu'elle viendrait du maréchal... mais j'avais un doute avec James007, c'est pourquoi je ne me suis pas avancé...

Content d'apprendre que l'écriture peut jouer sur la rapidité du code, il faut vraiment que je travaille toutes mes applications !

@ bientôt

LouReeD

Salut LouReed !

Je n'ai pas de lecteur de code... mais Dhany a raison, tes illustrations (une peu plus illustrées) étaient de meilleur aloi !

Content d'apprendre que l'écriture peut jouer sur la rapidité du code

Ne vas pas trop vite dans l'assimilation, les deux aspects peuvent être concomittants, mais ne sont pas liés.

Un bloc With accélère le code car VBA met la référence d'objet en mémoire et y accède donc aussi vite sinon plus qu'à une variable.

En même temps cela permet de raccourcir l'écriture.

(Ça marche aussi pour Select : tu allonges l'écriture et tu allonges l'exécution.)

Mais c'est pas le cas pour tout...

Bonjour

Merci pour vos réponses.

Rechercher des sujets similaires à "signification code vba"