Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 tableau de comptage sans doublon

cathodique

XLDnaute Barbatruc
Bonjour,

N'étant pas parvenu à résoudre mon problème seul. Je sollicite une aide auprès de la communauté d'XLD.

Sur la feuille résultat vous trouverez 3 petits tableaux, le nombre de lignes est fonction du nombre d’espèces (col6).
Je les ai arrêté à 3 par rapport aux données actuelles de la bd, juste pour illustrer le problème.
Je voudrais travailler avec des variables tableaux parce que la bd aura un nombre très important de lignes. (les colonnes pourraient évoluer aussi).

L'objectif est de compter sans doublon selon des critères:
Critère1 sur les dates, 1er tableau jusqu'à fin de l'année N-1, 2ème tableau année en cours et le 2ème toutes les années.
Critère2 par rapport aux espèces, dans les tableaux résultats ils sont dans la colonne1 à partir de la 2ème ligne et se trouvent en colonne 6 de la bd. Ils faut compte pour chaque espèce selon les critères 3, qui se trouvent en ligne 1 à partir de la 2ème colonne des petits tableaux. les critères de 2 à 7 se trouvent dans la colonne 4 de la bd; de 8 à 9 dans la colonne 13 et la 10 dans la colonne 14.

Pour 8 à 9, le comptage se fait si dans la colonne 4 il y a "Fa"
Pour 10, le comptage se fait si l'année de la colonne 14 correspond à l'année de la colonne 1.

Dans une précédente discussion, @dysorthographie m'avait suggéré une approche dans le genre bataille navale pour récupérer les critères. Très bonne idée, mais je me suis emmêlé les pinceaux.

Je suis parvenu à mon monter mes petits tableaux par code (non joint pour le pas "polluer" le fichier).
Et, il se peut que mon approche était fausse dès le départ.

En espérant, avoir été clair.

Merci
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Par exemple pour le NoDossier 2024014 il y a 6 doublons.

Quels sont ceux que l'on supprime et lors de quels filtrages ?

Regarde la pièce jointe 1204657
Bonjour @job75 ,

Merci de t'intéresser à mon problème. Désolé, j'avais cru l'avoir expliqué.
Ce dont je suis sûr, les catégories Cd, Fa, Ad sont uniques (ils n'ont pas de doublons). Les autres Chfa, RtFa et RtAd peuvent avoir des doublons (d'où la précaution de compter sans doublon).
Personnellement, j'ai opté pour tout compter sans doublon pour éviter qu'un coup on utilise un compteur et un autre, on utilise un dico.
Quant à la colonne caractère, le comptage doit se faire en tenant compte que la catégorie soit Fa.
Quant à la dernière colonne DateDc, celle qui me pose beaucoup de souci. Compter sans doublon et mettre le résultat dans le tableau correspondant.
Pour le résultat finale c'est un peu plus compliqué à expliquer.

Je dois sortir. Je ferai un topo assez détaillé pour obtenir les résultats finaux souhaités.

Merci beaucoup.

Bonne journée.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne prenais pas en compte la catégorie Fa pour le comptage des caractères.
Le nouveau code qui en tient compte :
VB:
Option Explicit
Private Sub Worksheet_Activate()
   Dim CLnDon As Collection, TRés1(), TRés2(), TRés3(), Année As Integer, SGrEsp As SsGr, SGrCat As SsGr, SGrCar As SsGr, L As Long, CFa As Integer, CCa As Integer, Détail
   Set CLnDon = Gigogne(Feuil1, "Espece", "Cat.")
   ReDim TRés1(1 To 3, 1 To 11), TRés2(1 To 3, 1 To 11), TRés3(1 To 3, 1 To 11)
   Année = Year(Date)
   For Each SGrEsp In CLnDon
      L = L + 1
      TRés1(L, 1) = SGrEsp.ID
      TRés2(L, 1) = SGrEsp.ID
      TRés3(L, 1) = SGrEsp.ID
      For Each SGrCat In SGrEsp.Co
         CFa = WorksheetFunction.Match(SGrCat.ID, Array("Cd", "Fa", "Ad", "ChFa", "RtAd", "RtFa"), 0) + 1
         For Each Détail In SGrCat.Co
            If Year(Détail(1)) < Année Then
               TRés1(L, CFa) = TRés1(L, CFa) + 1
               If Not IsEmpty(Détail(14)) Then TRés1(L, 11) = TRés1(L, 11) + 1
            Else
               TRés2(L, CFa) = TRés2(L, CFa) + 1
               If Not IsEmpty(Détail(14)) Then TRés2(L, 11) = TRés2(L, 11) + 1
               End If
            TRés3(L, CFa) = TRés3(L, CFa) + 1
            If Not IsEmpty(Détail(14)) Then TRés3(L, 11) = TRés3(L, 11) + 1
            Next Détail
         If CFa = 3 Then
            For Each Détail In SGrCat.Co
               Select Case Détail(13): Case "Adoptable": CCa = 8: Case "Non Adoptable": CCa = 9
                  Case Else: CCa = 10: End Select
               If Year(Détail(1)) < Année Then
                  TRés1(L, CCa) = TRés1(L, CCa) + 1
               Else
                  TRés2(L, CCa) = TRés2(L, CCa) + 1
                  End If
               TRés3(L, CCa) = TRés3(L, CCa) + 1
               Next Détail
            End If
         Next SGrCat
      Next SGrEsp
   Me.[B7:L9].Value = TRés1
   Me.[B13:L15].Value = TRés2
   Me.[B19:L21].Value = TRés3
   End Sub
 

Pièces jointes

  • GigogneCathodique.xlsb
    33.2 KB · Affichages: 3

cathodique

XLDnaute Barbatruc
Bonjour Dranreb,

Je te remercie le code plante

sGrEsp as SsGr colorié en bleu.

Pour être franc, je n'utiliserai pas ton code du fait qu'il y a un module avec une extension .xlam
Je sais que tu n'es le genre a proposé des cochonneries. On n'acceptera pas ton fichier parce qu'on ne peut pas voir ce qu'il y a dedans.

Je te remercie.
 

Dranreb

XLDnaute Barbatruc
Il faut cocher la référence du projet GigIdx du .xlam installé à partir du précurseur en téléchargement.
Ça ne sert à rien de voir comment c'est programmé. Par contre il y a une page d'aide d'utilisation.
 

cathodique

XLDnaute Barbatruc
C'est la pire vacherie comme m'aie fait sur XLD. Tu as osé installé ton truc à mon insu sur mon pc.
Tu es vraiment gonflé.
 

Dranreb

XLDnaute Barbatruc
Non, ce n'est pas installé chez vous puisque la référence à GigIdx est probablement portée MANQUANT vu qu'il ne reconnait pas le type SsGr.
Quand au précurseur xlsm disponible en téléchargement, à son ouverture il demande la permission de s'installer en xlam dans votre dossier de compléments.
Si vous répondez Annuler à tous les messages rien n'est installé.
 

dysorthographie

XLDnaute Accro
Bonjour,
voila ce que j'ai compris:

Définition des doublons dans ton cas :​

Un doublon se produit lorsqu'un même animal a plusieurs enregistrements avec une même catégorie (par exemple plusieurs lignes avec la catégorie Fa pour la même période).

Contexte du projet :​

  • Lorsqu'un animal est placé en famille d'accueil (Fa), il peut être adopté (Ad), puis éventuellement retourné à l'association (RtAd), ou retourné à la famille d'accueil (RtFa).
  • Un doublon de Fa survient si l'animal a eu plusieurs passages dans la catégorie Fa, par exemple s'il est revenu après une adoption ou un changement de famille d'accueil.

Comptage des statuts successifs :​

  • Ne pas compter un doublon si un statut est remplacé : Lorsqu'un animal passe de Fa à Ad, tu ne veux pas compter deux fois la famille d'accueil. Cela signifie que tu devras filtrer les statuts successifs pour éviter ce problème. De même, si un animal revient à la famille d'accueil après une adoption, tu dois compter seulement la dernière entrée dans la catégorie Fa.

Gestion des statuts dans le comptage :​

  1. Cas de l’adoption (Ad) après une famille d’accueil (Fa) :
    • Si un animal est en Fa, puis adopté (Ad), alors la ligne avec Fa ne doit pas être comptée dans le tableau final des familles d'accueil.
    • Ex. :
    sql
    Copier le code
    NoDossier | Date | Catégorie
    --------- | --------- | -----------
    001 | 01-01-2023| Fa
    001 | 15-01-2023| Ad
    Ici, tu comptes seulement l'adoption, et pas le passage par la famille d'accueil.
  2. Cas du retour d’adoption (RtAd) :
    • Si un animal adopté est retourné (RtAd), alors on compte cette adoption comme terminée, et on crée une nouvelle entrée Fa pour indiquer le retour en famille d'accueil.
    • Ex. :
    sql
    Copier le code
    NoDossier | Date | Catégorie
    --------- | --------- | -----------
    001 | 01-01-2023| Fa
    001 | 15-01-2023| Ad
    001 | 01-02-2023| RtAd
    001 | 03-02-2023| Fa
    Dans ce cas, la première ligne Fa ne doit pas être comptée parce qu’elle a été suivie d'une adoption, mais la deuxième ligne Fa est comptée, car elle représente le retour.
  3. Retirer les décès des comptages :
    • Les décès doivent être pris en compte dans le calcul final, c'est-à-dire que tout statut précédant un décès ne doit plus apparaître dans les comptages courants (par exemple Fa ou Ad si l'animal est décédé après).
    • Ex. :
    mathematica
    Copier le code
    NoDossier | Date | Catégorie
    --------- | --------- | -----------
    001 | 01-01-2023| Fa
    001 | 15-01-2023| Ad
    001 | 01-03-2023| Décès
    Ici, tu ne comptes ni Fa ni Ad dans les tableaux futurs, car l’animal est décédé.

Exemple de requête SQL pour éviter les doublons :​

Si tu veux compter les familles d'accueil (Fa) en excluant les animaux qui ont été adoptés ou qui sont décédés après avoir été en famille d'accueil, voici un exemple de requête SQL :

sql
Copier le code
SELECT COUNT(DISTINCT NoDossier)
FROM Parcours
WHERE Catégorie = 'Fa'
AND NoDossier NOT IN (
SELECT NoDossier FROM Parcours WHERE Catégorie IN ('Ad', 'Décès')
);

Cette requête fait les choses suivantes :

  • Elle compte les animaux ayant un statut Fa.
  • Elle exclut les animaux dont le statut est ensuite passé à Ad ou Décès, ce qui évite de compter plusieurs fois un même animal s'il a quitté la famille d'accueil.

Conclusion :​

  • Les doublons dans ton contexte sont les entrées successives pour un même animal, dans la même catégorie, si un événement ultérieur annule l’événement précédent (par exemple, Fa suivi de Ad ou de RtAd).
  • Lors du comptage, il faut toujours tenir compte des transitions entre les statuts pour ne pas compter deux fois un événement qui a été modifié par la suite.
 

cathodique

XLDnaute Barbatruc
Bonjour merci d'avoir pris le temps de me lire.

Lorsqu'un animal est placé en famille d'accueil (Fa), il peut être adopté (Ad), puis éventuellement retourné à l'association (RtAd), ou retourné à la famille d'accueil (RtFa).
En partie c'est exact. Je ne sais pas si tu as ouvert mon fichier. Il y a des colonnes masquées. parmi ces colonnes se trouve une colonne nom_prenom chez qui se trouve l'animal.

Lorsque l'animal arrive chez nous, on enregistre 2 lignes à la même date et on enregistre la personne qui l'a rapporté en Cd et la personne chez qui il a été mis en Fa.

Il peut être adopté et on ajoute une ligne Ad et ajoute la personne qui l'a adopté;
Si on nous le retourne, on enregistre une nouvelle ligne Fa et la personne famille d'accueil
On modifie la ligne qui était Ad en RtAd et la ligne Fa et RtFa
Ainsi, on connait sans erreur chez qui est l'animal.
Donc il revient à l'association en RtAd "et" en RtFa

un exemple présent dans le fichier (il n'y a pas de nom pour la confidentialité, donc le nom sont fictifs):
27/06/2019---2019047---Cd---- Dupont
27/06/2019---2016047---RtFa-----Durand (initialement c'était un Fa)
13/05/2020---2019047---RtAd----Marcel (initialement était Ad)
19/05/2020---2019047---Fa-------Marie
Avec ce système on trouve facilement où se trouve l'animal

D'après ce que j'ai expliqué plus haut, normalement on ne peut pas avoir de doublon pour les catégories Cd, Fa, et Ad (sauf erreur lors de l'enregistrement des données).

Par contre pour les catégories ChFa, RtFa et RtAd, oui on peut avoir des doublons du fait de multiples changements de famille d'accueil ou de retour d'adoption pour un animal de caractère difficile.

On compte par espèce et catégorie: on veut par exemple connaitre nombre de changement de famille d’accueil des chats. Pas pour chaque animal. C'est pour cela qu'on doit compter les ChFa et Rtad sans doublon. On compte les NoDossier, on bien d'accord?!

Non, je crois que je suis encore mal exprimé.
Imagine qu'on veuille le faire avec des autofiltres.
1ère filtre sur la colonne date de la plus ancienne année à N-1 càd 2023
2ème filtre sur colonne espèce (on fera une boucle pour chaque espèce)
3ème filtre sur colonne catégorie (on fera une boucle pour chaque catégorie)
Et on compte le nombre de la colonne 2

Puis on refait le même top mais cette fois comme 3ème filtre la colonne uniquement Fa
et 4ème filtre colonne caractère

Sinon, oui si on trouve Fa et Ad, il ne faut pas le compter pour Fa.
Je n'y connais rien en sql. Si ce langage permet de compter ou non.
Donc dans cet logique, il ne faut compter Fa lorsqu'il y aura une date de décès.

J'espère que je ne t'ai pas embrouillé.
Je pense en consultant le fichier tu comprendras mieux.

Merci beaucoup.


Si l'animal a été adopté on ne saura pas s'il est décédé. Donc dans la bd on trouve jamais sur une limite Ad une date de décès (sauf par erreur). les décès sont à retirer de Fa et du caractère correspondant. exemple si un chat décède et son caractère est "non adoptable" on doit la soustraire de la colonne colonne correspondante, soit le colonne "non adoptable".
 

dysorthographie

XLDnaute Accro
somme nous d'accord sur la notion de dédoublonage?
DateNoDossierCat.EspeceCaractèreDateDC
2010027​
2010​
Chat​
Fa​
Non Adoptable​
2011017​
2011​
Chien​
Cd​
Non Adoptable​
45550​
2015003​
2015​
Chat​
Ad​
Adoptable​
2015039​
2015​
Chat​
Fa​
Non Adoptable​
2016053​
2016​
Chat​
Fa​
Non Adoptable​
2016054​
2016​
Chat​
Fa​
Adoptable​
2016054​
2017​
Chat​
Ad​
Adoptable​
2017054​
2017​
Chat​
Fa​
Non Adoptable​
45346​
2017999​
2017​
Chat​
Fa​
Non Adoptable​
2018060​
2018​
Chien​
Fa​
Non Adoptable​
2019025​
2019​
Chat​
Fa​
Non Adoptable​
2019039​
2019​
Chat​
Fa​
Non Adoptable​
2019042​
2019​
Chat​
Fa​
Non Adoptable​
2019047​
2019​
Chat​
RtFa​
Non Adoptable​
2019047​
2020​
Chat​
Fa​
Non Adoptable​
2019056​
2019​
Chat​
Fa​
Non Adoptable​
2019101​
2019​
Chat​
ChFa​
Non Adoptable​
 

klin89

XLDnaute Accro
Re à tous,

Étant donné la question initiale de cathodique, les remarques pertinentes de job75, les tentatives avortées de Bernard et Staple1600, et les éclaircissements fournis par dysortographie,
ma réponse n'apportera probablement rien de nouveau et est finalement à côté de la plaque.
Mais comme j'ai bossé sur le sujet, je la poste tout de même, elle pourra peut-être être utile à d'autres.

VB:
Option Explicit
Sub test()
    Dim a, b, e, s, v, i As Long, n As Long, dico(1) As Object
    Dim LastYear As Long
    Set dico(0) = CreateObject("Scripting.Dictionary")
    Set dico(1) = CreateObject("Scripting.Dictionary")
    a = Sheets("BD").[a1].CurrentRegion.Value2
    LastYear = Year(Application.Max(Application.Index(a, 0, 1)))
    For Each e In Array(Array("<" & LastYear + 1, "Anterieur_" & LastYear + 1), Array("<" & LastYear, "Anterieur_" & LastYear), Array("=" & LastYear, "Annee_" & LastYear))
        For i = 2 To UBound(a, 1)
            If Evaluate("Year(" & a(i, 1) & ")" & e(0)) Then
                If Not dico(1).exists(a(i, 4)) Then dico(1)(a(i, 4)) = dico(1).Count + 2
                If Not dico(0).exists(a(i, 6)) Then
                    Set dico(0)(a(i, 6)) = CreateObject("Scripting.Dictionary")
                End If
                dico(0)(a(i, 6))(a(i, 4)) = dico(0)(a(i, 6))(a(i, 4)) + 1
            End If
        Next
        For i = 2 To UBound(a, 1)
            If Evaluate("Year(" & a(i, 1) & ")" & e(0)) Then
                If Not dico(1).exists(a(i, 13)) Then dico(1)(a(i, 13)) = dico(1).Count + 2
                If a(i, 4) = "Fa" Then
                    dico(0)(a(i, 6))(a(i, 13)) = dico(0)(a(i, 6))(a(i, 13)) + 1
                End If
            End If
        Next
        If Not dico(1).exists("Décès") Then dico(1)("Décès") = dico(1).Count + 2
        For i = 2 To UBound(a, 1)
            If Evaluate("Year(" & a(i, 1) & ")" & e(0)) Then
                If Not IsEmpty(a(i, 14)) Then
                    If Year(a(i, 14)) = Year(a(i, 1)) Then
                        dico(0)(a(i, 6))("Décès") = dico(0)(a(i, 6))("Décès") + 1
                    End If
                End If
            End If
        Next
        ReDim b(1 To dico(0).Count + 1, 1 To dico(1).Count + 1)
        n = 0
        For Each s In dico(0)
            n = n + 1: b(n, 1) = s
            For Each v In dico(0)(s)
                b(n, dico(1)(v)) = dico(0)(s)(v)
            Next
        Next
        Application.ScreenUpdating = False
        If Not Evaluate("isref('" & e(1) & "'!a1)") Then
            Sheets.Add(after:=Sheets(Sheets.Count)).Name = e(1)
        End If
        With Sheets(e(1)).[a1]
            .CurrentRegion.Clear
            .Value = "Espèces"
            .Range("b1").Resize(, dico(1).Count) = dico(1).keys
            .Range("a2").Resize(dico(0).Count, dico(1).Count + 1) = b
            With .CurrentRegion
                .Font.Name = "calibri"
                .Font.Size = 10
                .VerticalAlignment = xlCenter
                .Borders(xlInsideVertical).Weight = xlThin
                .BorderAround Weight:=xlThin
                With .Rows(1)
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 11
                    .BorderAround Weight:=xlThin
                    .Interior.Color = 9420794
                End With
                .Columns.ColumnWidth = 14
            End With
        End With
        Erase b
        dico(0).RemoveAll: dico(1).RemoveAll
    Next
    Set dico(0) = Nothing: Set dico(1) = Nothing
    Application.ScreenUpdating = True
End Sub
Me reste à examiner l'analyse apportée par dysortographie et à en comprendre le cheminement
Pas simple quand même

klin89
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Pas du tout, les données ne sont pas dans les bonnes colonnes.
tu as inversé les colonnes, caractère et DateDc sont correctes.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…