Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je suis débutant en macro Excel. J'ai réussi à faire une macro cependant, elle s'avère compliqué pour rien.
Le but de la macro est de saisir pour un colonne donnée, les lignes qui ont des données d'inscrites et de les copier dans une autre feuille. Voici la macro que j'ai créé.
Sub Macro2()
'
' Macro2 Macro
' Macro enregistrée le 2009-01-03 par Yanick
'
Pourriez vous m'aider à simplifier cette macro svp.
Merci d'avance
Yanick
P.S Je vous fourni le fichier avec les données de départ et d'arrivée. Les données de départ sont dans la feuille nommé "Chiffres" et le résultat de la macro dans la feuille nommé "DAG"
Bonsoir Kid_kodac, et bienvenu sur le forum et dans le monde du VBA,
Bonsoir le fil,
Ta macro est placé dans "Module1", or dans ton code, tu n'indique pas sur quel feuille il faut travailler!
Donc si tu lance ta macro de la mauvaise feuille, le résultat obtenu sera faux. Deux solutions :
-> rajouter au début de ton code :
Sheets("Chiffres").select
-> si ce code ne concerne que la feuille chiffres, pour t'éviter de rajouter cette ligne de code, met ton code dans la feuille "Chiffre" et non "module 1".
Tu peux effacer ces 2 lignes ci-dessous
Code:
Rows("1:1").Select
Selection.AutoFilter
car elles te permette de mettre un filtre automatique sur la 1er ligne de la feuille "Chiffre", or tu peux le laisser de façon permanente, cela t'évitera de le mettre et l'enlever à chaque fois 😉
Mais sinon, ta macro me semble ok!
Il existe d'autres techniques, c'est clair, mais tu gagneras très peu :
-> en nb de ligne
-> en temps d'exécution
Edition : macro pouvant être mise dans "Module" ou la feuille de ton choix. Comme tu vois, ma méthode est différente mais le code aussi long! Mais il existe surement plus court (par exemple recopier TOUTE la ligne, puis seulement à la fin, supprimer la colonne 4 que tu ne veux pas (mais on gagnera 2 lignes au maximum)).
On ne cessera de le répéter, avec VBA, les "Select" et autres "Activate" sont le plus souvent inutiles et la première chose à faire dans le cadre d'une optimisation/simplification de code, c'est déjà de chercher à s'en débarasser...
Pour le fun (et uniquement pour le fun, pas pour la clarté !), le même traitement que vous en une seule ligne de code et sans aucun "Select" : 😉
Code:
[COLOR=GRAY][B][I]DANS UN MODULE DE CODE STANDARD[/I][/B][/COLOR]
[COLOR=NAVY]Sub[/COLOR] Traitement()
[COLOR=GREEN]'myDearFriend! - www.mdf-xlpages.com[/COLOR]
Intersect(Sheets("Chiffres").Range("E2:E65536").SpecialCells(xlCellTypeConstants, 23).EntireRow, Sheets("Chiffres").Range("A:C,E:E")).Copy Sheets("DAG").Range("A2")
[COLOR=NAVY]End Sub[/COLOR]
Evidemment, on est loin d'une "simplification" ici... Et il s'agit d'un raccourci de code à outrance ! Il conviendrait notamment de gérer le cas où toutes les cellules de la colonne E seraient vides...
Il convient simplement de trouver un juste milieu entre simplification, clarté et efficacité du code...
Par ailleurs, l'utilisation d'une instruction de bloc comme "With... End With" reste à mon avis, la meilleure façon de faire pointer un traitement sur le bon objet (la feuille "Chiffres" dans le cas présent). Pour rappel, les modules de code des feuilles sont des modules "Privates" et ils sont normalement réservés aux procédures évènementielles.
Avec With... End With, on allège un peu la ligne de code précédente et ajoute un peu de clarté :
Code:
[COLOR=GRAY][B][I]DANS UN MODULE DE CODE STANDARD[/I][/B][/COLOR]
[COLOR=NAVY]Sub[/COLOR] Traitement2()
[COLOR=GREEN]'myDearFriend! - www.mdf-xlpages.com[/COLOR]
[COLOR=NAVY]With[/COLOR] Sheets("Chiffres")
Intersect(.Range("E2:E65536").SpecialCells(xlCellTypeConstants, 23).EntireRow, .Range("A:C,E:E")).Copy Sheets("DAG").Range("A2")
[COLOR=NAVY]End With
End Sub[/COLOR]
Bonjour à tous,
MDF que te dire, quand on lit tes codes, si ce n'est bravo! Mais toutes ces instructions pour arriver à les connaître comme toi, c'est pas impossible mais long trés long.
Enfin merci de tous ces codes d'un autre monde, moi la dernière fois que tu m'en as fait un j'avais planché 3 jours sur un petit projet que tu as démélé en 2 minutes, quand on sait c'est pas comme quand on sait pas.
Enfin il faut apprendre à marcher avant de savoir courir (c'est ma seule consolation)
merci pour tout
Papou
On ne cessera de le répéter, avec VBA, les "Select" et autres "Activate" sont le plus souvent inutiles et la première chose à faire dans le cadre d'une optimisation/simplification de code, c'est déjà de chercher à s'en débarasser...
En fait, 23 correspond à la somme des constantes xlErrors (16), xlLogical (4), xlNumbers (1) et xlTextValues (2). Autrement dit, on va prendre en compte n'importe quelle valeur dans les cellules (= cellule non vide).
Pour connaître les valeurs correspondant à ces constantes, dans l'éditeur VBE, tu fais F2 pour afficher l'explorateur d'Objets, puis une recherche sur SpecialCellsValue. En sélectionnant les différentes constantes présentées, tu obtiens leur valeur au bas de la fenêtre.
Mais, en réalité, si tu ne veux pas te prendre la tête avec ça, tu fais comme moi : tu actives l'enregistreur de macro (eh oui, la majorité de mes codes commence sur cette base 😉), et tu fais menu Edition / Atteindre... / Cellules. Puis tu sélectionnes "Constantes" en laissant tout ce qu'il y a de coché par défaut et tu valides.
Tu récupères ensuite le code VBA ainsi obtenu ! 🙄
Merci à topus et à toutes. Je vais essayer vos solutions avec grand intérêt. Vous êtes de loin le meilleur forum concernant les questions Excel qui m'a été donné de voir. Merci pour tous
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD