XL 2016 Recherche l’occurrence d’une partie d’une chaîne dans une liste de chaînes (ou colonne)

cd95

XLDnaute Occasionnel
Bonjour,

Pourriez-vous s'il vous plaît me donner une solution pour trouver le nombre de fois exact qu’une partie d’une chaîne a été retrouvée dans une cellule, liste ou une colonne, mais une recherche exacte du mot ou de la chaîne recherchée. (Par formule ou code VBA).

Exemple : rechercher Toto et ensuite une pomme dans la liste en dessous :
  • Toto va à l’école accompagné par son tantontoto : occurrence = 1
  • Dans la classe il y a le petit Totoma le grand Toto et son ami Toto Jacque : occurrence = 2
  • Je mange une pomme : occurrence = 1
  • Je mange unepomme : occurrence = 0
L’idée c’est de compter l’occurrence du mot (ou une partie d’une chaîne exacte) qui se répète dans une cellule et la colonne entière.

Quelques formules dans le fichier joint mais aucune ne me donnent le résultat que je recherche. J'ai cherché partout dans le forum mais en vain. Merci d'avance.
 

Pièces jointes

  • Occurrence d'un mot ou d'une chaîne.xlsx
    42.3 KB · Affichages: 22
Solution
Comme je l’avais expliqué tout à l’heure mis à part le problème de la lenteur tout va bien et il faut mieux ne pas avoir une très grande liste.
je change la longueur

Une feuille Excel est composée d'un certain nombre de lignes et de colonnes. Leur nombre est limité : 1 048 576 lignes et 16 384 colonnes.
Changer Poste #19
chaine = Range(Cells(3, 4), Cells(Cells(1048576, 5).End(xlUp).Row, 5)) '

Un dépassement de capacité se produit quand vous tentez d'effectuer une affectation dépassant les limites de la cible de l'affectation. Causes et solutions pour cette erreur :
Je vais changer les variable aussi

Dim i As Long, col As Integer, Box As Integer, j As Long, k As Integer
i et j...

laurent950

XLDnaute Accro
re,
Poste #14 et Poste #17 (les codes sont pas toutes a fait exacte)
VB:
Option Explicit
Sub NbOccurence()
' Code OK
    Dim Matches As Object
    Dim Match As Object
    Dim reg As Object
        Set reg = CreateObject("VBScript.RegExp")
    Dim chaine() As Variant
    Dim i As Integer, col As Integer, Box As Integer, j As Integer, k As Integer
        chaine = Range(Cells(3, 4), Cells(Cells(65535, 5).End(xlUp).Row, 5)) '
            ReDim Preserve chaine(LBound(chaine, 1) To UBound(chaine, 1), LBound(chaine, 2) To 11)
    For i = LBound(chaine, 1) To UBound(chaine, 1)
'        chaine(i, 3) = "((^" & chaine(i, 2) & "[.,;?!]){1,}|" _
'                     & "(^" & chaine(i, 2) & "\s){1,}|" _
'                     & "(\b" & chaine(i, 2) & "\b){1,}|" _
'                     & "(" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
'                     & "(" & chaine(i, 2) & "\s){1,}|" _
'                     & "(\s" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
'                     & "(\s" & chaine(i, 2) & "\s){1,}|" _
'                     & "(\s" & chaine(i, 2) & "[.,;?!]){1,}|" _
'                     & "(\s" & chaine(i, 2) & "){1,}|" _
'                     & "(\s" & chaine(i, 2) & "[.,;?!]$)|" _
'                     & "(\s" & chaine(i, 2) & "$))"
        chaine(i, 3) = "((^" & chaine(i, 2) & "[.,;?!]){1,}|" _
                     & "(^" & chaine(i, 2) & "\s){1,}|" _
                     & "(\b" & chaine(i, 2) & "\b){1,}|" _
                     & "(\b" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
                     & "(\b" & chaine(i, 2) & "\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]){1,}|" _
                     & "(\s" & chaine(i, 2) & "\b){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]$)|" _
                     & "(\s" & chaine(i, 2) & "$))"
'        chaine(i, 3) = "(\b" & chaine(i, 2) & "\b)"
    Next i
  
    ' Recherche en colonne :
        For i = LBound(chaine, 1) To UBound(chaine, 1)
                For j = LBound(chaine, 1) To UBound(chaine, 1)
                    reg.Pattern = chaine(i, 3)
                    reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True
                    Debug.Print reg.test(chaine(j, 1))
                    Set Matches = reg.Execute(chaine(j, 1))
                    For k = 0 To Matches.Count - 1
                    'MsgBox UCase(Mid(chaine(j, 1), Matches(k).FirstIndex + 1, 1))
                    'MsgBox UCase(Mid(chaine(j, 1), (Matches(k).FirstIndex + 1 + Matches(k).Length), 1))
                        chaine(i, 4) = chaine(i, 4) + Matches.Item(k)
                    Next k
                Next j
        Next i
      
    ' Recherche doubon dans la chaine
        For i = LBound(chaine, 1) To UBound(chaine, 1)
            DoublonChaine chaine, i, 4, 5
        Next i
      
    ' Recherche en Ligne :
        For i = LBound(chaine, 1) To UBound(chaine, 1)
                reg.Pattern = chaine(i, 3)
                reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True
                Debug.Print reg.test(chaine(i, 1))
                Set Matches = reg.Execute(chaine(i, 1))
                If reg.test(chaine(i, 1)) = True Then
                    chaine(i, 6) = "OUI"
                    'DoublonChaine chaine, i, 1, 7
                    chaine(i, 6) = Matches.Count
                Else
                    chaine(i, 6) = "NON"
                    chaine(i, 7) = 0
                End If
                chaine(i, 11) = chaine(i, 7) * Len(chaine(i, 2))
                For Each Match In Matches
                    If (Match.Length + Match.FirstIndex) < (Len(chaine(i, 1)) / 3) Or Match.FirstIndex = 0 Then
                        chaine(i, 8) = "X"
                     ElseIf (Match.Length + Match.FirstIndex) > (Len(chaine(i, 1)) / 3) * 2 Or (Match.Length + Match.FirstIndex) = Len(chaine(i, 1)) Then
                        chaine(i, 10) = "X"
                     Else
                        chaine(i, 9) = "X"
                    End If
                Next
        Next i

' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing

'For i = 5 To 11
'    Cells(3, i + 1).Resize(UBound(chaine, 1)) = Application.Index(chaine, , i)
'Next i

For i = LBound(chaine, 1) To UBound(chaine, 1)
        For j = 5 To UBound(chaine, 2)
            Cells(i + 2, j + 1) = chaine(i, j)
    Next j
Next i
End Sub

Sub DoublonChaine(chaine() As Variant, i As Integer, col As Integer, Box As Integer)
Dim n As Integer, Rech As Integer, j As Integer
n = Len(chaine(i, 2))      ' nombre de caractères à rechercher (n = x -> on recherche la répétition de deux caractères)
Rech = Len(chaine(i, col)) ' Longueur total de la chaine
    For j = 1 To Rech
        If UCase(chaine(i, 2)) = UCase(Mid(chaine(i, col), j, n)) Then
        chaine(i, Box) = chaine(i, Box) + 1
        End If
    Next j
End Sub

Ps : http://blog.paumard.org/cours/java-api/chap03-expression-regulieres-syntaxe.html
https://cafeine.developpez.com/access/tutoriel/regexp/

Cdt
 
Dernière édition:

cd95

XLDnaute Occasionnel
Bonsoir le fil,

Comme je l’avais expliqué tout à l’heure mis à part le problème de la lenteur tout va bien et il faut mieux ne pas avoir une très grande liste.

Dépassement de capacité.PNG


Merci pour votre aide. Une chose est sûre, je n'aurais rien pu faire sans votre aide.
Un énorme MERCI pour des personnes tout simplement géniales
 

laurent950

XLDnaute Accro
Re,
C'est fait :
Le code est celui du POSTE #19 (Corrigé est les plus fiables)
VB:
Option Explicit
Sub NbOccurenceNewsMod5()
' Code OK 02/05/2020 Derniére version
    Dim Matches As Object
    Dim Match As Object
    Dim reg As Object
        Set reg = CreateObject("VBScript.RegExp")
    Dim chaine() As Variant
    Dim i As Long, col As Integer, Box As Integer, j As Long, k As Integer
        chaine = Range(Cells(3, 4), Cells(Cells(1048576, 5).End(xlUp).Row, 5)) '
            ReDim Preserve chaine(LBound(chaine, 1) To UBound(chaine, 1), LBound(chaine, 2) To 11)
    For i = LBound(chaine, 1) To UBound(chaine, 1)
        chaine(i, 3) = "((^" & chaine(i, 2) & "[.,;?!]){1,}|" _
                     & "(^" & chaine(i, 2) & "\s){1,}|" _
                     & "(\b" & chaine(i, 2) & "\b){1,}|" _
                     & "(\b" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
                     & "(\b" & chaine(i, 2) & "\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "\s){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]){1,}|" _
                     & "(\s" & chaine(i, 2) & "\b){1,}|" _
                     & "(\s" & chaine(i, 2) & "[.,;?!]$)|" _
                     & "(\s" & chaine(i, 2) & "$))"
    Next i
   
    ' Recherche en colonne :
        For i = LBound(chaine, 1) To UBound(chaine, 1)
                For j = LBound(chaine, 1) To UBound(chaine, 1)
                    reg.Pattern = chaine(i, 3)
                    reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True: Debug.Print reg.test(chaine(j, 1))
                        Set Matches = reg.Execute(chaine(j, 1))
                            For k = 0 To Matches.Count - 1
                                chaine(i, 4) = chaine(i, 4) + Matches.Item(k)
                            Next k
                Next j
        Next i
       
    ' Recherche doubon dans la chaine
        For i = LBound(chaine, 1) To UBound(chaine, 1)
        ' i Ligne tableau, 4 Concatenation, 5 remplire le nombre du tableau
            DoublonChaine chaine, i, 4, 5
        Next i
       
    ' Recherche en Ligne :
        For i = LBound(chaine, 1) To UBound(chaine, 1)
                reg.Pattern = chaine(i, 3)
                reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True: Debug.Print reg.test(chaine(i, 1))
                Set Matches = reg.Execute(chaine(i, 1))
                If reg.test(chaine(i, 1)) = True Then
                ' i Ligne tableau, 1 Chaine réel, 6 remplire le nombre du tableau
                ' DoublonChaine chaine, i, 1, 6
                    chaine(i, 6) = Matches.Count
                    chaine(i, 10) = chaine(i, 6) * Len(chaine(i, 2))
                Else
                    chaine(i, 6) = 0
                    chaine(i, 10) = 0
                End If
                For Each Match In Matches
                    If (Match.Length + Match.FirstIndex) < (Len(chaine(i, 1)) / 3) Or Match.FirstIndex = 0 Then
                        chaine(i, 7) = "X"
                     ElseIf (Match.Length + Match.FirstIndex) > (Len(chaine(i, 1)) / 3) * 2 Or (Match.Length + Match.FirstIndex) = Len(chaine(i, 1)) Then
                        chaine(i, 9) = "X"
                     Else
                        chaine(i, 8) = "X"
                    End If
                Next
        Next i

' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing

Application.ScreenUpdating = False
'For i = 5 To 11
'    Cells(3, i + 1).Resize(UBound(chaine, 1)) = Application.Index(chaine, , i)
'Next i
    For i = LBound(chaine, 1) To UBound(chaine, 1)
            For j = 5 To UBound(chaine, 2)
                Cells(i + 2, j + 2) = chaine(i, j)
        Next j
    Next i
Application.ScreenUpdating = True
End Sub

Sub DoublonChaine(chaine() As Variant, i As Long, col As Integer, Box As Integer)
Dim n As Integer, Rech As Integer, j As Integer
n = Len(chaine(i, 2))      ' nombre de caractères à rechercher (n = x -> on recherche la répétition de deux caractères)
Rech = Len(chaine(i, col)) ' Longueur total de la chaine
    For j = 1 To Rech
        If UCase(chaine(i, 2)) = UCase(Mid(chaine(i, col), j, n)) Then
        chaine(i, Box) = chaine(i, Box) + 1
        End If
    Next j
End Sub

Ps : http://blog.paumard.org/cours/java-api/chap03-expression-regulieres-syntaxe.html
https://cafeine.developpez.com/access/tutoriel/regexp/

Cdt
 
Dernière édition:

laurent950

XLDnaute Accro
Comme je l’avais expliqué tout à l’heure mis à part le problème de la lenteur tout va bien et il faut mieux ne pas avoir une très grande liste.
je change la longueur

Une feuille Excel est composée d'un certain nombre de lignes et de colonnes. Leur nombre est limité : 1 048 576 lignes et 16 384 colonnes.
Changer Poste #19
chaine = Range(Cells(3, 4), Cells(Cells(1048576, 5).End(xlUp).Row, 5)) '

Un dépassement de capacité se produit quand vous tentez d'effectuer une affectation dépassant les limites de la cible de l'affectation. Causes et solutions pour cette erreur :
Je vais changer les variable aussi

Dim i As Long, col As Integer, Box As Integer, j As Long, k As Integer
i et j les lignes 1048576

Poste #14 et Poste #17 (les codes sont pas toutes a fait exacte)

Le code est celui du POSTE #19 (Corrigé est les plus fiables)

Laurent950 (Objet REGEX Pour recherche dans base de données)
( Fichier Joint " Procedure : Sub NbOccurenceNewsMod5()" )
Code OK 02/05/2020 Derniére version
 

Pièces jointes

  • Occurrence d'un mot ou d'une chaîne (SolutionRgex).xlsm
    58.3 KB · Affichages: 7
Dernière édition:

cd95

XLDnaute Occasionnel
je change la longueur

Une feuille Excel est composée d'un certain nombre de lignes et de colonnes. Leur nombre est limité : 1 048 576 lignes et 16 384 colonnes.
Changer Poste #19
chaine = Range(Cells(3, 4), Cells(Cells(1048576, 5).End(xlUp).Row, 5)) '

Un dépassement de capacité se produit quand vous tentez d'effectuer une affectation dépassant les limites de la cible de l'affectation. Causes et solutions pour cette erreur :
Je vais changer les variable aussi

Dim i As Long, col As Integer, Box As Integer, j As Long, k As Integer
i et j les lignes 1048576

Poste #14 et Poste #17 (les codes sont pas toutes a fait exacte)

Le code est celui du POSTE #19 (Corrigé est les plus fiables)

Laurent950 (Objet REGEX Pour recherche dans base de données)
( Fichier Joint " Procedure : Sub NbOccurenceNewsMod5()" )
Code OK 02/05/2020 Derniére version
Un grand merci.PNG
Un grand merci.PNG
Un grand merci.PNG
 

fanch55

XLDnaute Barbatruc
Bonsoir à tous,
Je vois que le sujet est résolu, c'est bien .
Je n'ai pas testé le module .
Je me posai juste une question au point de vu recherche de mot .
Est-elle faite quelle que soit la police utilisée ( je pensais aux Windings et autres ...)
Prend-t-elle en compte les spécificités de la langue française tels que les é è à ù ç œ et autres ainsi que les majuscules accentuées ?
C'est juste par curiosité ... :cool:
 

laurent950

XLDnaute Accro
Bonjour fanch55,
Ok on peux essayé de faire des tests je suis Ok

Ont peux faire d'autre test avec un fichier que je vais construire joindre pour vérifier les autres combinaison et travailler juste sur les recherches de chaînes
 
Dernière édition:

fanch55

XLDnaute Barbatruc
@laurent950
Merci de ta disponibilité .
C'était juste une question à l'instant présent .
Je suis déjà sur plusieurs Post et je risque de ne pas être assidu en m'éparpillant .
Mais ce n'est que partie remise, je créerai une discussion pour cela, pas la peine de surcharger celui-ci.

Merci encore ;)
 

laurent950

XLDnaute Accro
Bonjour Le forum.
J'ai fait le fichier qui sert a testé la cohérence du Pattern.

* 1) Premier Test = (Pour chaque Ligne de est chaque type de chaînes)
* C'est du cas par cas
* Tu Créer un Motif Pattern spécifique.
* Se Motif sers à récupérer une partie de la chaîne de caractère.
Exemple : Mot = Mats
* La construction du pattern sera : "m[oai]ts"
* Permet de tester la cohérence du Pattern.

* 2) Autres Test = Tu créer un Motif (Applicable pour toutes les chaînes)
* Par exemple rechercher un texte ou quelques choses dans une grande base de données.
* Se Motif sers sur une recherche Global.
* Cette recherche est aussi Multi-Critères
* Basé sur le seul Motif du Pattern (à construire de toute Pièce)
Exemple : Ou plus simple et ce grâce aux ensembles de caractères.
Pattern : "m[oai]ts" ' Soit :
Ou
m[^oai]ts ' Soit :

* 3) Autres Test = Tu créer des Motifs (Mais qui sont liées a des Mots que tu veux rechercher aussi)
* Par exemple : Rechercher dans la base des mots en fonction d'une liste de mots
* En quelques sorte une recherche Multi-Critères.
* Basé sur le seul Motif du Pattern (à construire de toute Pièce avec l'aide d'une liste)

* Exemple : chercher dans notre texte, les mots mots, mats et mits
Pattern = "mots|mats|mits"
C'est mot sont dans le fichier excel (on récupère pour s'aider)
Excel Liste :
* A1 = mots
* A2 = Mats
* A3 = Mits

Bonus : Compte aussi les Caractères ou Mots qui se répétés dans la chaîne (Peux être a régler encore !)


Ps : Je joins le fichier Excel.
Lien Utiles pour compréhension : https://www.lucaswillems.com/fr/articles/25/tutoriel-pour-maitriser-les-expressions-regulieres

complément : Double Extraction
VB:
Option Explicit
Sub TrouveOccurence()
' Code OK
    Dim Matches As Object, MatchesBis As Object
    Dim Match As Object, MatchBis As Object
    Dim reg As Object, regBis As Object
        Set reg = CreateObject("VBScript.RegExp")
    Dim StrMatchTrouve As String  ' La cible caractéres rechecher par Pattern à extraire !
    Dim chaine() As Variant
    Dim i As Byte
        chaine = Range(Cells(2, 1), Cells(Cells(65535, 1).End(xlUp).Row, 2)) '
            ReDim Preserve chaine(LBound(chaine, 1) To UBound(chaine, 1), LBound(chaine, 2) To 3)
    ' Pattern d'extraction.
        chaine(1, 3) = "(arqu)(.*)(\d{1,3})"
       
'   Recherche :
' ---------------------
        For i = LBound(chaine, 1) To UBound(chaine, 1)
            reg.Pattern = chaine(i, 3)
            reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True: MsgBox reg.test(chaine(i, 1))
            Set Matches = reg.Execute(chaine(i, 1))
            ' Recherche trouvé (Partie du Mots ou chaine recherché !)
            For Each Match In Matches
                StrMatchTrouve = Match.Value        ' Recherche trouver
                    Set regBis = CreateObject("VBScript.RegExp")
                    regBis.Pattern = "\d{1,3}"     ' Extration de la partie concerné
                        Set MatchesBis = regBis.Execute(StrMatchTrouve)
                            For Each MatchBis In MatchesBis
                                MsgBox MatchBis.Value
                                chaine(1, 2) = MatchBis.Value
                            Next
            Next
        Next i

' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing

' En cellule B2 le resultat
Range("B2") = chaine(1, 2)

End Sub

laurent950 REGEX regex vba
 

Pièces jointes

  • Test Coherence Occurrence d'un mot ou d'une chaîne (SolutionRgex).xlsm
    36.6 KB · Affichages: 16
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 265
Membres
103 501
dernier inscrit
talebafia