Nombre d'occurence

chrisdu73

XLDnaute Occasionnel
Bonjour le forum,
Une fois de plus je viens vers vous demander de l'aide pour un petit code en VBA
Mon probléme:
je voudrais en colonne C connaitre le nombre d'occurence qu'il y a dans la colonne B pour chaque valeur de la colonne A
Peut etre facile mais un peu complexe pour moi.
Merci pour votre aide
 

Pièces jointes

  • occurence.xls
    8 KB · Affichages: 47
  • occurence.xls
    8 KB · Affichages: 50
  • occurence.xls
    8 KB · Affichages: 49

chrisdu73

XLDnaute Occasionnel
Re : Nombre d'occurence

MERCI A VOUS TOUS,
J'ai opté pour la solution de David, car si la colonne A n'est pas trié auparavant le résultat est éronné avec la solution de
Rachid_0661.(dans le cas ou un meme code se trouve au milieu d'un autre)
Mais jamais je n'aurai pondu une ou l'autre solution.
donc merci a vous tous pour votre aide.
 

chrisdu73

XLDnaute Occasionnel
Re : Nombre d'occurence

j'en reviens au point de départ car même la formule avec plus de 15000 lignes ça marche pas, c 'est pour ça que j'aurai plutôt aimer le faire en VBA.
Mais j'arrive pas à convertir cette formule matricielle en VBA
 

david84

XLDnaute Barbatruc
Re : Nombre d'occurence

Re
j'en reviens au point de départ car même la formule avec plus de 15000 lignes ça marche pas
"ça ne marche pas" n'est pas une réponse en soit : donne-t-elle ou non le bon résultat sur un test de 50 lignes ?
Si non, qu'est ce qui ne convient pas ? Mets un exemple en expliquant le résultat attendu.
Si oui, c'est que la formule fonctionne.
Ceci-dit, si tu avais précisé d'entrée que tu avais 15000 lignes à traiter je ne t'aurais jamais proposé une formule matricielle.
Mes réserves exprimées au message #10 sont donc fondées.
A+
 

chrisdu73

XLDnaute Occasionnel
Re : Nombre d'occurence

Oui en effet excuse moi David84, ta formule fonctionne à merveille avec peu de lignes, mais dans mon cas j'ai plus de 15000 lignes, c'est bien pour ça qu'au tout début j'avais bien précisé en VBA, mais si une formule fonctionne je suis preneur.
 

david84

XLDnaute Barbatruc
Re : Nombre d'occurence

Re
Une fonction personnalisée à tester :
Code:
Function Compte(Plage As Range, Num As Double) As Double
Dim a(), T(), T2(), s As Variant, i As Long, Nb As Double
Dim mondico As Object
a = Plage.Value
Set mondico = CreateObject("Scripting.Dictionary")
For i = LBound(a) To UBound(a)
    mondico(a(i, 1) & " " & a(i, 2)) = mondico(a(i, 1) & " " & a(i, 2))
Next i
T = mondico.keys
ReDim T2(UBound(T))
For i = LBound(T) To UBound(T)
    s = Split(T(i))
    T2(i) = CDbl(s(0))
Next i
For i = LBound(T2) To UBound(T2)
    If Num = T2(i) Then Nb = Nb + 1
Next i
Compte = Nb
End Function
A+
 

Pièces jointes

  • occurence (4).xls
    41 KB · Affichages: 30

chrisdu73

XLDnaute Occasionnel
Re : Nombre d'occurence

Merci encore David84,
ceci marche impeccable, mais puis je demander si cela est possible d'avoir ce code mais sous forme de macro ?
car j'aurai bien voulu intégré ce code à la suite d'un autre code, ou alors comment faire pour intégrer cette fonction en automatique de façon qu'elle exécute à la suite de mon code précédent.
 

david84

XLDnaute Barbatruc
Re : Nombre d'occurence

Re
ceci marche impeccable, mais puis je demander si cela est possible d'avoir ce code mais sous forme de macro ?
Tu avais pourtant dit
j'en reviens au point de départ car même la formule avec plus de 15000 lignes ça marche pas, c 'est pour ça que j'aurai plutôt aimer le faire en VBA.
Mais j'arrive pas à convertir cette formule matricielle en VBA
J'en avais donc déduit que tu voulais une fonction et non une Sub.
Ou alors comment intégré un Call de façon à appeler cette fonction ?
Pour intégrer cette fonction à ta procédure, il te faut passer dans cette procédure les 2 arguments exigés lors de l'appel à la fonction, du genre If Compte(Plage,Num)=résultat escompté then...
Mais bon, comme tu ne donnes pas tous les éléments, je ne peux t'aider plus.
L'autre solution consisterait à passer par une Sub au lieu d'une fonction et ensuite de l'appeler dans ta procédure au moment voulu (Call Compte).
A+
 

david84

XLDnaute Barbatruc
Re : Nombre d'occurence

Re
Cette solution résoudrais mon problème, car plus simple à mettre en œuvre pour moi.
Bon, si je comprends bien, tu attends donc que je l'adapte...
Ci-joint une macro adaptée de la fonction initiale te permettant de faire ce que tu veux.
Maintenant à toi de bosser et de l'adapter à ton fichier original !
Code:
Sub Compte()
Dim T(), T2(), T3(), s As Variant, i As Long, j As Long
Dim mondico As Object, Plage As Range, Nb As Double
With Sheets("Feuille1")
    Set Plage = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp).Row)
    Set mondico = CreateObject("Scripting.Dictionary")
    For i = 1 To Plage.Rows.Count
        mondico(Plage(i, 1) & " " & Plage(i, 2)) = mondico(Plage(i, 1) & " " & Plage(i, 2))
    Next i
    T = mondico.keys
    ReDim T2(UBound(T))
    For i = LBound(T) To UBound(T)
        s = Split(T(i))
        T2(i) = CDbl(s(0))
    Next i
    ReDim T3(1 To Plage.Rows.Count)
    For i = 1 To UBound(T3)
        For j = LBound(T2) To UBound(T2)
            If Plage(i, 1) = T2(j) Then Nb = Nb + 1
        Next j
        T3(i) = Nb: Nb = 0
    Next i
    '.Range("C2:C" & Plage.Rows.Count + 1).ClearContents 'si besoin d'effacer les anciennes valeurs colonne C
    .Range("C2").Resize(UBound(T3)) = Application.Transpose(T3)
End With
End Sub
A+
 

Pièces jointes

  • occurence (4) (2).xls
    47 KB · Affichages: 31

chrisdu73

XLDnaute Occasionnel
Re : Nombre d'occurence

Ça marche impeccable,
y aurait il une grosse modification si la plage deviens uniquement la colonne A et la colonne M (à la place de AB) ?
Set Plage = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp).Row)
Sinon je déplace ma colonne M en B pour le traitement par la macro.
Un grand merci à toi et a ceux qui se sont penchés sur mon cas et aussi merci au forum
 

david84

XLDnaute Barbatruc
Re : Nombre d'occurence

Re
y aurait il une grosse modification si la plage deviens uniquement la colonne A et la colonne M (à la place de AB) ?
Non. Il te faut simplement adapter les lignes
Code:
Set Plage = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp).Row)
en remplaçant B par la colonne concernée et
Code:
mondico(Plage(i, 1) & " " & Plage(i, 2)) = mondico(Plage(i, 1) & " " & Plage(i, 2))
en remplaçant 2 par la l'index de la colonne concernée.
Je te conseille amicalement d'apprendre à faire fonctionner ton code en mode pas à pas afin de mieux comprendre son déroulement, sinon tu vas continuer à bloquer sur des détails de ce genre sans pouvoir adapter un code par toi-même.
A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 836
Messages
2 092 653
Membres
105 479
dernier inscrit
chaussadas.renaud