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...

cd95

XLDnaute Occasionnel
Bonjour pierrejean,

Merci beaucoup pour votre réponse rapide « pierre-jean » mais malheureusement ce n’est pas encore le bon résultat. Ci-joint votre fichier avec les erreurs en rouge dans la colonne « E ».
Désolé et encore merci :)
 

Pièces jointes

  • Occurrence d'un mot ou d'une chaîne_pierrejean.xlsm
    45.6 KB · Affichages: 10

cd95

XLDnaute Occasionnel
Re
Vois si cela va mieux
NB: Je suis déplorable au niveau des tests
Re,

Vous avez pu faire en un peu de temps ce que je n’ai pas pu faire pendant une semaine et je vous en remercie. Le problème est presque résolu mais reste un petit bémol important le code ne comptabilise pas les mots ou les parties des chaînes répétées dans une cellule.

Je vous demande avec humilité et je vous serais vraiment reconnaissant si vous pouviez résoudre cette option pour moi dans la limite de possible bien sûr et de m'enlever cette épine de pied. Merci pierrejean
 

laurent950

XLDnaute Accro
Vous avez pu faire en un peu de temps ce que je n’ai pas pu faire pendant une semaine et je vous en remercie. Le problème est presque résolu mais reste un petit bémol important le code ne comptabilise pas les mots ou les parties des chaînes répétées dans une cellule.
Dans le fichier que j'ai fait écrivais en DUR avec une COULEUR ORANGE et je remplis avec le code
 

cd95

XLDnaute Occasionnel
Dans le fichier que j'ai fait écrivais en DUR avec une COULEUR ORANGE et je remplis avec le code
Bonsoir le fil et laurent950,

Merci à vous « laurent950 » et ci-joint le fichier avec les deux codes de « pierrejean » et le vôtre donc vous allez remarquer vous-même la différence des résultats entre les deux codes. Le code de celui de « pierrejean » fonctionne correctement mais il ne comptabilise pas les occurrences des chaînes répétées dans une même cellule.
 

Pièces jointes

  • Occurrence d'un mot ou d'une chaîne (2 codes).xlsm
    51.9 KB · Affichages: 7

cd95

XLDnaute Occasionnel
Bonsoir le fil,

Juste pour remarque j’ai fait un test avec une chaîne répétée 5 fois dans la même cellule comme en exemple :

je mange je mange je mange je mange je mange

  • Résultat avec le code de « pierrejean » = 1
  • Résultat avec le code de « laurent950 » = 22
 

laurent950

XLDnaute Accro
Bonjour le Forum,

Poste #11 Code a Pierrejean Fonctionne très bien après essaie.

A essaie ? avec Regex
Faire de test est régler au fur et a mesure
Poste #14 (les codes sont pas toutes a fait exacte)

VB:
Option Explicit
Sub NbOccurenceOld()
' 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) = "(\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
                        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
                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
 
Dernière édition:

cd95

XLDnaute Occasionnel
Bonjour le Forum,
A essaie ?
Faire de test est régler au fur et a mesure
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) = "(\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
                        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
                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
Bonjour « laurent950 »,

Un grand remerciement le plus sincère pour la qualité du travail que vous avez effectué pour moi. Vous avez ainsi contribué à résoudre mon casse-tête et votre travail m’a apporté une très grande satisfaction. Le résultat donc est sans faute juste il reste le problème de la lenteur quand il s’agit d’une grande liste (j’ai dû même forcer l’arrêt de l’exécution au milieu de l’essai).
Pourriez-vous me décaler SVP la colonne des occurrences « F » dans « G » et supprimer Les anciennes écritures des colonnes « G » et « H » car à mon avis ils contribuent à la lenteur du programme et je vous renouvelle mes remerciements. Un GRAND MERCI à vous « laurent950 »
 

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 180
Membres
103 152
dernier inscrit
Karibu