Explication d'une macro

bonsoir à tous

comme je suis débutant je comprends lentement

1.quelqu'un pourrait-il m'expliquer ligne à ligne la macro suivante (je vais mettre ce que j'ai compris)

Private Sub CommandButton2_Click()

ça c'est pour dire sur quel bouton la macro s'execute

Application.ScreenUpdating = False

Application.EnableEvents = False

ça si j'ai bien compris c'est pour éviter de voir "le travail "s'effectuer avec les lignes qui bougent

Sheets("avril").Range("A18:J49").ClearContents

indique de nettoyer le contenu de A18 à J49 de la feuille "avril"

Derlg = Sheets("planning").Range("A65536").End(xlUp).Row

??????

DebLig = 18

démarre la copie ligne 18

For i = 4 To Derlg

?????

If Sheets("paramètres").Range("J5") <= Sheets("planning").Range("A" & i) And _

Sheets("paramètres").Range("K5") >= Sheets("planning").Range("A" & i) Then

en gros si les critères J5 K5 sont respectés (mais (Range ("A"&i))?????????

Sheets("planning").Rows(i).Copy

copie colonne i???????

Sheets("avril").Range("A" & DebLig).PasteSpecial Paste:=xlPasteValues

Sheets("avril").Range("A" & DebLig).PasteSpecial Paste:=xlPasteFormats

DebLig = DebLig + 1

va jusque la ligne après la dernière répondant au critère J5 K5???

End If

Next i

Application.ScreenUpdating = True

Application.EnableEvents = True

je sais qu'il faut le remettre mais pourquoi???

Sheets("avril").Select

ouvre la feuille "avril

UserForm1.Hide

End Sub

2. j'aimerais maintenant faire la même chose mais uniquement en ne copiant que 4 colonnes et non pas toutes les colonnes: comment faire?

J'espère ne pas faire trop rire les experts!!

Merci à vous

cordialement

david

Bonsoir,

Pour l'explication, je peux.

Private Sub CommandButton2_Click()

Initie une procédure d'évènement constitué par un clic sur le bouton nommé CommandButton2.

Cette procédure est privée (ne peut être lancée que du module où elle se trouve).

On peut supposer qu'elle figure dans le module de Userform1 (compte-tenu de la commande qui le masque à la fin).

[Si c'est bien le cas, il eut été préférable de le masquer en début de procédure.]

Application.ScreenUpdating = False

Application.EnableEvents = False

Ces deux commandes, respectivement, interrompent la mise à jour de l'affichage (ça empêche de voir bouger, en effet...) et suspendent l'interception des évènements (s'il y a par exemple une procédure Change dans la feuille que l'on va modifier, cette procédure ne sera pas exécutée).

Sheets("avril").Range("A18:J49").ClearContents

La plage indiquée de la feuille "avril" est en effet effacée (nettoyage !)

Derlg = Sheets("planning").Range("A65536").End(xlUp).Row

Cette commande renvoie le numéro de ligne de la dernière ligne occupée en colonne A de la feuille "planning" et l'affecte à une variable : Derlg.

DebLig = 18

La valeur 18 est affectée à la variable DerLig (il s'agit en effet de la ligne où on commencera à coller...)

[NB- Ces deux variables sont déclarées au niveau module, ou ne sont pas déclarées et sont alors de type Variant.]

For i = 4 To Derlg

Commande initiant une boucle de compteur i variant de 4 à la dernière ligne utilisée de "planning" (par incrément de 1).

If Sheets("paramètres").Range("J5") <= Sheets("planning").Range("A" & i) And _

Sheets("paramètres").Range("K5") >= Sheets("planning").Range("A" & i) Then

Condition pour vérifier si en colonne A de "planning", la valeur de la cellule de la ligne i (variant à chaque tour de boucle) se situe entre les valeurs de J5 et K5 de "paramètres" (bornes comprises)...

Dans ce cas :

Sheets("planning").Rows(i).Copy

On copie la ligne i...

Sheets("avril").Range("A" & DebLig).PasteSpecial Paste:=xlPasteValues

Sheets("avril").Range("A" & DebLig).PasteSpecial Paste:=xlPasteFormats

On la colle en valeurs sur "avril", ligne DebLig, et on colle les formats également.

DebLig = DebLig + 1

On incrémente la variable DebLig (pour coller sur la ligne suivante au prochain tour.

End If

Next i

Fin de la condition. Et incrémentation de la boucle (qui s'exécutera jusqu'à la dernière ligne prévue : Derlg).

Application.ScreenUpdating = True

Application.EnableEvents = True

Rétablissement de la mise à jour de l'affichage et de l'interception des évènements (on revient à la normale...)

Sheets("avril").Select

Affichage de la feuille "avril".

[Activate, plus approprié que Select, mais le résultat est le même...]

UserForm1.Hide

End Sub

Masquage de Userform1 et fin de la procédure.

Cordialement

Ouah! cours accéléré!

Merci.

si je peux me permettre

pouvez vous préciser davantage:

Derlg = Sheets("planning").Range("A65536").End(xlUp).Row

Cette commande renvoie le numéro de ligne de la dernière ligne occupée en colonne A de la feuille "planning" et l'affecte à une variable : Derlg.

j'ai le sentiment que comprendre cette ligne pourrait m'aider pour la 2ème question à savoir la même macro mais uniquement pour 4 colonnes

merci

bien cordialement

david

PS: en même temps je suis sur la partie "cours" de excel-pratique. Ce site et ce forum, génial

Bonsoir tout le monde,

si tu souhaites savoir quelle valeur à la variable derlg met toi tu sur la cellule A65536 et tu appuyes sur les touches CTRL + la flèche du haut de ton pavé numérique tu arriveras sur une cellule c'est le numéro de la ligne de cette cellule qui est attribué à derlg.

Si tu souhaites copier que 4 colonnes la ligne à modifier dans ta macro est la suivante :

Sheets("planning").Rows(i).Copy

remplace la par exemple si tu veux copier les colonnes de A à D :

Sheets("planning").Range("A"&i,"D"&i).Copy

Cordialement.

merci encore

mais alors

pourquoi 65536 et pas 500 ou 5000?

et pourquoi cela renvoie à des cellules spécifiques

merci

david

Re,

pourquoi 65536 car dans les anciennes version d'Excel c'était le nombre limite de lignes possibles.

Cela permet lorsque tu rajoutes de nouvelles données qu'elles soient inclues dans la boucle si on met 500 et que tu as plus de 500 lignes les suivantes ne serait pas prises en compte tout simplement.

Cordialement.

Merci

Rechercher des sujets similaires à "explication macro"