Compter le nombre d'occurence pour chaque référence

Bonjour à tous,

Débutante en VBA, je cherche à écrire une macro qui compte le nombre d'occurence de chaque référence en colonne G (Pn).

Je voudrais que la macro me sorte un tableau qui rassemble la liste des références avec en face le nombre d'occurence dans le tableau de la feuille TAT.

Idéalement pour les lignes qui ont la même référence (Pn en colonne G) ET le même numéro de série (Sn en colonne H), il ne faudrait compter qu'une seule occurence.

Vous remerciant par avance de votre aide!

Bonjour

Si on ne prend que les lignes distinctes il n'y a que 1 pour chaque couple...

2 solutions dans le classeur joint : l'un utilisant le modèle de données PowerPivot, l'autre une requête PowerQuery (les deux (intégrés à Excel)

Bonjour à tous

Voici un essai avec une macro à adapter :

Sub CompteOccur()
set dico = createobject("scripting.dictionary")
with activesheet.usedrange 'zone utilisée de la feuille active
    t = .value
    for i = lbound(t) to ubound(t)
        dico(t(i, 7) & " - " & t(i, 8)) = dico(t(i, 7) & " - " & t(i, 8)) + 1
    next i
    .cells(1, .columns.count + 1).resize(dico.count, 2).value = application.transpose(Array(dico.keys, dico.items))
end with
end sub

Le code renvoie un tableau avec les clés (concaténation des colonnes G et H) et leur nombre d'occurrences à la droite de la plage utilisée.

Cdlt,

Après avoir essayé la macro de 3GB, je tombe sur l'erreur suivante : "un composant ActiveX" ne peut pas créer d'objet

Pour ce qui est du modèle de données PowerPivot et de la requête PowerQuery, je crains de ne pas tout comprendre. Avez-vous fait appel à des macros?

Bonjour,

Si vous êtes sur Mac, il faut mettre à jour votre version et ce code ne pourra malheureusement pas fonctionner .

Cdlt,

D'accord! Sauriez-vous adapter ce code sur Mac?

Justement, l'objet dictionary est bien pratique pour traiter les doublons...

Voici un premier essai d'adaptation :

Sub CompteOccur()
with activesheet.usedrange 'zone utilisée de la feuille active
    t = .value
    dico = arrdictionary(t, 7, 8) '7 et 8 sont les colonnes qui permettront de former la clé de recherche
    .cells(1, .columns.count + 1).resize(ubound(dico), 2).value = dico
end with
end sub

Function arrdictionary(datas As Variant, paramarray colcrit())
Dim temp(), i&, j&, n&, doublon As Boolean
ReDim temp(1 to 2, 1 to 1)
For i = LBound(datas) To UBound(datas)
    for k = lbound(colcrit) to ubound(colcrit)
        cle = iif(k = 0, "", cle & " - ") & datas(i, colcrit(k))
    next k
    For j = LBound(temp, 2) To UBound(temp, 2)
        If cle = temp(1, j) Then
            doublon = True
            temp(2, j) = temp(2, j) + 1
            Exit For
        End If
    Next j
    If Not doublon Then
        n = n + 1
        ReDim Preserve temp(1 to 2, 1 to n)
        temp(1, n) = cle
        temp(2, n) = 1
    End If
    doublon = False
Next i
arrdictionary = Application.Transpose(temp)
End Function

Cdlt,

J'ai fait plusieurs petites modifications depuis le moment où j'ai posté le code la première fois. Merci de réessayer avec cette version arrêtée

Merci pour votre aide! Malheureusement j'ai une autre erreur : Erreur de compilation Sub ou Fonction non définie

J'ai du mal à comprendre la macro... :/

Pouvez-vous indiquer sur quoi porte le message lorsque vous en rencontrez un ?

Avez-vous bien ces 2 codes dans un même module normal ? Il vaut mieux les rassembler...

Oui, ce n'est pas facile contrairement au dictionnaire^^.

Sub CompteOccur()
with activesheet.usedrange 'zone utilisée de la feuille active
    t = .value 'prend valeurs de la zone utilisée
    dico = arrdictionary(t, 7, 8) 'renvoie un tableau à 2 colonnes qui cherchent des clés uniques en fonction des colonnes 7 et 8 de t
    .cells(1, .columns.count + 1).resize(ubound(dico), 2).value = dico 'colle le tableau avec les clés et le nb d'occurrences
end with
end sub

Function arrdictionary(datas As Variant, paramarray colcrit())
'la fonction dépend de paramètres : datas (un tableau dynamique) et un nombre indéfini de numéros de colonne de datas
Dim temp(), i&, j&, n&, doublon As Boolean
ReDim temp(1 to 2, 1 to 1) 'initialisation de temp : tableau des valeurs uniques !
For i = LBound(datas) To UBound(datas) 'pour cahque ligne du tableau (valeurs brutes)
    for k = lbound(colcrit) to ubound(colcrit) 'pour chaque argument rentré (voir ci-haut : 7 et 8)
        cle = iif(k = 0, "", cle & " - ") & datas(i, colcrit(k)) 'cle vaut la concaténation des valeurs de datas aux colonnes spécifiées
    next k
    For j = LBound(temp, 2) To UBound(temp, 2) 'pour chaque clé de temp
        If cle = temp(1, j) Then 'si la clé de temp vaut la clé issue de la ligne en cours de Datas
            doublon = True 'doublon trouvé
            temp(2, j) = temp(2, j) + 1 'incrémentation du nb d'occurrences
            Exit For 'sortie de boucle
        End If
    Next j
    If Not doublon Then 'si aucun doublon trouvé
        n = n + 1 'incrémentation nb valeurs uniques
        ReDim Preserve temp(1 to 2, 1 to n) 'redimension tableau temp pour accueillir une nvlle clé
        temp(1, n) = cle 'nvlle clé
        temp(2, n) = 1 'nb occurrences à 1
    End If
    doublon = False 'réinitialisation variable doublon
Next i
arrdictionary = Application.Transpose(temp) 'valeur renvoyée = temp retransposé afin d'avoir un tableau sur 2 colonnes
End Function

Cdlt,

RE à tous

Complète ton profil en précisant MAC car le VBA n'est pas le même et les Power en sont absents...

Bonjour! Merci pour vos réponses!

J'ai essayé la macro de 3GB et cela m'aide beaucoup! Cependant, ça ne correspond pas exactement à ce que je voudrais :/

En effet, je voudrais compter le nombre de fois où le Pn apparaît avec un Sn différent.

Par exemple, si le Pn GA700B3-NNXXL apparaît trois fois avec le Sn 41816, je souhaiterais le compter 1 fois et ensuite faire la somme du nombre de fois où le Pn GA700B3-NNXXL apparaît dans le tableau.

Le tableau récapitulatif ne devrait donc pas contenir les Sn mais seulement les Pn.

Pour le fichier joint, j'aimerais donc faire apparaître le Pn GA700B3-NNXXL et en face le nombre de fois où il apparaît avec un Sn différent (dans le fichier joint 11).

31copie-tat.xlsm (41.42 Ko)

Je ne sais pas si c'est très clair...

Bonjour cmadel,

Je sais pas ce que tu souhaites exactement mais je me dis que qui peut le plus peut le moins...

Si je comprends bien, tu cherches à avoir le nombre de clés formées par la concaténation de G et H. Alors, cela correspond au nombre de lignes renvoyées par le tableau.

Dans le code, tu peux essayer de rajouter à la fin :

msgbox ubound(dico)

Oui ça revient à compter le nombres de lignes mais par référence.

GA700B3-NNXXL : 11 lignes (par exemple)

Re,

Dans ce cas, voici une fonction qui renvoie le compte des clés uniques :

Sub CompteOccur()
with activesheet.usedrange 'zone utilisée de la feuille active
    t = .value
    .cells(1, .columns.count + 2).value = NBKEYS(t, 7, 8)
end with
end sub

Function NBKEYS(datas As Variant, paramarray colcrit()) as long
Dim temp(), i&, k&, j&, n&, cle$, doublon As Boolean
ReDim temp(1 to 1)
For i = LBound(datas) To UBound(datas)
    for k = lbound(colcrit) to ubound(colcrit)
        cle = iif(k = 0, "", cle & " - ") & datas(i, colcrit(k))
    next k
    For j = LBound(temp) To UBound(temp)
        If cle = temp(j) Then
            doublon = True
            Exit For
        End If
    Next j
    If Not doublon Then
        n = n + 1
        ReDim Preserve temp(1 to n)
        temp(n) = cle
    End If
    doublon = False
Next i
NBKEYS = n
End Function

La valeur est renvoyée dans la cellule à 2 colonnes de la plage utilisée, en ligne 1.

Cdlt,

Merci beaucoup mais je devrais avoir un tableau avec pour chaque Pn le nombre de Sn différents. Je ne veux pas le nombre total de clés uniques mais le nombre de clés par Pn.

La question est enfait : pour chaque Pn, combien y a-t-il de Sn différents?

Et avec ce nouvel essai :

Sub CompteOccur()
with activesheet.usedrange 'zone utilisée de la feuille active
    t = .value
    dico = arrdictionary(t, 7, 8) '7 et 8 sont les colonnes qui permettront de former la clé de recherche
    .cells(1, .columns.count + 1).resize(ubound(dico), 2).value = dico
end with
end sub

Function arrdictionary(datas As Variant, colcle&, colelem&)
Dim temp(), i&, j&, n&, doublon As Boolean
ReDim temp(1 to 3, 1 to 1)
For i = LBound(datas) To UBound(datas)
    For j = LBound(temp, 2) To UBound(temp, 2)
        If datas(i, colcle) = temp(1, j) then
            if not temp(3, j) like "*" & datas(i, colelem) & "*" Then
                doublon = True
                temp(2, j) = temp(2, j) + 1
                temp(3, j) = temp(3, j) & "-" & datas(i, colelem)
                Exit For
            end if
        End If
    Next j
    If Not doublon Then
        n = n + 1
        ReDim Preserve temp(1 to 3, 1 to n)
        temp(1, n) = datas(i, colcle)
        temp(2, n) = 1
        temp(3, n) = datas(i, colelem)
    End If
    doublon = False
Next i
arrdictionary = Application.Transpose(temp)
End Function

Cdlt,

Je pense que l'on s'en approche mais certains Pn reviennent plusieurs fois :/

Rechercher des sujets similaires à "compter nombre occurence chaque reference"