Boucle plante uniquement sur dernière itération

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

  • Ma_question.xlsm
    426.9 KB · Affichages: 42
  • Ma_question.xlsm
    426.9 KB · Affichages: 42
  • Ma_question.xlsm
    426.9 KB · Affichages: 68

pierrejean

XLDnaute Barbatruc
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

  • Ma_question.xlsm
    430.5 KB · Affichages: 36
  • Ma_question.xlsm
    430.5 KB · Affichages: 53
  • Ma_question.xlsm
    430.5 KB · Affichages: 47

Sebast

XLDnaute Impliqué
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
 

pierrejean

XLDnaute Barbatruc
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

  • Ma_question.xlsm
    432.3 KB · Affichages: 36
  • Ma_question.xlsm
    432.3 KB · Affichages: 39
  • Ma_question.xlsm
    432.3 KB · Affichages: 32
Dernière édition:

Sebast

XLDnaute Impliqué
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
 

pierrejean

XLDnaute Barbatruc
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
 

Sebast

XLDnaute Impliqué
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é
 

Discussions similaires

Statistiques des forums

Discussions
312 165
Messages
2 085 882
Membres
103 011
dernier inscrit
rine