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

Recherche nombre d'occurrences VBA

Calvus

XLDnaute Barbatruc
Bonjour le Forum,

Des fois, certaines choses paraissent simples mais vous rendent fou !

Tout est dans le titre.
Dans mon exemple, j'aimerais avoir un résultat me donnant le numéro d'occurrence trouvé.
Pas le numéro de ligne mais bien l'ordre d'apparition.
Toto trouvé 3 fois, et si sélectionné, numéro de la sélection (par exemple 3 si V9 est sélectionnée)
Merci d'avance.
 

Pièces jointes

  • Recherche Nombre Occurrences.xlsx
    8.5 KB · Affichages: 40

job75

XLDnaute Barbatruc
Bonjour Calvus,
Des fois, certaines choses paraissent simples mais vous rendent fou !
Surtout quand ce n'est pas clairement exprimé.

Par exemple je lis :
Résultat cherché :
Toto 1/3
Toto 2/3
Toto 3/3
Alors qu'il y a 4 occurences pour Toto !!!

Perso je mettrais tout bêtement en V2, à tirer vers le bas :
Code:
=NB.SI(W$1:W2;W2)&"/"&NB.SI(W:W;W2)
A+
 

DoubleZero

XLDnaute Barbatruc
Bonjour, petit poisson , très cher job75 , le Forum,
... Toto trouvé 3 fois...


M'en va voir le zieutiste car "Toto" trouvé 4 fois !

Combien de "Toto" avec le code suivant ?
VB:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal c As Range, Cancel As Boolean)
    Cancel = 1
    If c.Column <> 22 Or c = "" Then Exit Sub
    c.Offset(, 1).Name = "là"
    MsgBox "Position : " & Application.CountIf([w2:là], c.Offset(, 1).Value) & Chr(10) _
    & Chr(10) & Application.CountIf([w:w], c.Offset(, 1)) & " x " & c.Offset(, 1).Value
    ActiveWorkbook.Names("là").Delete
End Sub
A bientôt
 

Calvus

XLDnaute Barbatruc
Bonjour Job75,

Oui, vous avez raison, il y en a bien 4.
Ça c'est quand on veut aller vite des fois !

J'ai besoin d'un code VBA car j'ai besoin d'insérer ledit code dans un Userform.
Bien évidemment, je viens d'essayer d'adapter, mais sans succès.

Merci

EDIT : Bonjour 00 , j'espère que tu vas bien.
Je vais jeter un œil sur ton code. Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

Une autre proposition :

Le code :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim PL As Range 'déclare la variable PL (PLage)
Dim NO As Integer 'déclare la variable NO (Nombre d'Occurrences)
Dim R As Range 'déclare la variable R (Recherche)
Dim PA As String 'déclare la variable PA (Première Adresse)
Dim X As Integer 'déclare la variable X (incrément)

Set PL = Range("W1:W" & Range("W" & Application.Rows.Count).End(xlUp).Row) 'définit la palge PL
'si la cellule sélectionnée ne se trouve pas dans une des cellules en colonne V adjacente à la plage PL ou si elle se trouve en ligne 1, sort de la procédure
If Application.Intersect(Target, PL.Offset(0, -1)) Is Nothing Or Target.Row = 1 Then Exit Sub
NO = Application.WorksheetFunction.CountIf(PL, Target.Offset(0, 1).Value) 'définit le nombre d'occurrences NO de la valeur adjacente (colonne W) à la cellule active dans la plage PL
Set R = PL.Find(Target.Offset(0, 1).Value, Range("W1"), xlValues, xlWhole) 'définit la recherche R (recherche la valeur de la cellule adjacente à la cellule active dans la plage PL)
If Not R Is Nothing Then 'condition 1 : si il existe au moins une occurrence trouvée
    X = 0 'initialise X
    PA = R.Address 'définit l'adresse de la premiere occurrence trouvée
    Do 'exécute
        X = X + 1 'incrémente x
        If R.Row = Target.Row Then 'condition 2 : si la ligne de la cellule active est la même que la ligne de R
            MsgBox Target.Offset(0, 1).Value & " " & X & "/" & NO 'message
            Exit Sub 'sort de la procédure
        End If 'fin de la condition 2
        Set R = PL.FindNext(R) 'redéfinit la recherche R (occurrence suivante)
    Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en PA
End If 'fin de la condition 1
End Sub

Le fichier :


 

Pièces jointes

  • Calvus_v01.xlsm
    18.7 KB · Affichages: 40

Calvus

XLDnaute Barbatruc
ROBERT !

Merci ! C'est génial, j'ai pu adapter ton code dans mon Userform. Ca fonctionne à merveille semble t'il.
La seule chose que je n'ai pas su faire, c'est de mettre ce code dans un module et l'appeler depuis le Userform.

Et je voulais te dire que Brassens, que tu adores, ne faisait pas des promesses de Gascon lui !
Je sais, tu ne vas certainement pas trouver pourquoi je te dis ça, mais je te laisse chercher un peu... Les macros c'est trop facile pour toi !

Gros bisous à 00 et merci aussi. Le code de Robert correspondait exactement à ce que je voulais adapter. C'était plus dur avec le tien.
 

Calvus

XLDnaute Barbatruc
Re-bonjour 00 ,

Qui c'est JH ?

Puisque tu es là, peux tu me dire ce qui ne va pas dans ce qui suit ?

VB:
Dim WB1 As Workbook, WB2 As Workbook
  
Set WB1 = ThisWorkbook
Set WB2 = Workbooks(Feuil53.[B5] & ".xlsx")

Classeur fermé : Erreur d'éxécution 9

Alors que cela fonctionne si le classeur est ouvert.

A bientôt

EDIT : c'est justement parce que c'est fermé. Je viens de comprendre je crois.
Mais alors y a t'il un moyen de détourner cela ?
 

job75

XLDnaute Barbatruc
Re,

Fichier joint juste pour montrer à Calvus la différence entre le code de DoubleZero et le code de Robert.

Robert est un adepte de la méthode Find mais elle prend beaucoup de temps.

Un tableau de 9000 lignes n'est pas un très gros tableau.

Bonne nuit.
 

Pièces jointes

  • Recherche Nombre Occurrences-Mesures.xlsm
    125.3 KB · Affichages: 45

Calvus

XLDnaute Barbatruc
Bonsoir Job75,

Merci pour ce retour.
Le code de Robert m'a été plus facile à adapter comme je le disais plus haut.

En revanche, avec le fichier que tu as posté, j'obtiens de 0,44 à 0,46 secondes avec le code de Robert, contre 0,90 à 0,95 secondes avec le code de Double Zéro !!
Tu semblais dire que le contraire aurait dû se passer...

Une explication ?

Bonne nuit.
 

job75

XLDnaute Barbatruc
Bonjour Calvus, le forum,

Je n'ai pas d'explication et ça me paraît invraisemblable.

Chez moi (Win 10 - Excel 2013) le code de Robert s'exécute en 2,5 secondes sur la cellule V9000.

Alors qu'avec le code de DoubleZero c'est instantané : 0,01 seconde et sans doute moins si l'on mesurait avec plus de précision.

Et c'est normal, DoubleZero utilise la formule de mon post #2 avec les NB.SI.

Si c'était bien 0,9 seconde cela voudrait dire que sur votre ordi on ne pourrait pas utiliser NB.SI dans une feuille de calcul !!!

A+
 

job75

XLDnaute Barbatruc
Re,

Le code de DoubleZero peut se simplifier en intégrant COUNTIF dans les évaluations [COUNTIF(w2:là,là)] et [COUNTIF(w:w,là)]

Cela modifie peu la durée d'exécution (6 millisecondes) :

- création du nom défini "là" 1,5 milliseconde

- évaluation du 1er COUNTIF 2,1 millisecondes

- évaluation du 2ème COUNTIF 2,1 millisecondes.

A+
 

Pièces jointes

  • Recherche Nombre Occurrences-Mesures(1).xlsm
    125.6 KB · Affichages: 41

Robert

XLDnaute Barbatruc
Repose en paix
Oeuf Corse Job ! Comme disent les poules d'Ajaccio (qui ont séché les cours d'anglais).

Le plus pénible avec Job c'est son avatar avec cette classe incommensurable voire même aussi vaste que ses connaissances !...
 

job75

XLDnaute Barbatruc
Hello Robert,

Calvus étant allergique aux COUNTIF ou NB.SI je lui propose une méthode avec tableau VBA.

C'est aussi rapide : 0,01 seconde.

Fichier (2).

A+
 

Pièces jointes

  • Recherche Nombre Occurrences-Mesures(2).xlsm
    128.3 KB · Affichages: 33

Discussions similaires

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