Boucle plante uniquement sur dernière itération

  • Initiateur de la discussion Initiateur de la discussion Sebast
  • Date de début Date de début

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 !

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,
j'ai adapté un code à mon besoin mais je bute sur une boucle et sur une mise en forme :

Mon code passe en revue les feuilles du fichier et effectue les actions suivantes s'il y a un TCD

- met les mois tel que demandé (on saisit de 1 à 12), c'est-à-dire déploie ou restreint les périodes du TCD
- affiche le TCD

1er problème : boucle
Il doit y avoir une erreur dans ma boucle car quand le dernier onglet (pas avant …) a été traité, le debugger met en jaune fluo l'instruction Sheets(sh).Select
Pourtant, cette instruction me paraît indispensable, sinon, comment passer d'une feuille à l'autre ?

2ème problème : centrage
Je n'arrive pas à centrer l'affichage ni à mettre en taille maxi, malgré .CenterVertically = True et .FitToPagesTall = 1 etc.

Quelqu'un a-t-il une idée concernant cette boucle et ce problème de centrage ?

Merci d'avance
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
le code est le suivant (détails dans Ma_question.xlsm):

Sub Ajuster_Date_et_Afficher_Tableau()

Dim sh As Long
Dim DateRéponse As Long

DateRéponse = Application.InputBox("A quel mois inclus voulez-vous restreindre l'affichage ?")

For sh = 1 To Sheets.Count

Sheets(sh).Select

If ActiveSheet.PivotTables.Count > 0 Then

With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois")
.PivotItems("Janvier").Visible = True
.PivotItems("Février").Visible = True
.PivotItems("Mars").Visible = True
.PivotItems("Avril").Visible = True
.PivotItems("Mai").Visible = True
.PivotItems("Juin").Visible = True
.PivotItems("Juillet").Visible = True
.PivotItems("Août").Visible = True
.PivotItems("Septembre").Visible = True
.PivotItems("Octobre").Visible = True
.PivotItems("Novembre").Visible = True
.PivotItems("Décembre").Visible = True

If DateRéponse < 2 Then .PivotItems("Février").Visible = False
If DateRéponse < 3 Then .PivotItems("Mars").Visible = False
If DateRéponse < 4 Then .PivotItems("Avril").Visible = False
If DateRéponse < 5 Then .PivotItems("Mai").Visible = False
If DateRéponse < 6 Then .PivotItems("Juin").Visible = False
If DateRéponse < 7 Then .PivotItems("Juillet").Visible = False
If DateRéponse < 8 Then .PivotItems("Août").Visible = False
If DateRéponse < 9 Then .PivotItems("Septembre").Visible = False
If DateRéponse < 10 Then .PivotItems("Octobre").Visible = False
If DateRéponse < 11 Then .PivotItems("Novembre").Visible = False
If DateRéponse < 12 Then .PivotItems("Décembre").Visible = False
End With

With ActiveSheet.PageSetup
.CenterHorizontally = True
.CenterVertically = True
.FitToPagesTall = 1
.FitToPagesWide = 1
End With

With ActiveSheet
If .PivotTables.Count > 0 Then .PivotTables(1).TableRange2.Select ' après THEN cette instruction pour ne prendre en
ActiveSheet.PrintPreview ' compte que le tcd (pas les colonnes vides avec format)
End With

End If ' fin test si feuille contient TCD

Next ' on passe au sh suivant

End Sub
 

Pièces jointes

Re : Boucle plante uniquement sur dernière itération

Bonjour Sebast

Salut Chalet

Je confirme les dires de Chalet : c'est la Feuille Source qui n'est pas visible
Par ailleurs j'ai redefini les plages d'impression pour que le centrage soit efficace
 

Pièces jointes

Re : Boucle plante uniquement sur dernière itération

Bonjour PierreJean,

merci beaucoup pour ton code, qui simplifie l'approche (j'avais corrigé le mien, au vu de la réponse de CHALET53, en "démasquant" toutes les feuilles mais effectivement, c'est mieux de ne traiter que les feuilles spontanément visibles).

En revanche, la mise en forme ne me saute pas au yeux et je ne comprends toujours pas pourquoi mes tableaux ne se centrent pas.
Dans le fichier que tu as joint, par exemple le tableau "France autre TCD" est corectement positionné, c'est à dire centré, alors que les autres sont justifiés à gauche (même s'il est vrai que la structure est un peu différente).

Pourtant, les instructions .CenterHorizontally = True et .FitToPagesWide = 1 etc. devraient centrer, mais ici sans effet.

Quelqu'un connait-il l'astuce ?

Merci d'avance
 
Re : Boucle plante uniquement sur dernière itération

Re

Je m'etais contenté de redefinir en Manuel les zones d'impression
Voila avec la même redefinition mais en Vba

Teste et dis-nous
 

Pièces jointes

Dernière édition:
Re : Boucle plante uniquement sur dernière itération

Merci pour ces modifications : ça marche impeccable !

Comme je ne connais pas toutes les subtilités, peux-tu me détailler l’instruction :

1).PrintArea = ActiveSheet.PivotTables("Tableau croisé dynamique1").TableRange1.Address
Dans un fil précédent, j’avais relévé que si je voulais ne prendre en compte que le tcd et pas les éventuelles colonnes autour ayant contenu des formats ou des calculs même effacés, il fallait utiliser :
If .PivotTables.Count > 0 Then .PivotTables(1).TableRange2.Select etc (c'est-à-dire ici TableRange2, donc 2 et pas 1)


En prenant ton instruction .PrintArea = ActiveSheet.PivotTables("Tableau croisé dynamique1").TableRange1.Address, ce risque est-il aussi éliminé ?


2) Je vois dans ton code que tu utilises cette instruction un peu plus loin juste avant l’affichage en PrintPreview : ne fait-elle pas doublon avec PrintArea = ActiveSheet.PivotTables("Tableau croisé dynamique1").TableRange1.Address ?


Merci d’avance pour tes lumières
 
Re : Boucle plante uniquement sur dernière itération

Re

Je ne suis pas beaucoup plus ferré que toi en ce qui concerne les subtilités

1) ces lignes ne sont pas de moi et je ne saurais mieux les expliquer
With ActiveSheet
If .PivotTables.Count > 0 Then .PivotTables(1).TableRange2.Select ' après THEN cette instruction pour ne prendre en
ActiveSheet.PrintPreview ' compte que le tcd (pas les colonnes vides avec format)
End With

2) Il est peut-etre preferable de choisir TableRange2
On est la dans le domaine des subtilités

Je suis plutot pragmatique et c'est apres avoir constaté que la definition de la zone d'impression s'imposait pour avoir le centrage effectif que j'ai cherché (et trouvé) comment la definir en Vba à chaque utilisation de la macro
 
Re : Boucle plante uniquement sur dernière itération

Re,

l'essentiel et que ça fonctionne, même dans les cas limite que je force en vue de tester (j'effectue un calcul, je mets le tout en % puis j'efface et je constate que ça ne sélectionne bien QUE le tcd et pas les colonnes adjacentes).

Donc impeccable !

Encore un grand merci pour ta disponibilité
 
- 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

Discussions similaires

Réponses
7
Affichages
211
Réponses
7
Affichages
770
Réponses
7
Affichages
163
Réponses
2
Affichages
511
Retour