Nouvelle définition de Dim au sein d'une macro
Suite à ma question d'hier qui a rapidement trouvé réponse, j'ai créé 3 autres macros.
Les 2 premières fonctionnant à merveille car très proche de celle qui a été résolue par vous...
Mais avec la 3ème j'affronte un autre problème
certaines actions ne s'appliquent pas à tous les onglets et je dois donc redéfinir les onglets actifs au sein de la macro
j'ai tenté quelque chose, mais Excel n'apprécie pas
Ca coince après le '05 quand je veux redéfinir Dim car l'onglet GO doit être sorti de la sélection pour un traitement différent.
je reviens donc à nouveau vers vous pour solliciter vos connaissances.
D'avance je vous remercie de vos conseils et solutions.
Voici ma macro :
Sub M04DevisProduction()
Dim NbFx%, LFX, FX, Onglet As Worksheet, n%: NbFx = Sheets.Count: Application.ScreenUpdating = False
LFX = Array("GO", "TO", "MEX", "PL", "CA", "MIN", "SA", "EL", "CH", "CUI", "AB", "FF", "FI")
'01 Retirer protections
For n = 1 To NbFx: Sheets(n).Unprotect "**": Next n
'02 Afficher tous les onglets
For Each Onglet In Worksheets: Onglet.Visible = True: Next Onglet
'03 Afficher des colonnes
For Each FX In LFX: Sheets(FX).Columns("A:Y").Hidden = 0: Next FX
'04 Afficher toutes les lignes
For Each FX In LFX: Sheets(FX).Select: [G1:G5000].AutoFilter Field:=1: Next FX
'05 Copie valeurs
For Each FX In LFX: Sheets(FX).Columns("C:F").Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Next FX
Dim NbFx%, LFX, FX, Onglet As Worksheet, n%: NbFx = Sheets.Count: Application.ScreenUpdating = False
LFX = Array("TO", "MEX", "PL", "CA", "MIN", "SA", "EL", "CH", "CUI", "AB", "FF", "FI")
'06 Suppression colonnes
For Each FX In LFX: Sheets(FX).Columns("J:U").Delete Shift:=xlToLeft: Next FX
'07 Modification onglet GO
Sheets("GO").Columns("O:O").Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheets("GO").Columns("K:K").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("GO").Columns("L:S").Delete Shift:=xlToLeft
'08 Suppression onglets COEF, IC et OPT
Sheets("COEF").Select
ActiveWindow.SelectedSheets.Delete
Sheets("IC").Select
ActiveWindow.SelectedSheets.Delete
Sheets("OPT").Select
ActiveWindow.SelectedSheets.Delete
Dim NbFx%, LFX, FX, Onglet As Worksheet, n%: NbFx = Sheets.Count: Application.ScreenUpdating = False
LFX = Array("GO", "TO", "MEX", "PL", "CA", "MIN", "SA", "EL", "CH", "CUI", "AB", "FF", "FI")
'09 Masquer les lignes vides
For Each FX In LFX: Sheets(FX).Select: [G1:G5000].AutoFilter Field:=1: [G1:G5000].AutoFilter Field:=1, Criteria1:="<>": Next FX
'10 Remettre protections
For n = 1 To NbFx
Sheets(n).Protect "**", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=True, _
AllowFormattingColumns:=True, AllowInsertingRows:=True, AllowDeletingRows:=True, AllowFiltering:=True
Next n
End Sub
Bonjour,
Je ne suis pas certain que pour la lisibilité il faille mettre les " : " sur une même ligne au lieu de l'une sous l'autre avec indentation
Pas testé le code puisque pas de fichier
P.
Merci patrick !
c'est moi qui l'ai fait, de mettre sur une seule ligne !
mais j'le fais que quand la ligne est courte.
dhany
En effet Dhany a modifié la base de ma macro et ca fonctionne super bien sur les 3 premières macros
je joins un fichier vierge vu la confidentialité du fichier d'origine, avec juste les onglets créés
@ngielen
Avant de voir ta nouvelle demande et ton nouveau fichier, voici une nouvelle version légèrement optimisée de mon fichier précédent (merci de bien lire tous les commentaires inclus dans le code VBA ; ce sont les lignes avec une apostrophe devant, donc de couleur verte).
dhany
@ngielen
Lis d'abord mon message précédent, puis celui-ci.
Je te retourne ton fichier Excel modifié :
⚠ Le code VBA n'est pas fonctionnel, donc tu ne dois pas l'exécuter !!!
Lis bien les commentaires ; y'a des choses à adapter et à éclaircir !!!
dhany
Bonjour Dhany,
Merci d'avoir encore regardé à ma macro.
J'ai donc adapté mes 3 macros en fonction de tes remarques.
Ci-joint la version adaptée.
Je comprend tout à fait la logique de prendre feuille par feuille et d'appliquer les modifications successivement plutôt que d'appliquer successivement les modifications à chaque feuille. C'est moins lisible en macro et plus efficace en effet.
J'ai bien compris aussi la structure que tu conseilles pour une meilleure lisibilité. Je tacherai d'en tenir compte
Je regarde à présent ton second message
Nicolas
Bonjour Nicolas,
Je viens de voir le fichier de ton message de 09:11.
Merci d'avoir laissé une indentation correcte ; je suis content que tu en aies compris l'intérêt !
Bravo pour la modularité du programme VBA !
C'est cette modularité qui permet d'optimiser encore plus le programme, car une sub peut être appelée par une autre sub ; donc par exemple si 3 sub A B et C sont différentes mais ont besoin de faire un même travail D, ce travail commun peut être placé dans une sub D qui sera appelée par chaque sub A B et C.
Note bien que la sub D du travail commun peut éventuellement avoir besoin d'être paramétrée, comme c'est le cas ici (paramètre Plg de type String) ; de plus, comme la 3ème sub n'a pas besoin d'envoyer un paramètre Plg (car chaîne vide), j'ai indiqué que le paramètre Plg est Optional, donc facultatif.
Tu verras que la sub commune s'appelle Devis et qu'elle est appelée par tes 3 autres sub de départ ; j'ai déclaré cette sub privée car elle n'a besoin d'être appelée que par les 3 autres sub du module.
En fait, tes 3 sub de départ sont identiques à cette seule différence près : l'étape 05 Masquer des colonnes :
1) pour la sub M01DevisEntreprise : il faut masquer les colonnes B et H
2) pour la sub M02DevisClient : il faut masquer les colonnes D à G
3) pour la sub M03DevisComplet : ne masquer aucune colonne
Je te retourne ton dernier fichier Excel avec code optimisé :
dhany
Dhany,
merci pour les adaptations.
voici les réponses à tes questions :
'05 Copie Valeurs
le but est de copier pour chaque onglet le contenu des colonnes C à F et d'écraser ces colonnes par un collage spécial des valeurs.
donc pour chaque onglet les colonnes C à F doivent être écrasées par les valeurs de ces colonnes.
Les valeurs de ces colonnes sont différentes dans les divers onglets et cela doit donc se faire onglet par onglet et non une copie identique sur tous les onglets.
Il faut donc garder le For Each FX ...
J'apprend à utiliser les macros avec l’enregistreur de macro Excel et reprend les formules qu'il me propose. J'entend bien que ce n'est pas optimal et te remercie des améliorations et résolutions que tu me proposes.
'06
Super, je comprend à présent comment exclure un onglet d'une formule et comment ne travailler que sur un onglet.
Parfait
'07
le but est de copier le contenu de la colonne O et d'écraser cette colonne O par un collage spécial des valeurs uniquement sur l'onglet "GO"
En gros, la seule question qu'il me reste je pense pour faire tourner cette macro est :
comment faire pour écraser une colonne avec un copié et un collage spécial des valeurs sur cette même colonne
pour 1 ou plusieurs colonnes?
Nicolas
Waw Dhany,
je suis impressionné par la simplicité apparente de cette macro qui faisait chez moi des dizaines et des dizaines de lignes!!!
en plus ramenée ainsi, ca évite de devoir faire 3 fois la même modification en cas de changement.
Vraiment top!!!
Merci beaucoup, et j'en apprend des choses en quelques messages échangés!
Nicolas
Bonjour Nicolas,
J'suis content qu'tu apprécies mes infos !
J'te retourne ton fichier Excel modifié :
dhany
Merci Dhany,
je vais tester ca.
pour la remarque sur étape 09 à mettre avant 02, je ne peux pas le faire car justement le copié-collé-valeur a pour but de supprimer les liens avec ces 3 derniers onglets avant de pouvoir les supprimer.
Par contre, je pense que le travail qui se fait sur les étapes avant ne concernent pas ces 3 onglets qui ne sont pas repris dans les LFX et qu'aucun travail inutile n'est donc fait sur ces onglets.
A lire le code, ca a l'air de fonctionner parfaitement.
Je vais le tester avec plaisir arrivé au bureau
que veux dire le -4163 après PasteSpecial? C'est le code pour coller une colonne sur la colonne copiée?
Nicolas
Tu a écrit :pour la remarque sur étape 09 à mettre avant 02, je ne peux pas le faire car justement le copié-collé-valeur a pour but de supprimer les liens avec ces 3 derniers onglets avant de pouvoir les supprimer.
Effectivement, s'il y a des liens, faut pas remonter l'étape 09 avant l'étape 02 ; très bonne remarque, bravo !!!
Tu a écrit :le travail qui se fait sur les étapes avant ne concernent pas ces 3 onglets qui ne sont pas repris dans les LFX et qu'aucun travail inutile n'est donc fait sur ces onglets.
C'est aussi une très bonne remarque ! je l'savais mais comme j'étais fatigué, j'l'ai oublié par une bête étourderie !
Tu a écrit :que veux dire le -4163 après PasteSpecial ? C'est le code pour coller une colonne sur la colonne copiée ?
-4163 est la constante numérique pour xlPasteValues ; c'est plus court à écrire et à lire !
.Copy: .PasteSpecial -4163 fait un copier / coller des valeurs, oui ... et si ça colle sur la colonne copiée, c'est seulement car l'objet utilisé pour le coller est le même que celui utilisé pour le copier : c'est celui qui est implicite avec le point qui est devant, donc ce qui est indiqué par le With situé plus haut.
Tu a écrit :A lire le code, ça a l'air de fonctionner parfaitement.
Je vais le tester avec plaisir arrivé au bureau
Bonne chance pour tes prochains tests !
dhany
Dhany,
vraiment un tout grand merci.
ca tourne à merveille!
je vais continuer à lire les sujets ici pour en apprendre plus
mais mes problèmes sont tous résolus!
Merci beaucoup
Nicolas