VBA Excel : multisélection de feuilles

cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019 - 10 mars 2009 à 16:26
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 11 mars 2009 à 07:48
Bonjour,

Je souhaite modifier via VBA les marges de mise en page de plusieurs feuilles sélectionnées en même temps dans un classeur Excel 2003.

Je me fait aider par la création d'une macro en faisant une fois l'opération à la main.
Pas de problème, toutes mes feuilles ont changé de marges. Dans la macro, je trouve le Sheets(Array(.........).Select suivi du Sheets(1ère sheet).Activate. Enfin, les valeurs de marges à affecter.

Là où ça coince, c'est qu'en modifiant les valeurs de marges dans cette macro et en la relançant, seule la première sheet voit ses marges modifiées. Pourtant, en sortie de macro, toutes les feuilles sont bien sélectionnées.
Je m'en suis rendu compte car le code que j'avais écrit aboutissait au même résultat : seule la première feuille de la multisélection voit ses marges modifiées.

Si l'un d'entre-vous a rencontré le problème et trouvé la solution, je suis preneur. Merci.
En attendant, je boucle sur Each feuille et je modifie feuille après feuille...

Apolinaire

3 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
10 mars 2009 à 18:22
Bonjour

Difficile de te répondre avec certitude sans voir ton code, mais la propriété PageSetup ne peut s'appliquer qu'à un objet WorkSheet ou Chart, pas à une collection. Si tu regardes ton code, il est probable que la propriété PageSetup s'applique à un objet Workseet, sans doute ActiveSheet. Puisque tu ne peux pas l'appliquer à une collection de feuilles, tu dois effectivement boucler sur chaque feuille, comme dans l'exemple ci-dessous :

Dim feuilles  As Sheets
Dim feuille As Sheet
Set feuilles = Sheets(Array("Feuil1", "Feuil2"))
For Each feuille In feuilles
        With feuille.PageSetup
             ' mise en page
         End With
Next

Amicalement
0
cs_Apolinaire Messages postés 44 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 25 avril 2019
10 mars 2009 à 21:34
Tout à fait d'accord avec toi Orohena. Ce que tu donnes est d'ailleurs mon code d'aujourd'hui. Là où je suis surpris, c'est qu'en mode interactif la modification des marges se fait bien sur toutes les feuilles sélectionnées.
La macro construite pendant ce mode interactif applique effectivement les réglages à l'ActiveSheet. Sachant que la sélection est l'Array des feuilles (mon Dieu le français !) et que la feuille activée est la première de celles sélectionnées.

Alors pourquoi ça marche en interactif et que ça construit une macro qui foire quand elle est relancée avec d'autres valeurs ? Le résultat de cette macro se limite à la seule feuille "Active" et pas à l'Array sélectionné. Pourtant, toutes les feuilles ont bien été sélectionnées ; on le voit quand la macro est terminée.
Tu l'écris toi-même : "mais la propriété PageSetup ne peut s'appliquer qu'à un objet WorkSheet ou Chart, pas à une collection". En interactif, si.

Peut-être un manque (un bug ?) d'Excel qui sait le faire en interactif mais pas en VBA alors que toutes les conditions sont réunies de la même manière dans les deux cas.

Merci de ton intervention.
Apolinaire
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
11 mars 2009 à 07:48
Pour moi, tu as découvert un des rares cas où une macro enregistrée ne produit pas le même résultat, à l'exécution, que les actions qui l'ont générée.

Perso, je n'ai découvert qu'un seul cas similaire et tout aussi flagrant, au niveau du menu données/ validation/autoriser/liste, où le caractère séparateur des éléments d'une liste est incorrect et doit être remplacé.

Mon analyse vaut ce qu'elle vaut, mais je pense qu'il n'y a pas une relation très étroite entre le code exécuté en mode interactif et le source VBA généré lors de l'enregistrement d'une macro : ce source est peut-être généré à partir de modèles préétablis, le plus souvent fidèles, mais pas nécessairement.


Amicalement
0
Rejoignez-nous