| ||||||||
Petit astucien | Bonjour à tous,
Je dois faire un tableau croisé dynamique (TCD) en VBA à partir de la feuille "synthèse" du classeur dont je joins le lien. http://cjoint.com/?0Brl0FPvyfN J'ai contruit une macro et je souhaiterais coloriser les champs en fonction des valeurs de la base : en vert pour les cas suivants : 1 - Réussite en 4 trim 1 - Réussite en 5 trim 1 - Réussite en 6 trim
en orange pour le cas ci-dessous 2- autre cas de réussite
La macro fonctionne si toutes ces valeurs sont présentes dans la base. (onglet .Synthèse avec toutes valeurs)
Mais, si par hasard la dernière valeur ne figurait pas (2- autre cas de réussite ) les codes couleurs ne marchent plus et une couleur orange apparait pour les autres cas de réussite : (voir l'onglet "TCD-effectifs"), généré à partir de la feuille synthèse dans laquelle il manque la valeur 2- autre cas de réussite. je pense que j'ai un problème de type gestion d'erreur
ci-dessous le code VBA Sub I_TCD_Effectifs() Application.DisplayAlerts = False 'suppression de la feuille "TCD_Effectifs" si elle existe
Selection.CurrentRegion.Select
On Error Resume Next
With ActiveSheet.PivotTables("tcd_effectifs").PivotFields( _
'encadrement et alignement du TCD
Merci de votre aide
| |||||||
Publicité | ||||||||
| ||||||||
Astucien | Bonsoir, Sub I_TCD_Effectifs() J'ai pas mal hésité à me lancer, je trouve les fragments d'enregistrements de macro particulièrement indigestes et à l'opposé d'une programmation rationnelle. Je te renvoie à mes remarques lors d'un précédent sujet... De plus je ne suis pas du tout familier des TCD ! Cependant, comme ton erreur était patente, cela m'a entraîné à rechercher une solution... Tu avais placé un gestionnaire d'erreur au milieu de ta macro ! On le place à la fin pour ne pas perturber l'exécution du code. Et avant l'étiquette de branchement sur le gestionnaire on place un : Exit Sub pour éviter de "gérer" une erreur inexistante en fin de macro. Cela aurait pu avoir des effets complètement imprévus si ce gestionnaire n'avait été complètement inopérant ! En effet, pour que le gestionnaire soit actif, il faut qu'en début de macro ou à un emplacement judicieusement choisi figure l'instruction : On Error GoTo xxx (xxx étant l'étiquette de branchement). Or tu as placé comme instruction : On Error Resume Next (même deux fois mais une suffit largement) qui aboutit de fait à ignorer toute erreur d'exécution survenant dans le déroulement de la macro. Donc lorsque tu utilises la méthode PivotSelect pour sélectionner une ligne qui n'existe pas dans le TCD, une erreur se produit, qui n'arrête pas l'exécution laquelle se poursuit en affectant la couleur orange à la sélection précédente qui n'a pas été modifiée. Hormis ce problème, il serait préférable de placer la macro dans un module standard (et réserver le module ThisWorkbook aux évènements de classeur). Je rappelle aussi qu'il n'est pas inutile de déclarer les variables (ce que je n'ai pas fait ici ! ), cela peut éviter des résultats inattendus et cela améliore le fonctionnement. J'ai noté aussi que tu désactivais l'affichage, c'est parfois ou même souvent utile, mais antinomique avec toute la série de sélections qui suit ! De plus, quand on désactive, il ne faut pas oublier de réactiver. On devrait pouvoir faire mieux pour cette macro mais cela exige une connaissance approfondie du modèle objet en ce qui concerne les TCD, ce qui n'est pas mon cas. | |||||||
Petit astucien | Bonjour Ferrand Je te remercie encore une fois ! J'étais sûr que l'on se retrouverait ; (cf mon dernier post https://forum.pcastuces.com/macro_vba_valeur_maximale-f23s33384.htm?page=1�)
Il est vrai que depuis je n'ai pas investi dans un ouvrage VBA même si je suis allé voir les contenus que tu m'avais indiqués. Pour l'instant je suis dans une phase où je me dois d'être efficace au risque d'appliquer des contenus indigestes pour reprendre ton expression de l'enregistreur de macro. Par contre j'ai du mal à comprendre ton observation sur l'affichage "J'ai noté aussi que tu désactivais l'affichage, c'est parfois ou même souvent utile, mais antinomique avec toute la série de sélections qui suit ! De plus, quand on désactive, il ne faut pas oublier de réactiver." peux tu m'indiquer où était cette ligne dans mon précédent code ?
Je t'en remercie et c'est toujours un plaisir (en tout cas pour moi ) d'échanger avec toi.
Très bonne journée.
| |||||||
Astucien | Bonjour, Regarde dans ton code reproduit dans ton post initial, le début qui suit la suppression de la feuille accueillant le TCD, passage que j'ai supprimé presque en entier... : Sheets("Synthèse").Select 'J'ai conservé l'activation car l'ajout qui vient ensuite se fait par défaut avant la feuille active si on ne précise pas
Selection.CurrentRegion.Select
On Error Resume Next
Il n'y a pas plus loin réactivation (Application.ScreenUpdating = True). Mais quand tu actives ou sélectionnes ensuite des éléments graphiques, cela suppose que l'affichage soit actif pour que l'opération soit possible. De toute façon, ce n'était pas appliqué lors de l'exécution de ta macro, je n'ai pas déterminé exactement la raison... Ce qui est en rouge a été supprimé. Note que dans la macro réécrite, tu peux encore supprimer à la fin l'activation de la feuille TCD, inutile car elle est déjà active. Les sélections précédentes d'éléments du TCD qui s'y trouve l'ont nécessairement rendue active. Modifié par ferrand le 18/02/2014 09:37 | |||||||
Petit astucien | Bonjour Ferrand,
un grand merci pour tes explications ! Je serai vigilant et surtout j'espère avoir le temps d'apprendre ce "langage" sans brûler les étapes ! A bientôt ! | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | ||||||||||||||||||
|