XL 2016 Compter le nombre de mots entre [ ] dans une chaîne de caractères

Aeser

XLDnaute Nouveau
Bonjour,

J’ai dans ma colonne A des textes contenant pour certains des expressions entre [ ] et je souhaiterais calculer le nombre total de mots entre [ ] par cellule.
1597677478267.png

Le nombre d’expressions entre [ ] par cellule est variable, de même que le nombre de mots entre [ ] au sein d’une même expression. Et c’est là toute la difficulté…

Je sais calculer le nombre d’expressions entre [ ] par cellule, mais je bloque pour le nombre de mots entre [ ]...

Des suggestions ?

Vous trouverez-ci-joint le fichier d'exemple

Merci pour votre aide :)
 

Pièces jointes

  • exemple.xlsx
    10.9 KB · Affichages: 25
Solution
Bonsoir @Aeser,
Bienvenue sur XLD :),

Avec une fonction personnalisée Mots (voir colonne D) dont le code VBA est dans module1 :
VB:
Function Mots(x As String) As Long
Dim s, n&, c
   x = Replace(x, "[", "µ["): x = Replace(x, "]", "]µ")
   s = Split(Application.Trim(x), "µ")
   For Each c In s: n = n + IIf(Left(c, 1) = "[", UBound(Split(c)) + 1, 0): Next
   Mots = n
End Function

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Aeser,
Bienvenue sur XLD :),

Avec une fonction personnalisée Mots (voir colonne D) dont le code VBA est dans module1 :
VB:
Function Mots(x As String) As Long
Dim s, n&, c
   x = Replace(x, "[", "µ["): x = Replace(x, "]", "]µ")
   s = Split(Application.Trim(x), "µ")
   For Each c In s: n = n + IIf(Left(c, 1) = "[", UBound(Split(c)) + 1, 0): Next
   Mots = n
End Function
 

Pièces jointes

  • Aeser- compter mots- v1.xlsm
    17.9 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
re
bonsoir
on peut peut être zapper le replace
et en bouclant a partir de 1 le split donnant un array en base 0 la partie avant le premier est zapé
VB:
Sub testx()
Dim x
x = "dgfdgf[jhgjhg ghgh fhgfg]ghjghghpopoidfd[gfgfdd hfg]hnjhjfgf[fgdfrs]hjhgjg ghghgh gfgfgfg"
t = Split(x, "[")
For i = 1 To UBound(t): c = c + UBound(Split(Split(t(i), "]")(0), " ")) + 1: Next
MsgBox c
End Sub
 

Dudu2

XLDnaute Barbatruc
Bonsoir les chercheurs de mots,

VB:
Sub a()
    MsgBox NbMots("zdfzef [ efzefzae    erzer  zd ze   zeer    ] zeze erev")
End Sub

Function NbMots(ByVal Chaine As String) As Integer
    Dim t() As String
    Dim i As Integer
  
    Chaine = Replace(Chaine, "]", "[")
    t = Split(Split(Chaine, "[")(1), " ")
    For i = LBound(t) To UBound(t)
        If Len(Trim(t(i))) Then NbMots = NbMots + 1
    Next i
End Function
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Dudu2
surtout pas ton replace
c'est pas cohérent avec x portions
ajoute plusieurs portions [.... .... ...] dans ta chaîne de départ tu verra
et je parle même pas des sub portions potentielle[.... ....[..... ..... .....].... .....] qui n'a pas été envisagé dans tout ce poste
 

Dudu2

XLDnaute Barbatruc
Si c'est toutes les séquences alors cette version,...

- Si toujours 1 seul espace entre les mots et pas d'espace après '[' ni avant ']'
VB:
Function NbMots(ByVal Chaine As String) As Integer
    Dim t() As String
    Dim i As Integer
    Dim j As Integer

    Chaine = Replace(Chaine, "]", "[")
    For i = 1 To UBound(Split(Chaine, "[")) Step 2
        t = Split(Split(Chaine, "[")(i), " ")
        NbMots = NbMots + UBound(t) + 1
    Next i
End Function

-Sinon
VB:
Function NbMots(ByVal Chaine As String) As Integer
    Dim t() As String
    Dim i As Integer
    Dim j As Integer

    Chaine = Replace(Chaine, "]", "[")
    For i = 1 To UBound(Split(Chaine, "[")) Step 2
        t = Split(Split(Chaine, "[")(i), " ")
        For j = LBound(t) To UBound(t)
            If Len(Trim(t(j))) Then NbMots = NbMots + 1
        Next j
    Next i
End Function
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
non le replace ne fait que compliquer les chose la preuve tu step
regarde
VB:
Sub test()
chaine = "mot1 mot2[mot3 mot4 mot5] mot6 [mot7] mot8 [mot9 mot10] mot11 mot 12"
t = Split(chaine, "[")
texte = texte & "les chaines du first split sont" & vbCrLf & Join(t, vbCrLf) & vbCrLf & vbCrLf
texte = texte & "les chaines a garder sont :" & vbCrLf & vbCrLf
For i = 1 To UBound(t)
texte = texte & Split(t(i), "]")(0) & vbCrLf
Next
MsgBox texte
End Sub
 

Dudu2

XLDnaute Barbatruc
Ok je vois ce que tu veux dire. Faudrait que j'adapte mon code pour ne pas avoir de Replace.

Mais le Replace, pour l'option de mapomme et la mienne, remplace un niveau de Split.
Alors bon, je ne sais pas ce qui est mieux. Toutes ces options fonctionnent avec leurs spécificités et leurs tolérances aux espaces.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
regarde j'ai ajouté la correction globale des espaces
VB:
Sub test()
chaine = "mot1 mot2[mot3            mot4      mot5]        mot6 [   mot7     ] mot8        [mot9     mot10] mot11 mot 12"
t = Split(Application.Trim(chaine), "[")
texte = texte & "les chaine du first split sont" & vbCrLf & Join(t, vbCrLf) & vbCrLf & vbCrLf
texte = texte & "les chaine a garder sont :" & vbCrLf & vbCrLf
For i = 1 To UBound(t)
texte = texte & Split(Application.Trim(t(i)), "]")(0) & vbCrLf
Next
MsgBox texte
End Sub

le principe est on ne peut plus simple
tu split le texte par le caractère de coupe de gauche et tu garde du 1 au ubound (le zero tu le zape d'office)
ensuite chaque portions trouvée tu les coupe par le caractère de coupe droite et cette fois ci tu garde que l' item zero de ces subsplit
et c'est tout
reste à envisager les virgule et autre caractères LA!!!! oui un replace sera nécessaire
 
Dernière édition:

Aeser

XLDnaute Nouveau
Super merci beaucoup, ça semble bien gérer les différents cas présents dans mon fichier.

Il n’y a pas de sub portions [.... ....[..... ..... .....].... .....], ni d’espace après ‘[‘ ou avant ‘]’ pour info.

Va vraiment falloir que je me mette au VBA :)
 

Discussions similaires