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:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

@cathodique
Est-ce que l'emploi de TCD est une piste possible ?
Ici pour l'année N-1 (donc 2023)
test_TCD.PNG

Est-ce les résultat que tu voulais ?
 

cathodique

XLDnaute Barbatruc
Re

@cathodique

Cela n'aurait pas pollué mais au contraire éclairé ma lanterne quand à la compréhension de la question.
Ok, je joins le fichier avec le code. Attention, un peu tordu mais rempli sa tâche.
Il manque la complétion des données.

Au fait ce n'est pas de l'année N-1, mais prendre en compte toute les dates jusqu'à l'année N-1.
Autrement dit, compter sans doublon toutes les dates sauf celles de l'année en cours.

Ensuite, compte celles de l'année en cours et le dernier tableau toutes les dates présentes dans la Bd.
On pourrait aussi faire la somme des 2 tableaux.

est-ce plus clair?

Merci.
 

Pièces jointes

  • RapportAvecCode.xlsb
    44.7 KB · Affichages: 2
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@cathodique
Merci pour le fichier
Hélas, ce n'est pas plus clair
J'avais compris que ton code VBA remplissait le tableau
Or ce n'est pas le cas
(J'ai clique sur le bouton et j'ai lu le commentaire sur la ligne Stop)

C'est trop long ou compliqué de mettre les résultats manuellement sur la feuille Résultat ?
(au moins pour un tableau)
 

cathodique

XLDnaute Barbatruc
C'est trop long ou compliqué de mettre les résultats manuellement sur la feuille Résultat ?
au fil des ans, oui a sera trop long de remplir la feuille.
J'avais compris que ton code VBA remplissait le tableau
Non, il ne le remplit qu'en partie. Entêtes de ligne et colonne. C'est tout.
Je ne suis pas encore parvenu à remplir la plage de données.

Je suis parvenu à remplir tous mes petits tableaux par code mais les résultats ne sont justes qu'en partie.
C'est pour cela que je n'avais pas voulu mettre mon code. Attendant, peut-être de meilleurs solutions.
 

Staple1600

XLDnaute Barbatruc
Re

@cathodique
J'essaie de comprendre (en utilisant un TCD comme un outil de test et de compréhension)
(je sais que tu ne veux pas de TCD mais est-ce le nombre obtenu est bon ?)
Ici je trouve 181 (pour les années avant le 31/12/2023
cathodique2.PNG

Au moins si mes chiffres sont bons, cela fait une base pour trouver d'autres solutions par formule ou VBA
 

cathodique

XLDnaute Barbatruc
Re

@cathodique
J'essaie de comprendre (en utilisant un TCD comme un outil de test et de compréhension)
(je sais que tu ne veux pas de TCD mais est-ce le nombre obtenu est bon ?)
Ici je trouve 181 (pour les années avant le 31/12/2023
Regarde la pièce jointe 1204614
Au moins si mes chiffres sont bons, cela fait une base pour trouver d'autres solutions par formule ou VBA
Merci beaucoup @Dranreb , je n'ai pas encore ouvert ton fichier. Je dois te dire j'espère avoir une bonne piste faisant suite à mon fichier joint précédemment.
Pour les chiffres, ils semblent être bons.
sauf erreur lors de la saisie des données, le Cd, Fa, Ad ne sont jamais en doublons.
présentement, je cherche à récupérer par code des chiffres justes. Ensuite, pour le résultat final, il faudrait par espèce soustraire de Fa [les Ad et les décès] et ajouter les RtAd (sur ton tcd il manque 4 colonnes).

encore merci

edit; les chiffres adoptable, non adoptable sont erronés.
 
Dernière édition:

klin89

XLDnaute Accro
Bonsoir à tous, :)
Salut cathodique 😉

Ça reste une base de travail, à voir si les critères énoncés sont respectés et renvoient le bon résultat 🙃
Je l'ai fait pour les années antérieures à 2024, évidemment ça reste à peaufiner, si l'un d'entre vous veut s'y atteler.
VB:
Sub test()
    Dim a, e, s, i As Long, n As Long, dic(1) As Object
    Set dic(0) = CreateObject("Scripting.Dictionary")
    Set dic(1) = CreateObject("Scripting.Dictionary")
    a = Sheets("BD").[a1].CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not dic(1).exists(a(i, 4)) Then dic(1)(a(i, 4)) = dic(1).Count + 2
            If Not dic(0).exists(a(i, 6)) Then
                Set dic(0)(a(i, 6)) = CreateObject("Scripting.Dictionary")
            End If
            dic(0)(a(i, 6))(a(i, 4)) = dic(0)(a(i, 6))(a(i, 4)) + 1
        End If
    Next
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not dic(1).exists(a(i, 13)) Then dic(1)(a(i, 13)) = dic(1).Count + 2
            If a(i, 4) = "Fa" Then
                dic(0)(a(i, 6))(a(i, 13)) = dic(0)(a(i, 6))(a(i, 13)) + 1
            End If
        End If
    Next
    If Not dic(1).exists("DateDC") Then dic(1)("DateDC") = dic(1).Count + 2
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not IsEmpty(a(i, 14)) Then
                If Year(a(i, 14)) = Year(a(i, 1)) Then
                    dic(0)(a(i, 6))("DateDC") = dic(0)(a(i, 6))("DateDC") + 1
                End If
            End If
        End If
    Next
    ReDim a(1 To dic(0).Count + 1, 1 To dic(1).Count + 1)
    For Each e In dic(0)
        n = n + 1: a(n, 1) = e
        For Each s In dic(0)(e)
            a(n, dic(1)(s)) = dic(0)(e)(s)
        Next
    Next
    With Sheets("Feuil3").[a1]
        .Value = "Espèce"
        .Range("b1").Resize(, dic(1).Count) = dic(1).keys
        .Range("a2").Resize(dic(0).Count, dic(1).Count + 1) = a
    End With
End Sub
Résultat en feuil3.

Sinon les TCD c'est pas fait pour les chiens 🤣 Humour

klin89
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonsoir à tous, :)
Salut cathodique 😉

Ça reste une base de travail, à voir si les critères énoncés sont respectés et renvoient le bon résultat 🙃
Je l'ai fait pour les années antérieures à 2024, évidemment ça reste à peaufiner, si l'un d'entre vous veut s'y atteler.
VB:
Sub test()
    Dim a, e, s, i As Long, n As Long, dic(1) As Object
    Set dic(0) = CreateObject("Scripting.Dictionary")
    Set dic(1) = CreateObject("Scripting.Dictionary")
    a = Sheets("BD").[a1].CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not dic(1).exists(a(i, 4)) Then dic(1)(a(i, 4)) = dic(1).Count + 2
            If Not dic(0).exists(a(i, 6)) Then
                Set dic(0)(a(i, 6)) = CreateObject("Scripting.Dictionary")
            End If
            dic(0)(a(i, 6))(a(i, 4)) = dic(0)(a(i, 6))(a(i, 4)) + 1
        End If
    Next
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not dic(1).exists(a(i, 13)) Then dic(1)(a(i, 13)) = dic(1).Count + 2
            If a(i, 4) = "Fa" Then
                dic(0)(a(i, 6))(a(i, 13)) = dic(0)(a(i, 6))(a(i, 13)) + 1
            End If
        End If
    Next
    If Not dic(1).exists("DateDC") Then dic(1)("DateDC") = dic(1).Count + 2
    For i = 2 To UBound(a, 1)
        If Year(a(i, 1)) < 2024 Then
            If Not IsEmpty(a(i, 14)) Then
                If Year(a(i, 14)) = Year(a(i, 1)) Then
                    dic(0)(a(i, 6))("DateDC") = dic(0)(a(i, 6))("DateDC") + 1
                End If
            End If
        End If
    Next
    ReDim a(1 To dic(0).Count + 1, 1 To dic(1).Count + 1)
    For Each e In dic(0)
        n = n + 1: a(n, 1) = e
        For Each s In dic(0)(e)
            a(n, dic(1)(s)) = dic(0)(e)(s)
        Next
    Next
    With Sheets("Feuil3").[a1]
        .Value = "Espèce"
        .Range("b1").Resize(, dic(1).Count) = dic(1).keys
        .Range("a2").Resize(dic(0).Count, dic(1).Count + 1) = a
    End With
End Sub
Résultat en feuil3.

Sinon les TCD c'est pas fait pour les chiens 🤣 Humour

klin89
Bonjour @klin89 ,

Je te remercie. Je testerai ton code dans la journée et reviendrai aux nouvelles.
Quant aux TCD, je sais que c'est un puissant outil. Mais ne répondra pas à mais attentes.
Si certains résultats sont justes c'est parce qu'ils n'ont pas de doublons.
Or dans mes données, il y a certaines qui ont des doublons et on ne veut pas compter les doublons.
Autres difficultés, on doit aussi compter sans doublon avec une condition sur 2 colonnes.
Mis à part, le fait qu'on ne maitrise pas les TCD, nous travaillons sur excel 2007 et 2010 qui n'ont pas la fonction unique.

Merci. Bonne journée.

ps:
Je l'ai fait pour les années antérieures à 2024,
Essaie de le faire pour 2024 et tu te rendras compte de la difficulté.
Sans avoir testé ton code, je peux de te dire que pour 'adoptable' et 'non adoptable', les résultats ne sont pas bons.
 

Discussions similaires

Réponses
3
Affichages
199

Membres actuellement en ligne

Statistiques des forums

Discussions
314 144
Messages
2 106 357
Membres
109 563
dernier inscrit
sylla121