Débutante VBA excel
Résolu/Fermé
abrareus
Messages postés
3
Date d'inscription
jeudi 22 décembre 2016
Statut
Membre
Dernière intervention
22 décembre 2016
-
22 déc. 2016 à 13:27
Utilisateur anonyme - 28 déc. 2016 à 02:12
Utilisateur anonyme - 28 déc. 2016 à 02:12
A voir également:
- Débutante VBA excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si et excel - Guide
- Excel compter cellule couleur sans vba - Guide
9 réponses
Utilisateur anonyme
28 déc. 2016 à 01:24
28 déc. 2016 à 01:24
Bonjour le forum,
Voici mon code VBA après l'optimisation de mon message #6 :
Les lignes #9 et #10 doivent être sur une seule ligne.
Idem pour les lignes #11 et #12.
Idem pour les lignes #22 et #23 ; c'est d'ailleurs au
bout de cette ligne que j'ai rajouté « : Exit For » :
l'optimisation mentionnée au début de ce message.
Cordialement. :)
Voici mon code VBA après l'optimisation de mon message #6 :
Option Explicit Sub Recaplavages() Worksheets("Récap lavages").Select: Application.ScreenUpdating = False Dim NL As Integer, param As String, col As Integer Dim dlig As Long, lig1 As Long, lig2 As Long ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux dlig = Range("A" & Rows.Count).End(xlUp).Row: Range("D4:AA" & dlig).ClearContents With Worksheets("Recettelavage") dlig = .Range("C" & Rows.Count).End(xlUp).Row For lig1 = 4 To dlig NL = Val(.Cells(lig1, 3)) If NL > 0 Then param = .Cells(lig1, 6) If param <> "" Then lig2 = NL + 3 For col = 4 To 27 If param = Cells(3, col) Then Cells(lig2, col) = .Cells(lig1, 9): Exit For Next col End If End If Next lig1 End With End Sub
Les lignes #9 et #10 doivent être sur une seule ligne.
Idem pour les lignes #11 et #12.
Idem pour les lignes #22 et #23 ; c'est d'ailleurs au
bout de cette ligne que j'ai rajouté « : Exit For » :
l'optimisation mentionnée au début de ce message.
Cordialement. :)
Utilisateur anonyme
22 déc. 2016 à 22:57
22 déc. 2016 à 22:57
Bonjour abrareus,
Je te retourne ton fichier Excel 2007 modifié.
À l'ouverture, tu seras sur la feuille "Récap lavages" ;
remarque bien qu'il n'y a aucun paramètre.
--------------------------------------
< Ctrl >< r > : travail effectué.
Tu n'as pas besoin d'effacer les anciens paramètres avant de refaire
< Ctrl >< r > : c'est fait automatiquement par la macro.
Donc si tu changes les données de la feuille "Recetteslavage",
tu peux faire < Ctrl >< r > juste après.
--------------------------------------
Tu peux faire < Ctrl >< r > depuis n'importe quelle feuille du classeur,
et ça ira de toute façon sur la feuille « Récap lavages » pour que tu
puisses voir le résultat : les différents paramètres.
--------------------------------------
Le code de Feuil5 était en double (et en trop) : je l'ai supprimé.
Tout le code est entièrement dans Module1.
Si vraiment tu veux que la macro soit exécutée dès l'ouverture
du classeur, indique-le moi et je te dirai comment faire, car
ton ancienne méthode avec Auto_Open() est obsolète.
--------------------------------------
Dis-moi ce que tu en penses, et si ça te convient.
Tu peux me demander une adaptation si besoin.
Si ton problème est réglé, merci d'aller en haut de page
pour cliquer sur « Marquer comme résolu ».
Cordialement. :)
Je te retourne ton fichier Excel 2007 modifié.
À l'ouverture, tu seras sur la feuille "Récap lavages" ;
remarque bien qu'il n'y a aucun paramètre.
--------------------------------------
< Ctrl >< r > : travail effectué.
Tu n'as pas besoin d'effacer les anciens paramètres avant de refaire
< Ctrl >< r > : c'est fait automatiquement par la macro.
Donc si tu changes les données de la feuille "Recetteslavage",
tu peux faire < Ctrl >< r > juste après.
--------------------------------------
Tu peux faire < Ctrl >< r > depuis n'importe quelle feuille du classeur,
et ça ira de toute façon sur la feuille « Récap lavages » pour que tu
puisses voir le résultat : les différents paramètres.
--------------------------------------
Le code de Feuil5 était en double (et en trop) : je l'ai supprimé.
Tout le code est entièrement dans Module1.
Si vraiment tu veux que la macro soit exécutée dès l'ouverture
du classeur, indique-le moi et je te dirai comment faire, car
ton ancienne méthode avec Auto_Open() est obsolète.
--------------------------------------
Dis-moi ce que tu en penses, et si ça te convient.
Tu peux me demander une adaptation si besoin.
Si ton problème est réglé, merci d'aller en haut de page
pour cliquer sur « Marquer comme résolu ».
Cordialement. :)
Utilisateur anonyme
23 déc. 2016 à 03:47
23 déc. 2016 à 03:47
@abrareus : pour le code VBA de mon message #5, j'ai oublié une
instruction d'optimisation, avec laquelle il sera un peu plus rapide.
Voici donc la nouvelle version de ton fichier Excel 2007.
Tu pourras voir que la seule différence est « : Exit For » qui est ajouté
au bout de l'unique ligne incluse dans la boucle For col ... Next col.
Ça fait qu'on sort de la boucle dès que le paramètre a été trouvé et
sa valeur écrite. Ainsi, on évite de tester inutilement le paramètre
avec les autres colonnes qui suivent => léger gain de temps ! ;)
Je te rappelle que tu peux me demander une adaptation si besoin,
y compris si tu tiens à une exécution automatique à l'ouverture
du classeur ; si tout est OK, tu peux passer le sujet en résolu. :)
instruction d'optimisation, avec laquelle il sera un peu plus rapide.
Voici donc la nouvelle version de ton fichier Excel 2007.
Tu pourras voir que la seule différence est « : Exit For » qui est ajouté
au bout de l'unique ligne incluse dans la boucle For col ... Next col.
Ça fait qu'on sort de la boucle dès que le paramètre a été trouvé et
sa valeur écrite. Ainsi, on évite de tester inutilement le paramètre
avec les autres colonnes qui suivent => léger gain de temps ! ;)
Je te rappelle que tu peux me demander une adaptation si besoin,
y compris si tu tiens à une exécution automatique à l'ouverture
du classeur ; si tout est OK, tu peux passer le sujet en résolu. :)
Bonjour albkan!
Ouah! J'étais très loin de ce qu'il fallait faire! Pour l'exécution automatique, je peux m'en passer. Je mettrai juste dans ma procédure qu'il faut actualiser en faisant <ctrl> et <r>.
Je vais demander une formation VBA à mon entreprise ce sera utile!
Merci encore et bonnes fêtes de fin d'année!
Ouah! J'étais très loin de ce qu'il fallait faire! Pour l'exécution automatique, je peux m'en passer. Je mettrai juste dans ma procédure qu'il faut actualiser en faisant <ctrl> et <r>.
Je vais demander une formation VBA à mon entreprise ce sera utile!
Merci encore et bonnes fêtes de fin d'année!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
22 déc. 2016 à 13:48
22 déc. 2016 à 13:48
Salut,
Je pense que ça manque de détails. Notamment cette phrase : "Pour chaque n° de lavage et chaque paramètre de lavage, je recherche la situation la plus récente"
Je pense que ça manque de détails. Notamment cette phrase : "Pour chaque n° de lavage et chaque paramètre de lavage, je recherche la situation la plus récente"
Patrice33740
Messages postés
8561
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
15 mars 2025
1 779
22 déc. 2016 à 13:49
22 déc. 2016 à 13:49
Bonjour,
Il serait plus simple de répondre avec ton fichier,
débarassé des informations confidentielles s'il y lieu.
Déposes le fichier avec des commentaires explicatifs sur
https://www.cjoint.com/
et mets le lien obtenu dans ton prochain message.
Tuto : Comment utiliser C.joint.fr
Il serait plus simple de répondre avec ton fichier,
débarassé des informations confidentielles s'il y lieu.
Déposes le fichier avec des commentaires explicatifs sur
https://www.cjoint.com/
et mets le lien obtenu dans ton prochain message.
Tuto : Comment utiliser C.joint.fr
abrareus
Messages postés
3
Date d'inscription
jeudi 22 décembre 2016
Statut
Membre
Dernière intervention
22 décembre 2016
22 déc. 2016 à 13:56
22 déc. 2016 à 13:56
Bonjour Patrice,
Merci pour l'info, je ne savias pas comment joindre mon fichier.
Ce sera plus simple pour vous de comprendre ce que je souhaite (enfin je l'espère)
https://www.cjoint.com/c/FLwm2IfO1lL
PS: Les données affichées sont inventées
Merci pour l'info, je ne savias pas comment joindre mon fichier.
Ce sera plus simple pour vous de comprendre ce que je souhaite (enfin je l'espère)
https://www.cjoint.com/c/FLwm2IfO1lL
PS: Les données affichées sont inventées
abrareus
Messages postés
3
Date d'inscription
jeudi 22 décembre 2016
Statut
Membre
Dernière intervention
22 décembre 2016
22 déc. 2016 à 14:02
22 déc. 2016 à 14:02
Si jamais le lien précédent ne marchait pas...
https://www.cjoint.com/c/FLwm5U2xfXL
https://www.cjoint.com/c/FLwm5U2xfXL
iBenny
Messages postés
96
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
3 avril 2022
2
27 déc. 2016 à 17:38
27 déc. 2016 à 17:38
Petite optimisation ici : Param dispensable (de trop)
Joyeux temps des fêtes ! :-)
iBenny
Sub Recaplavages() Worksheets("Récap lavages").Select: Application.ScreenUpdating = False Dim NL As Integer, col As Integer Dim dlig As Long, lig1 As Long, lig2 As Long ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux dlig = Range("A" & Rows.Count).End(xlUp).Row: Range("D4:AA" & dlig).ClearContents With Worksheets("Recettelavage") dlig = .Range("C" & Rows.Count).End(xlUp).Row For lig1 = 4 To dlig NL = Val(.Cells(lig1, 3)) If NL > 0 Then If Not IsEmpty(.Cells(lig1, 6)) Then lig2 = NL + 3 For col = 4 To 27 If .Cells(lig1, 6) = Cells(3, col) Then Cells(lig2, col) = .Cells(lig1, 9): Exit For Next col End If End If Next lig1 End With End Sub
Joyeux temps des fêtes ! :-)
iBenny
iBenny
Messages postés
96
Date d'inscription
lundi 23 janvier 2012
Statut
Membre
Dernière intervention
3 avril 2022
2
Modifié par iBenny le 27/12/2016 à 19:42
Modifié par iBenny le 27/12/2016 à 19:42
Et optimisé au max, on peu virer les NL et Lig2 :
Sub Recaplavages() Dim col As Integer Dim dlig As Long, lig1 As Long Worksheets("Récap lavages").Select Application.ScreenUpdating = False ' effacer tous les paramètres précédents : pas de mélange entre anciens et nouveaux dlig = Range("A" & Rows.Count).End(xlUp).Row Range("D4:AA" & dlig).ClearContents With Worksheets("Recettelavage") dlig = .Range("C" & Rows.Count).End(xlUp).Row For lig1 = 4 To dlig If .Cells(lig1, 3) and Not IsEmpty(.Cells(lig1, 6)) Then For col = 4 To 27 If .Cells(lig1, 6) = Cells(3, col) Then Cells(Cells(lig1, 3) + 3, col) = .Cells(lig1, 9): Exit For Next col End If Next lig1 End With End Sub
Bonjour iBenny,
Réponse à ton message #8
Je pense sincèrement que tu as fait une mauvaise optimisation de mon code
en enlevant param, car il était affecté une fois pour 2 utilisations à l'intérieur
de 2 boucles For imbriquées !
Réponse à ton message #9
Là encore, je pense que tu as fais deux mauvaises optimisations :
a) Enlever NL : idem : affecté une fois puis utilisé 2 fois à l' intérieur de la
1ère boucle For
b) Enlever lig2 : par rapport à la 2ème boucle For, lig2 est affecté avant, puis
utilisé une fois à l'intérieur ; mais c'est justement parce qu'il est inclus
dans la boucle que même utilisé une fois seulement, ça vaut le coup !
Bonnes fêtes à toi aussi, albkan