Synthèse de Tableau croisé dynamique via VBA ?

Bonjour,

Est-il possible en vba de retourner des valeurs filtrées qu'auraient pu renvoyer un Tableau croisé dynamique ?

Dans l'exemple joint, 2 onglets.

Sur l'onglet "Données" :

Un tableau, qui par ligne, renvoi un nombre d'heures effectuées par une personne à une date donnée.

Je cherche à automatiser certaines vérifications comme le dépassement des 35h hebdomadaires,...

Ces vérifications sont, dans le fichier exemple, reprisent sur l'onglet "Synthèse". J'ai saisi "à la main" les résultats des vérifications souhaitées.

La plupart de ces vérifications peuvent être faites via des tableaux croisés dynamiques, mais je me demandais s'il n'y avait pas possibilité de "simuler" ces TCD via VBA, et de retourner la synthèse..

En espérant avoir été clair,

Merci par avance !

78essai.xlsx (16.67 Ko)

Salut Kiriko,

J’ai considéré que ton tableau de base était d’avance regroupé par identifiants (colonne D) puis trié par date (colonne H), tel que présenté. Si ce n’est pas toujours le cas, il faudra modifier mon code en conséquence.

J’ai également créé mon code comme s’il pouvait y avoir plusieurs mois sur la même feuille (bien que tu ne reportes pas le mois sur la feuille Synthèse, dans le bloc colonne K:M, ce qui pourrait faire penser qu’il n’y a qu’un mois traité à la fois). On pourrait éventuellement légèrement simplifier le code s’il n’y a vraiment qu’un mois à traiter, mais ça fonctionne aussi comme ça.

Lorsque tu ouvres le fichier ci-joint, tu vois la feuille Synthèse entièrement vide. Par la suite, à chaque fois que tu la sélectionnes, elle sera normalement automatiquement mise à jour comme tu le désires en fonction des données de la feuille Données Telle qu’est préparée la feuille Données, ça couvre tous les cas possibles.

Cordialement.

175kiriko-v1.xlsm (38.63 Ko)

Salut Yvouille,

Merci beaucoup !!

J'ai envie de dire Waouh ! C'est vraiment impeccable !

J'avais de gros doute sur la clarté de mes explications, tu as parfaitement compris...

Sur la question des mois, effectivement, il n'y a normalement qu'un seul mois concerné. Toutefois, il peut arriver que certaines dates "débordent" un peu sur le mois précédent ou suivant, mais les calculs doivent se faire comme si c'était le même mois (la colonne K ("Mois") reste toujours la même, même si on déborde.

Je vais regarder si j'arrive à comprendre ton code pour le modifier en ce sens.

Je faisais également d'autres vérifications, à la main via Tableaux Croisés, que je vais intégrer (ou éventuellement tenter de m'inspirer de ton code) :

  • Qu'un N° de Dossier (colonne B) corresponde à un et un seul Libellé (colonne C) et inversement.
  • Qu'un Identifiant (colonne D) corresponde à un et un seul Nom-Prénom (colonnes E-F).

Mes excuses pour le post sur l'autre forum, je l'avais signalé là-bas mais n'avais pas édité celui-ci pour le signaler également.

Encore tous mes remerciements reconnaissants !!

Cordialement,

Kiriko

Re bonjour,

Kiriko a écrit :

Toutefois, il peut arriver que certaines dates "débordent" un peu sur le mois précédent ou suivant, mais les calculs doivent se faire comme si c'était le même mois (la colonne K ("Mois") reste toujours la même, même si on déborde.

J’ai été chercher l’information sur le mois dans la colonne H et non pas dans la colonne K de la feuille "Données". Comme je te l’ai déjà proposé, je peux modifier mon code en fonction de tes nouvelles informations. Mais je ne m’y lance pas si tu veux tenter le coup toi-même. Si nécessaire, merci de me le faire savoir.

Amicalement.

Re bonjour Yvouille,

J'ai simplement remplacé :

Do Until Month(ActiveCell.Offset(1, 0)) <> Month(ActiveCell) Or ActiveCell.Row = Dernière_Ligne

par :

Do Until ActiveCell.Row = Dernière_Ligne

et cela semble fonctionner.

Par contre je bloque sur les autres "validations" évoquées.

Voici ton fichier, avec la petite modif de ci-dessus, et un onglet supplémentaire concernant les autres validations (avec des exemples saisis "à la main").

Mais peut-être convient-il de créer un nouveau fil ?

Merci encore,

Cordialement,

37kiriko-v2.xlsm (37.80 Ko)

Bonjour à tous !

J'ai bidouiller ceci avec les nouveaux éléments, grâce à l'enregistreur de macros.

Cela fonctionne, mais je pense que je passe par des biais pas optimisés du tout, je me sers de Tableaux croisés,...

L'onglet "Validations" récupère les données de "Synthèse", ainsi que des éléments de l'onglet "Feuil2" (les TCD).

Si d’aventure vous pensez à une quelconque simplification et/ou optimisation, je suis preneur bien sûr !

Cordialement,

P.S. : L'onglet "Vérif2" ne sert à rien ici, c'était juste l'exemple initial saisi "à la main" des validations supplémentaires recherchées.

42kiriko-v5.xlsm (108.47 Ko)

Salut,

Tu vas un peu vite, je n'arrive pas à suivre. Et puis ça sert à rien qu'on avance chacun de notre côté.

Je te montre encore comment on pouvait modifier le passage pour les 150 heures d'une manière un peu plus "propre" puis je te laisse continuer avec ton nouveau problème (dont j'avais commencé à chercher une solution).

Cordialement.

74kiriko-v3.xlsm (41.58 Ko)

Bonsoir Yvouille, bonsoir à tous !

En fait, ma "solution" reprend le fonctionnement que j'utilisais avant, en utilisant des Tableaux croisés dynamiques.

Mais le but initial était justement d'essayer de m'en passer.

Le dernier exemple posté servait surtout à montrer le semblant de résultat que j'escomptais, mais avec les limites de l'enregistreur de macros, l'utilisation de TCD, de plusieurs onglets,.... Bref, pas optimisé du tout... J'imagine qu'un simple coup d’œil d'un programmeur de ton niveau constaterait aisément l'ampleur du désastre (même si cela fonctionne)

J'utilise personnellement Vba en grand débutant, principalement avec l'enregistreur de macro.

Maintenant, je peux tout à fait comprendre que tu sois échaudé, et ne souhaites pas poursuivre, je ne peux qu'être reconnaissant pour le temps déjà passé et l'aide apportée, mais saches que je suis néanmoins vivement intéressé par la solution que tu avais commencée à chercher, surtout si elle n'utilise pas de TCD.

Quoiqu'il arrive, encore vivement merci, pour toute l'aide apportée, sur ce sujet et sur les autres car ce n'est pas la première fois que tu me rends service...

Bien cordialement,

Salut Kiriko,

Je ne dirai pas que je suis échaudé, mais il y a deux choses qui me font t’écrire comme je l’ai fait.

Je pense effectivement que si l’on avance chacun de son côté, ça ne sert à rien puisque l’un des deux va obligatoirement devoir laisser tomber son travail et repartir dans la direction de l’autre. On en a un bel exemple avec la correction du code pour la partie des 150 heures où j’avais déjà imaginé une solution (selon indications inscrites dans le code du premier fichier fourni) avant même que tu en corriges toi-même un autre passage.

Ensuite j’avais vraiment commencé à travailler sur la deuxième partie de tes questions, mais il me semblait que le résultat que je pouvais obtenir selon mes connaissances serait probablement moyen. Je voulais toutefois aller au bout de mes essais ; ça m’aurait permis en premier lieu d’en avoir le cœur net et en deuxième lieu de t’offrir une solution provisoire en attendant mieux. Dans ton cas précis, je pense effectivement qu’il faudrait passer par des tableaux afin d’être plus rapide et ces tableaux – en VBA - je ne les connais encore que très peu.

Voilà, je te laisse voir si tu t’en sors tout seul, si tu veux ouvrir un autre fil afin de chercher quelqu’un qui pourrait t’offrir une solution probablement plus rapide que celle que je pourrais t’offrir moi ou – si tu ne trouves pas d’autre solution – que je me repenche sur ton soucis. Eventuellement que ce serait l’occasion pour moi de revoir les « Tableaux VBA »

Amicalement.

Bonjour Yvouille,

Merci de ta réponse,

Je pense que je vais effectivement ouvrir un nouveau post pour la 2ème partie.

Concernant la 1ère partie, je suis tombé sur un soucis que je n'arrive ni à m'expliquer, ni à corriger :

L'onglet "Données" est censé être classé par Nom, Prénom, puis date (ce qui effectivement permet le regroupement par identifiant puis classé par date comme en a besoin ton code).

Comme c'est une condition pour que ton code fonctionne, j'ai pensé rajouter ce tri par vba au début de ton code...

Et là, bizarrement, ça ne fonctionne plus. De plus, avec ton code original (sans ce rajout de tri auto), si on a le malheur de l'exécuter sans que les données soient bien triées, évidemment ça ne fonctionne pas, mais le plus étonnant est que même si ensuite on refait le tri adéquat, cela ne fonctionne plus ! Il me faut enregistrer, fermer puis réouvrir le classeur... J'y perd mon latin...

Aurais-tu la gentillesse, la patience et l'envie de te pencher sur ce problème nouveau ?

Je précise à toute fin utile que j'utilise office 2013.

Merci par avance !

Cordialement,

EDIT : Il semblerait qu'une partie du problème soit lié à enableevents, j'ai lu ton post sur le sujet mais je sèche toujours... A moins de partir sur une macro "classique" avec bouton, et non une évènementielle, je ne vois pas...

Bonjour,

Tu m’as demandé un code qui réalisait certaines opérations et je t’en ai fourni un qui fonctionnait.

Maintenant tu veux essayer d’y rajouter des trucs et ça foire. Je trouve que ce n’est plus ma faute et qu’il s’agit d’une autre question.

Si, lors de tes essais, le code mis en place est interrompu et que la macro ne passe pas par l’avant dernière instruction Application.EnableEvents = True, juste avant l’instruction finale Exit Sub, c’est normal que les macros événementielles ne soient plus déclenchées. Le plus simple dans ces cas-là, c'est effectivement de refermer Excel complètement.

De là à dire qu’on doit remplacer cette instruction événementielle à cause de ça, c’est un pas que je ne franchirais pas. Sauf durant la création du code, il n’y a aucun inconvénient et que des avantages avec cette manière de faire.

Si tu as besoin d’aide pour mettre en place le tri préalable, je suis malgré tout à ta disposition.

Bonnes salutations.

Bonsoir Yvouille,

Bien sûr, rien n'est de ta faute, je dirais plutôt que le grand avancement de mon projet est exclusivement dû à toi !

Mon incompréhension se situe surtout sur le fait que si, sans rien toucher à ton code, et donc sans vba, je tri l'onglet "données" par Nom, Prénom, puis Date, et bien le code plante, alors que nous avons bien un regroupement par identifiant puis classé par date dans ce cas.... Cela n'est pas grave, j'ai contourné en exécutant avant ton code un tri par identifiant puis date, et à la fin du code, par nom, prénom, date... Mais il est vrai que j'aimerais comprendre pourquoi cela plante pour ma culture personnelle...

L'idée du tri préalable étant d'anticiper le plus possible les erreurs d'utilisateurs pouvant faire planter le code. Et le mauvais tri en est un bon exemple. Le classeur étant destiné à être utiliser par certaines personnes encore moins calées que moi en excel...

Bref, j'arrive à quelquechose de satisfaisant (même avec la seconde partie), je posterais mon fichier un peu plus tard mais je ne comprend pas tout, loin de là...

Quoiqu'il en soit, je serais honoré que tu veuilles bien accepter mes remerciements les plus sincères, même si mon comportement semble avoir été plusieurs fois contre-productif, je reste admiratif non seulement des compétences de beaucoup de forumeurs, mais aussi de la gracieuseté des aides apportées, et quelques "merci" sont à la fois un minimum, et bien peu de choses...

Bonsoir Yvouille, bonsoir à tous !

En me servant principalement du code de Yvouille, merci encore à toi, voici une version satisfaisante qui "fait le boulot", et qui prend en compte la 2nde partie de mon soucis.

On est sur du grand bidouillage, mais ça fonctionne.

Si quelqu'un à des pistes d'optimisation, qu'il n'hésite pas...

Encore merci, et longue vie au forum !!!

Cordialement,

19kiriko-v6.xlsm (117.61 Ko)

Salut,

Je ne comprends pas très bien : Pour le passage "150 heures", je t'ai fourni un code corrigé qui est bien plus propre que mon ancien code à n'utiliser que si plusieurs mois doivent être traités, mais tu utilises toujours mon ancien code

Kiriko a écrit :

Concernant la 1ère partie, je suis tombé sur un soucis que je n'arrive ni à m'expliquer, ni à corriger :

L'onglet "Données" est censé être classé par Nom, Prénom, puis date (ce qui effectivement permet le regroupement par identifiant puis classé par date comme en a besoin ton code).

Comme c'est une condition pour que ton code fonctionne, j'ai pensé rajouter ce tri par vba au début de ton code...

Et là, bizarrement, ça ne fonctionne plus.

Si pour ta culture personnelle – comme tu l’indiques – tu veux comprendre ce problème, je peux bien essayer de comprendre moi-même. Peux-tu alors me fournir un fichier présentant ce problème d'une manière isolée, car dans ton fichier Kiriko_V6 il y a tellement de macros enregistrées par l’enregistreur que je n’y vois plus trop clair.

Cordialement.

Bonjour à tous,

Bonjour Yvouille,

Effectivement, je me suis emmêlé dans les versions, je vais de ce pas modifier ma dernière version avec le bon code (encore une preuve de mon manque de rigueur et de mon coté brouillon).

Voici une copie de ton dernier fichier fourni (la V3), simplement trié par Nom, prénom puis date, tri qui fait planter le code sans que je comprenne pourquoi comme indiqué.

Merci encore pour tout !

Cordialement,

20kiriko-v3.xlsm (37.70 Ko)

Salut,

Après m’être creusé la tête pendant assez longtemps, j’ai finalement découvert le problème. Comme celui-ci ne s’était jamais présenté avec ton premier tableau de données, je ne m’en étais pas rendu compte plus tôt.

Pour chacun des blocs « 10 heures », « 35 heures » et « 6 jours », j’avais tout d’abord un code qui cherchait la dernière ligne ainsi

Do Until ActiveCell.Offset(1, 0) <> ActiveCell

Je m’étais déjà rendu compte avec mon premier fichier qu’avec les blocs « 35 heures » et « 6 jours » il pouvait y avoir des problèmes et j’avais rajouté pour ces deux blocs une limite à la ligne ci-dessus qui est devenue

Do Until ActiveCell.Offset(1, 0) <> ActiveCell Or ActiveCell.Row = Dernière_Ligne

Comme aucun problème ne s’était présenté jusqu’à ce que tu tries tes données différemment, je n’ai pas mis cette même limite au bloc « 10 heures ».

Il m’a suffi maintenant d’ajouter la même condition complémentaire dans ce bloc et le problème est résolu.

Sans ce rajout, la macro tourne en rond sans fin si – pour deux identifiants – tu as le même jour en colonne H, tels que dans les cellules marquées en jaune dans le fichier ci-joint.

Cordialement.

32kiriko-v10.xlsm (41.07 Ko)

Bonjour Yvouille, bonjour le forum !

Merci beaucoup, c'est impeccable !!

Je pensais bêtement que le soucis pouvait être dû à cet enchainement :

862 GARG JOSEPH 5,74 19/03/13

862 GARGARINE YOURI 8,95 06/03/13

car suite à une "erreur" (volontaire) sur le nom prénom, nous avions ici un enchainement d'identifiant qui ne se suivait pas dans les dates... Mais je me trompais complètement. A la lumière de ton explication, la solution de contournement pas propre du tout que j'avais tentée (tri par identifiant puis date automatique avant ton code, puis retri par nom prénom date après le code), fonctionnait dans l'exemple, mais pouvais donc planter en fonction du fichier...

Bref, tout ça pour dire un grand merci, non seulement tu me fourni un fichier qui me convient parfaitement, mais en plus, j'ai appris deux trois trucs qui pourront me servir ultérieurement...

Avec donc tous mes remerciement et ma reconnaissance,

Amicalement,

Kiriko

Rechercher des sujets similaires à "synthese tableau croise dynamique via vba"