XL 2016 VBA - Traitement de données avec valeurs identiques dans un dictionnaire

Mak_tarmak

XLDnaute Junior
Bonjour,
Je sollicite votre conseil car je n'arrive pas à trouver la bonne méthode pour obtenir ce que je veux.

Dans un fichier, j'ai deux onglets :
- ELT_SESSIONS qui contient des cellules avec des données fixes (en gris) et des données calculées en vba (en jaune).
On peut effacer à souhait les données en jaune, elles sont générées par les macros.

- audit_user qui contient les données d'un rapport qui peut faire plus de 50 000 lignes.

Ce fichier me sert à contrôler des présences de stagiaires par rapport à des heures saisies afin de voir si elles coincident.

Par exemple le code session 6380 devrait remonter 4, 4, 1 dans les colonnes D à K car le code utilisateur 3102465 apparait 2 fois dans audit_user.
Du coup, cela influera aussi sur la somme des heures en colonne O puisque l'on prendra 7 au lieu de 10,5 pour cet utilisateur.

La macro ctrl_presences est censée parcourir chaque id session de la colonne B de ELT_SESSIONS et vérifier s'il y a une occurrence dans la colonne I de audit_user.
Si l'id session est trouvé dans audit_user, elle doit vérifier dans la colonne A que le code utilisateur est unique. S'il y a plusieurs fois le même code, il ne faut traiter que la dernière ligne de ce code utilisateur (il peut y avoir 3 ou 4 fois le même code utilisateur mais il ne faut pas supprimer les autres lignes, juste ne pas en tenir compte dans le traitement).
Une fois que la liste des codes utilisateurs valides est dressée, je regarde la valeur du statut d'avancement dans N et je compte combien de fois il apparait selon une liste de statuts et je colle chaque compte dans les cellules D à K pour chaque id session.
Sur cette macro, mon compte est faux car je n'arrive pas à écarter les lignes précédentes quand il y a plusieurs codes utilisateurs identiques.


La macro CalculerPrevisionHeures me calcule la prévision d'heures si toutes les inscrits en colonne C de ELT_SESSIONS sont tous présents.


La macro CalculerHeuresParStatut me calcule le nombre d'heures que je dois avoir (colonne N) en fonction des statuts de présence (colonnes D à K) et du nombre de segments (colonne L).
Un segment est une demi-journée de 3,5 heures.
Si une personne est absente, cela retourne 0.
Si présente, cela retourne le nombre de présents * (nbre de segments * 3,5).
Si partiellement présent, cela retourne le nombre de partiellement présent * ((nbre de segments * 3.5) - 3.5))
Actuellement mon nombre d'heures retournées est faux car je n'arrive pas à écarter les lignes des codes utilisateurs en plus sur la macro précédente.


La macro ReelHeuresSaisies est censée retournée la somme des heures en colonne O de audit_user, une fois les codes utilisateurs identiques écartés en ne gardant que celui de la dernière ligne.



Je n'ai pas le droit de supprimer des lignes dans le rapport, c'est pour cela que je voulais vérifier les codes utilisateurs uniques et les stocker dans une collection ou un dictionnaire mais je ne maitrise pas cette fonctionnalité et je n'ai pas réussi à adapter les différentes macros que j'ai trouvé sur le sujet.

J'espère que vous pourrez m'orienter sur une méthode qui pourrait convenir car je ne sais plus par quel bout attaquer :)

Si j'ai oublié quelque chose, n'hésitez pas à revenir vers moi.
En vous remerciant,
 

Pièces jointes

  • TEST_ELT_SESSIONS.xlsm
    38.7 KB · Affichages: 5
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
En réécrivant la Sub autrement je me suis aperçu que vos chiffres en D:K étaient justes, y compris les "Présent". Ce serait plutôt les "nbre inscrit(s)" qui comptent les "Utilisateur" distincts au lieu de compter les lignes de chaque sorte de "Statut d’avancement2"
 

Pièces jointes

  • GigogneMac_tarmak.xlsm
    74.3 KB · Affichages: 2
Dernière édition:

Mak_tarmak

XLDnaute Junior
Bonjour.
En réécrivant la Sub autrement je me suis aperçu que vos chiffres en D:K étaient justes, y compris les "Présent". Ce serait plutôt les "nbre inscrit(s)" qui comptent les "Utilisateur" distincts au lieu de compter les lignes de chaque sorte de "Statut d’avancement2"
Bonjour Dranreb, merci pour votre réponse. En D:K les chiffres ne sont pas bons car dans la colonne A de audit_user, il y a plusieurs codes utilisateurs identiques. Par exemple, pour la session 5374, vous avez le code 3102623 x3, le 7020534 x3 et le 7019923 x2. Et il faut que je garde seulement la dernière ligne où apparait ce code car elle contient la dernière modification qui a été faite pour ce code utilisateur. Ensuite je dois compter les statuts d'avancement en N et le total des heures en O pour les codes utilisateurs uniques. C'est pour ça que je voulais m'essayer au dictionnaire mais j'ai un peu de mal ;)
 

Mak_tarmak

XLDnaute Junior
D'accord, en ne prenant que la dernière ligne de chaque utilisateur j'obtiens ça :
Merci beaucoup, c'est exactement ça et en plus les codes stages sont classés. Top !
Votre code est ultra factorisé par rapport au mien :)
Le module MGigogne est quelque chose que vous aviez déjà et que vous réutilisez souvent ? ça a l'air très utile.
Vous pensez que je peux arriver à utiliser votre code pour être sûr d'avoir le bon total des heures en colonne O pour les codes utilisateurs uniques ?
 

Dranreb

XLDnaute Barbatruc
Alors oui, j'ai compris depuis que pour obtenir la dernière colonne il suffit d'ajouter devant la Next SGrUti, SGrSession, SGrStage :
VB:
TR(L, 15) = TR(L, 15) + Détail(15)
Par contre les colonnes devant je ne sais pas d'où elle viennent.
Et oui, j'ai développé le MGigogne il y a longtemps.
 

Mak_tarmak

XLDnaute Junior
Merci beaucoup, c'est exactement ça et en plus les codes stages sont classés. Top !
Votre code est ultra factorisé par rapport au mien :)
Le module MGigogne est quelque chose que vous aviez déjà et que vous réutilisez souvent ? ça a l'air très utile.
Vous pensez que je peux arriver à utiliser votre code pour être sûr d'avoir le bon total des heures en colonne O pour les codes utilisateurs uniques ?
j'avoue que j'ai du mal à comprendre votre code et l'adapter à mon fichier source. J'ai essayé de coller un jeu de données plus importantes sous le vôtre mais cela efface tout. Mon fichier source fait 400 lignes de codes stages et cela ira sûrement en grandissant.
 

Mak_tarmak

XLDnaute Junior
Alors oui, j'ai compris depuis que pour obtenir la dernière colonne il suffit d'ajouter devant la Next SGrUti, SGrSession, SGrStage :
VB:
TR(L, 15) = TR(L, 15) + Détail(15)
Par contre les colonnes devant je ne sais pas d'où elle viennent.
Et oui, j'ai développé le MGigogne il y a longtemps.
C'est un outil encore bien efficace.
Il vaut mieux que je lance en pas à pas pour voir quelle partie je dois modifier pour l'adapter à ma source sur le nombre de lignes à traiter ?
Est-ce qu'il y a la possibilité de mettre 0 dans les autres cellules de statut s'il ne trouve pas le mot correspondant ? (comme dans mon exemple)
 

Dranreb

XLDnaute Barbatruc
Si, il suffirait de faire une petite boucle juste derriere L = L + 1 : For C = 3 To 10: TR(L, C) = 0: Next C
Il n'y a rien à adapter pour le nombre de lignes, sauf s'il devait dépasser 5000. Il prend tout le DataBodyRange du ListObject.
 

Mak_tarmak

XLDnaute Junior
Si, il suffirait de faire une petite boucle juste derriere L = L + 1 : For C = 3 To 10: TR(L, C) = 0: Next C
Il n'y a rien à adapter pour le nombre de lignes, sauf s'il devait dépasser 5000. Il prend tout le DataBodyRange du ListObject.
je viens de voir mon erreur. Comme je vous avais mis un jeu de données restreints cela ne traitait pas tout.
Mon rapport audit_user fait plus de 57 000 lignes.
Est-il possible de se dire que les colonnes A, B, C de ma Feuil1 ce sont des données figées que je récupère d'un autre rapport et qu'en fait c'est ma Feuil1 qu'il faut que je parcours sur ces colonnes pour obtenir les 400 codes stages et sessions mais c'est la Feuil2 qui contient les statuts de présence ?
En tout cas, c'est très puissant et rapide en extraction !
 

Mak_tarmak

XLDnaute Junior
Voulez vous dire qu'il y a des infos à récupérer aussi dans le tableau résultant ?
Il va falloir un module supplémentaire pour fusionner les deux tableaux …
En fait la Feuil1 contient le code session et on cherche l'occurrence de cette session dans le rapport Feuil2. Et pour chaque utilisateur unique de chaque session on récupère les statuts pour compter les présences et ensuite compter les heures de présence aussi.
Ma Feuil1 est un peu ma table de référence car il y a beaucoup trop de données dans le rapport mais elles serviront à un autre traitement. Dans ma Feuil1 ce ne sont que des stages de type "COURSE" en colonne B du rapport mais l'original contient du ONLINE et un autre. C'est pour cela que j'utilise la Feuil1 comme base. J'espère ne pas vous avoir embrouiller.
 

Discussions similaires

Réponses
9
Affichages
177
Réponses
16
Affichages
290

Statistiques des forums

Discussions
313 209
Messages
2 096 239
Membres
106 541
dernier inscrit
edf