nb occurences colonnedans msgbox

  • Initiateur de la discussion Initiateur de la discussion Phil39
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Phil39

XLDnaute Occasionnel
Bonjour,

Départ de semaine difficile, façon diesel poussif, je sèche sur un truc à priori simple pour mon code VBA :

J'ai dans la colonne B de Feuil1 des noms :

titi
toto
tutu
titi
toto
tutu
tutu
etc...

Je cherche à faire une MsGBox me renvoyant le résultat suivant par exemple :

il y a 7 noms dans la colonne dont :
- 2 Toto
- 2 Titi
- 3 Tutu

Le calcul doit tenir compte de toute la colonne B puisque les données s'incrémentent au fur et à mesure de l'utilisation du fichier.


Je précise que j'ai quand même la base :
resultat = Application.CountIf(Range("A:A"), "Toto")
MsgBox ("Nombre de toto trouvé : " & resultat)

mais que je voudrais quelque chose qui m'affiche les résultats en "une seule passe" donc trouver les différentes occurence de la colonne B ET le nombre d'occurences trouvées.


Merci de m'aider et bonne semaine à tous et toutes.
 
Dernière édition:
Re : nb occurences colonnedans msgbox

Bonjour Phil, Catrice, Modeste, bonjour le forum,

J'arrive en retard mais j'envoie quand même une proposition par macro :
Code:
Sub Macro1()
Dim tv() As String 'déclare le tableau de variable tv (Tableau de Variables)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim x As Integer 'déclare la variable x
Dim mes As String 'déclare la variable mes (MESsage)
 
ReDim Preserve tv(0) 'redimensionne le tableau tv à une seule variable
tv(0) = Range("B1").Value 'définit la variable tv(0)
For Each cel In Range("B2:B" & Range("B65536").End(xlUp).Row) 'boucle '1 : sur toutes les cellules éditées de la colonne B (en partant de la seconde)
    For x = 0 To UBound(tv) 'boucle 2 : sur toutes les variables du tableau tv
        If cel.Value = tv(x) Then GoTo suite 'si la valeur de la cellule est identique à la variable, va à l'étiquette "suite"
    Next x 'prochaine variable du tableau
ReDim Preserve tv(UBound(tv) + 1) 'redimensionne le tableau de variable (une variable de plus)
tv(UBound(tv)) = cel.Value 'définit la dernière variable du tableau
 
suite: 'étiquette
Next cel 'prochaine cellule de la boucle 1
For x = 0 To UBound(tv) 'boucle sur toutes les variable du tableau tv
    mes = mes & Application.WorksheetFunction.CountIf(Columns(2), tv(x)) & " " & tv(x) & Chr(13) 'définit la variable mes
Next x 'prochaine variable du tableau tv
MsgBox mes 'affiche le message mes
End Sub

Édition :

Hou la les codes de Modeste et de Catrice sont bien plus performants que les miens ! Chapeau à tous les deux...
 
Dernière édition:
Re : nb occurences colonnedans msgbox

Bonjour à tous et toutes,

UN GRAND Merci pour vos réponses ça marche impec !
MERCI beaucoup et c'est plus propre que mon code à 2 balles.

Long, trés long est le chemin pour le petit scarabée que je suis... 🙂
 
Re : nb occurences colonnedans msgbox

re-bonjour,

Phil39 à dit:
Long, trés long est le chemin pour le petit scarabée que je suis
... et c'est à un misérable vermisseau que tu dis ça !? 😛

Pour Robert: j'ignore si un code est plus performant qu'un autre ... tu avais vu l'échange sur:
https://www.excel-downloads.com/threads/vba-fonction-find.129790/ ... Si pas, ça vaut le détour (mais ne prévois rien d'autre pendant une bonne heure ! 😱)

-----------------
 
Re : nb occurences colonnedans msgbox

re-bonjour,

... et c'est à un misérable vermisseau que tu dis ça !? 😛

Pour Robert: j'ignore si un code est plus performant qu'un autre ... tu avais vu l'échange sur:
https://www.excel-downloads.com/threads/vba-fonction-find.129790/ ... Si pas, ça vaut le détour (mais ne prévois rien d'autre pendant une bonne heure ! 😱)

-----------------

Oh que oui je trouve le chemin fort long ET TRES DUR d'autant que maintenant, il me faut le même genre de chose mais avec un truc en plus :
ma colonne B contient ou non un flag "CLOTURE".

je souhaite afficher les "sans CLOTURE" (donc en fait les "actifs") avec le total et le détail selon les titi, tutu, toto

Quelque chose comme :
Nombre total de non cloture : 12
Titi 2
Toto 5
Tutu 5

Avec les super codes fournis, je pensais pouvoir m'en sortir mais en fait j'y comprend RIEN !!!! 🙁
Quelqu'un aurait une pelle et un seau que je retourne jouer avec les gosses de ma rue ? 🙂
 
Dernière édition:
Re : nb occurences colonnedans msgbox

re-bonjour,

Quelqu'un aurait une pelle et un seau que je retourne jouer avec les gosses de ma rue ? 🙂
Il n'est peut-être pas nécessaire d'en arriver là! Ceci dit, je me suis déjà enterré vivant après avoir proposé une solution qui n'avait aucun rapport avec la question posée ... Sorti de mon trou en toute discrétion, j'ai rangé ma pelle (si tu passes en Belgique, je te la prêterai volontiers, si tu n'as pas changé d'avis).
Pour ta question sur les "clôturés" ou non, si tu veux simplement les compter et que la mention "clôture" figure sous forme de texte dans la cellule, rien ne t'empêche de te simplifier la vie et d'utiliser une petite fonction NB.SI()

Si c'est plus compliqué, donne-nous des indications complémentaires.
 
Re : nb occurences colonnedans msgbox

re-bonjour,


Il n'est peut-être pas nécessaire d'en arriver là! Ceci dit, je me suis déjà enterré vivant après avoir proposé une solution qui n'avait aucun rapport avec la question posée ... Sorti de mon trou en toute discrétion, j'ai rangé ma pelle (si tu passes en Belgique, je te la prêterai volontiers, si tu n'as pas changé d'avis).
Pour ta question sur les "clôturés" ou non, si tu veux simplement les compter et que la mention "clôture" figure sous forme de texte dans la cellule, rien ne t'empêche de te simplifier la vie et d'utiliser une petite fonction NB.SI()

Si c'est plus compliqué, donne-nous des indications complémentaires.


En Colonne A, j'ai des dossiers au nom de personnes (titi, tutu, toto, etc...)
En colonne B, j'ai un etat (Cloture, en cours, etc...)

J'ai besoin d'avoir une msgbox me donnant :
1) le nombre total de noms et la décomposition du nombre (ex : 2 noms au total dont 1 titi et 1 toto)
C'est résolu avec vos super macros que je comprend pas, le but est atteint même si cela ne me plait pas du tout de ne pas comprendre, les Gentils Membres du Forum n'étant pas là pour bosser à ma place),

2) j'ai ensuite besoin, toujours dans la même msgbox de définir le nombre de "dossiers" à traiter (donc n'étant pas en "CLOTURE", le reste importe peu) avec toujours :
le nombre total de dossiers non cloturés (3 dossiers)
la décomposition par noms (2 titi, 1 toto)

En résumé si :

Col A :
titi
toto
toto
tutu

Col B :
en attente
Cloture
en attente
Cloture


dans la msgbox :

4 dossiers dont :
1 titi
2 toto
1 tutu

2 dossiers à traiter :
- 1 titi
- 1 toto

Il y aura même encore une 3ème colonne avec les "Litiges" (bolean, y'a ou pas) mais d'ici là, j'espère bien avoir compris vos macros.

Pour ta pelle et ton seau, je pose une option dessus... 😀
 
Re : nb occurences colonnedans msgbox

re²,

Comme je cherchais, en attendant ta réponse (et que je vais devoir m'absenter), une version qui répond à une partie (la 2e ?) de ta demande. Vois si ça ressemble et si oui, il restera à faire une compilation des 2 propositions.
J'ai continué de travailler avec ma macro de départ, non parce qu'elle est meilleure que celles de Catrice et de Robert, mais ... parce que c'était plus simple pour moi.

Je repasserai voir dans la soirée.

@+
 

Pièces jointes

Re : nb occurences colonnedans msgbox

re²,

Comme je cherchais, en attendant ta réponse (et que je vais devoir m'absenter), une version qui répond à une partie (la 2e ?) de ta demande. Vois si ça ressemble et si oui, il restera à faire une compilation des 2 propositions.
J'ai continué de travailler avec ma macro de départ, non parce qu'elle est meilleure que celles de Catrice et de Robert, mais ... parce que c'était plus simple pour moi.

Je repasserai voir dans la soirée.

@+

Merci de votre aide (et aussi au autres évidemment !!!).

A partir de votre macro, j'ai fais cela :

Sub Macro1()
Dim plageNoms As Range, c As Range
Set plageNoms = Range("A2:A" & Range("A65536").End(xlUp).Row)
Set Dico = CreateObject("Scripting.Dictionary")
For Each c In plageNoms
Dico.Item(c.Value) = c.Value
Next c
'temp = Dico.items
For Each Item In Dico
resultat = resultat & Item & vbTab & Application.CountIf(plageNoms, Item) & vbCr
Next Item

encours = plageNoms.Rows.Count - Application.WorksheetFunction.CountIf(Range("B:B"), "CLOTURE")

MsgBox "Nombre total de dossiers : " & plageNoms.Rows.Count & vbCr & resultat & vbCr & vbCr & encours & " Dossiers en cours"

End Sub

Ca me donne donc le nombre de dossiers encore en cours (non cloturés).
Je regarde de ce pas votre macro en vous remerciant encore c'est vraiment sympa de m'aider.

EDIT :
C'est en partie cela dans votre seconde macro. Ce qui est le plus intéressant pour moi, c'est le NBre de non-clôtures et sa répartition.
Dans la macro finale par rapport à la première fournie, il faudrait, si possible ajouter A LA SUITE DES RESULTATS DE VOTRE PREMIERE MACRO dans la MsgBox (en tenant compte de l'exemple de Phil39(V2) quelque chose comme :

9 dossiers encore à traiter :
- 3 titi
- 2 toto
- 2 riri
- 1 loulou
- 1 fifi
 
Dernière édition:
Re : nb occurences colonnedans msgbox

re³,

J'ignore si j'ai bien compris le dernier message ... Une nouvelle proposition à tester, donc.

Impeccable Modeste !

UN TRES GRAND MERCI, je devrais maintenant me débrouiller pour faire ma troisième partie de code en analysant en colonne E les dossiers qui ont été en litige.
Mais ça je vais le faire seul en étudiant votre code pour le comprendre parce que sinon, à quoi bon essayer de faire du vba ?

Bonne soirée.
 
Re : nb occurences colonnedans msgbox [RESOLU]

Modeste a traité le sujet en MP pour éviter de trop surcharger ce fil.

Le résultat peut éventuellement intéresser d'autres Xlnautes donc avec sa permission je le met ici.

La macro permet de rechercher des occurences sur 3 colonnes et d'afficher dans une msgbox le total des occurrences trouvées et leur répartition par noms.

Sub nbNoms()
Dim plageNoms As Range, c As Range
Dim resultatTot$, resultatEnCours$, resultatLitiges$
Dim cptTot%, cptEnCours%, cptLitiges%

Set plageNoms = Range("A3:A" & Range("A65536").End(xlUp).Row)

'repérer tous les prénoms
Set dico = CreateObject("Scripting.Dictionary")
For Each c In plageNoms
dico.Item(c.Value) = c.Value 'pour lister tous les prénoms différents
Next c
resultatTot = resultatTot & vbTab & "pour " & dico.Count & " personnes différentes"
For Each Item In dico
cptTot = 0
For i = 1 To plageNoms.Rows.Count
If plageNoms.Cells(i, 1).Value = Item Then cptTot = cptTot + 1
Next i
resultatTot = resultatTot & vbCr & Item & vbTab & cptTot
Next Item
Set dico = Nothing

'repérer tous les prénoms en cours
Set dico = CreateObject("Scripting.Dictionary")
For Each c In plageNoms
If c.Offset(, 1) <> "clôture" Then
dico.Item(c.Value) = c.Value '** pour lister les prénoms non-clôturés
cptEnCours = cptEnCours + 1
End If
Next c
resultatEnCours = "Nombre de dossiers en cours: " & cptEnCours & vbCr & vbTab _
& "pour " & dico.Count & " personnes différentes"
For Each Item In dico
cptTot = 0
For i = 1 To plageNoms.Rows.Count
If plageNoms.Cells(i, 1).Value = Item And plageNoms.Cells(i, 1).Offset(0, 1) <> "clôture" Then cptTot = cptTot + 1
Next i
resultatEnCours = resultatEnCours & vbCr & Item & vbTab & cptTot
Next Item
Set dico = Nothing

'repérer tous les prénoms en litige
Set dico = CreateObject("Scripting.Dictionary")
For Each c In plageNoms
If c.Offset(, 2) <> "" Then
dico.Item(c.Value) = c.Value '** pour lister les prénoms en litige
cptLitiges = cptLitiges + 1
End If
Next c
resultatLitiges = "Nombre de dossiers en litige: " & cptLitiges & vbCr & vbTab _
& "pour " & dico.Count & " personnes différentes"
For Each Item In dico
cptTot = 0
For i = 1 To plageNoms.Rows.Count
If plageNoms.Cells(i, 1).Value = Item And plageNoms.Cells(i, 1).Offset(0, 2) <> "" Then cptTot = cptTot + 1
Next i
resultatLitiges = resultatLitiges & vbCr & Item & vbTab & cptTot
Next Item
Set dico = Nothing

'Et on affiche les différentes infos
MsgBox "Nombre total de dossiers: " & plageNoms.Rows.Count & vbCr _
& resultatTot & vbCr & vbCr & "-------------------" & vbCr _
& vbCr & resultatEnCours & vbCr _
& vbCr & "-------------------" & vbCr _
& vbCr & resultatLitiges
End Sub

Un TRES GRAND MERCI à Modeste.
 
Re : nb occurences colonnedans msgbox

Bonsoir Phil39, le forum,

Souvent, quand une demande évolue, la macro proposée au départ s'adapte au fur et à mesure ... Or, il conviendrait dans ces cas-là, de repenser la chose, plutôt que de compléter le code original ... J'étais ennuyé par la réutilisation que je faisais d'un "Scripting.Dictionary" à plusieurs reprises. Les connaisseurs seraient en mesure de déterminer si la chose pose problème.
Bref, en travaillant au jardin et en oxygénant mon neurone, j'ai réfléchi et ai donc un peu retravaillé le code proposé ... NDLR: Le lecteur attentif notera que l'auteur ne prétend nullement que la version proposée soit un exemple du genre 🙄

Tout commentaire un tant soit peu éclairé sera le bienvenu!
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

L
Réponses
4
Affichages
2 K
laura_duj
L
L
Réponses
4
Affichages
10 K
N
C
Réponses
1
Affichages
2 K
Compte Supprimé 979
C
M
Réponses
7
Affichages
4 K
mericc
M
Retour