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

7ngielen.xlsm (33.82 Ko)

@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).

6exo-ngielen-1.xlsm (35.84 Ko)

dhany

@ngielen

Lis d'abord mon message précédent, puis celui-ci.

Je te retourne ton fichier Excel modifié :

7ngielen.xlsm (39.91 Ko)

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

8ngielen-1.xlsm (34.02 Ko)

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 bien cela qu'il faut faire !

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é :

7exo-ngielen-2.xlsm (37.49 Ko)

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é :

12ngielen.xlsm (39.49 Ko)

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 ! (faut juste s'en rappeler ! )

.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 ! n'oublie pas de me tenir informé des résultats !

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

Rechercher des sujets similaires à "nouvelle definition dim sein macro"