[RÉSOLU] Renvoyer la position d'un mot dans une chaîne de caractères

clochete

XLDnaute Nouveau
Bonjour les artistes forumeurs !

Je dispose d'une fonction qui extrait un mot selon sa position dans la chaîne. Cette fonction sert à extraire des caractéristiques variables dans de très longues chaînes de caractères. Hors, repérer la position du mot à extraire dans ces chaînes est compliqué et source de nombreuses erreurs.

Je souhaiterai donc soit modifier la fonction ci-dessous soit en écrire une nouvelle qui me renverrai la position du mot dans la chaîne.

Code:
Function Extraire_Mot(Texte As String, No_Mot) As String
Dim CountMot As Long
  
        With Application.WorksheetFunction
        CountMot = Len(Texte) - Len(.Substitute(Texte, " ", "")) + 1
            No_Mot = No_Mot - 1
            Extraire_Mot = Mid(Mid(Mid(.Substitute(Texte, " ", "^", No_Mot), 1, 256), _
                .Find("^", .Substitute(Texte, " ", "^", No_Mot)), 256), 2, _
                .Find(" ", Mid(Mid(.Substitute(Texte, " ", "^", No_Mot), 1, 256), _
                .Find("^", .Substitute(Texte, " ", "^", No_Mot)), 256)) - 2)
      
    End With
End Function

Jusqu'à présent, toute mes tentatives me renvoient la position du premier caractère du mot cherché et non la position du mot.

Merci à tous pour votre aide.

Clochete
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsoir à tous

clochete
Peut-être que cette fonction du grand John Walkenbach pourrait te rendre service ;)

VB:
Function ExtractElement(Txt, n, Separator) As String
'   Returns the nth element of a text string, where the elements
'   are separated by a specified separator character

    Dim Txt1 As String, TempElement As String
    Dim ElementCount As Integer, i As Integer
    
    Txt1 = Txt
'   If space separator, remove excess spaces
    If Separator = Chr(32) Then Txt1 = Application.Trim(Txt1)
    
'   Add a separator to the end of the string (if necessary)
    If Right(Txt1, 1) <> Separator Then Txt1 = Txt1 & Separator
    
'   Initialize
    ElementCount = 0
    TempElement = ""
    
'   Extract each element
    For i = 1 To Len(Txt1)
        If Mid(Txt1, i, 1) = Separator Then
            ElementCount = ElementCount + 1
            If ElementCount = n Then
'               Found it, so exit
                ExtractElement = TempElement
                Exit Function
            Else
                TempElement = ""
            End If
        Else
            TempElement = TempElement & Mid(Txt1, i, 1)
        End If
    Next i
    ExtractElement=""    
End Function
 

Staple1600

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Suite...

Ci-dessous un exemple d'utilisation de la fonction ExtractElement
Code:
Sub test()
Dim strSample1$, strSample2$
strSample1 = "il pleut bergère"
strSample2 = "abc,cdef,ghijk,lmn,opq"
MsgBox ExtractElement(strSample1, 3, Chr(32))
MsgBox ExtractElement(strSample2, 2, ",")
End Sub
 

Modeste

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsoir clochete,
Salut JM,

J'en suis toujours à me demander ce que veut dire: " toute mes tentatives me renvoient la position du premier caractère du mot cherché et non la position du mot"
Quelle est la différence :confused:
 

Modeste geedee

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsour®
soit modifier la fonction ci-dessous soit en écrire une nouvelle qui me renverrai la position du mot dans la chaîne.
VB:
Function Extraire_Mot(Texte As String, No_Mot) As String
 Dim CountMot As Long
   
         With Application.WorksheetFunction
         CountMot = Len(Texte) - Len(.Substitute(Texte, " ", "")) + 1
             No_Mot = No_Mot - 1
             Extraire_Mot = Mid(Mid(Mid(.Substitute(Texte, " ", "^", No_Mot), 1, 256), _
                 .Find("^", .Substitute(Texte, " ", "^", No_Mot)), 256), 2, _
                 .Find(" ", Mid(Mid(.Substitute(Texte, " ", "^", No_Mot), 1, 256), _
                 .Find("^", .Substitute(Texte, " ", "^", No_Mot)), 256)) - 2)
       
     End With
     Extraire_Mot = Extraire_Mot & ", position : " & InStr(Texte, Extraire_Mot)
 End Function
:rolleyes:
la fonction initiale ne chercha pas un mot défini, mais le niéme mot dans le texte de départ

si on connait le mot à chercher
la fonction INSTR(texte, mot_cherché) renvoie la position du mot
 
Dernière édition:

clochete

XLDnaute Nouveau
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsoir Staple1600,

Je connais la fonction John Walkenbach et m'en sert en certaine circonstance. Avec les deux fonctions, mon problème se pose au moment de renseigner la position du mot (n). Mes chaînes de caractères peuvent comporter plus de 50 mots et repérer la position du mot à extraire est problématique. D'où mon souhait de pouvoir identifier la position du mot dans la chaîne.

Merci de votre aide
Clochete
 

Staple1600

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Re

Je connais la fonction John Walkenbach et m'en sert en certaine circonstance.
Et comment puis-je savoir que tu la connais déjà ?

D'autres membres du forum ne la connaissent peut-être pas, et lorsqu'ils liront ton fil, il se peut qu'ils soient content de la trouver là.
(avec un petit exemple d'utilisation)

C'est tout l’intérêt du forum, que les réponses apportées ne servent pas qu'au seul initiateur de la question posée, mais à toute la communauté ;)

Par ailleurs, si on pouvait voir un exemple des strings que tu traites, on y verrait peut-être un peu plus clair ;)
 

clochete

XLDnaute Nouveau
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Staple1600,

C'est justement parce que tu ne le sais pas que je te le dit :rolleyes:

Celle-ci renvoyant exactement le même résultat et imposant le même argument de position que la fonction partagée au début du post, je souhaitais juste préciser synthétiquement où se situe mon problème. Il n'y a nul reproche dans mon post bien au contraire. Je suis ravie que tu l'ai partagée. C'est le but. Je présente toutes mes excuses si je t'ai froissé :eek:.

Ceci étant dit, je te joins un fichier exemple.

Mille merci
Clochete
 

Pièces jointes

  • Extraire_Mot.xlsm
    16.6 KB · Affichages: 48

Staple1600

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Re

[digression]
C'est justement parce que tu ne le sais pas que je te le dit
Le dire dans ton premier message m'aurait éviter de le dire dans le mien.
Ce faisant, si tu l'avais dit, aurais-tu pour autant déposer le code VBA de John dans ton premier message.
Mais tu l'as pas fait dans le premier, alors finalement j'ai bien fait de le faire pour la communauté. ;)
(je crois que j'ai abusé de faire dans ce paragraphe... ;) )
[/digression]

NB: Seul le papier se froisse, et je ne suis pas en papier ;)

PS
: Comme tu ne le sais peut-être pas, je ne peux pas ouvrir les fichiers *.xlsm jusqu'à demain soir 19h45 voire 47 au pire 53.
De plus, il est bientôt temps pour moi de me glisser sous la couette, mon pyjama de flanelle sur lequel j'ai fait brodé #DIV/0! frétille d'impatience. Je pense rester le temps que mon infusion du soir refroidisse et que ma dernière cancerette finisse dans le cendrier.

Je repasserai donc ton fil ouvrir ta PJ demain soir (à moins que tu trouves le temps de joindre un*.xls)
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonjour à tous :),

J'avais commencé quelque chose, je publie.
La fonction personnalisée: Function ext_mot_pos(Texte As String, No_Mot, Optional xvar)

  • Texte : phrase au sein de laquelle on recherche le No_Mot ième mot
  • xvar : si absent, on renvoie le No_Mot ième mot
  • xvar : si présent (égale à n'importe quoi), on renvoie la position du No_Mot ième mot

Le code:
VB:
Function ext_mot_pos(Texte As String, No_Mot, Optional xvar)
Dim tablo, i&, j&, n&, mot$, pos&
  tablo = Split(Texte)
  For i = 0 To UBound(tablo)
    If Len(tablo(i)) <> 0 Then
      n = n + 1
      If n = No_Mot Then Exit For
    End If
  Next i
  If n = No_Mot Then
    For j = 0 To i - 1: pos = pos + Len(tablo(j)): Next j
    If IsMissing(xvar) Then ext_mot_pos = tablo(i) Else ext_mot_pos = pos + 1 + i
  Else
    If IsMissing(xvar) Then ext_mot_pos = vbNullString Else ext_mot_pos = 0
  End If
End Function
 

Pièces jointes

  • clochete - extraire mot v1.xlsm
    35.8 KB · Affichages: 61

Staple1600

XLDnaute Barbatruc
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonjour mapomme

mapomme
Merci.
Je viens grâce à toi de découvrir IsMissing
(fonctionne même sous Excel 2003 ;))
J'attends ta prochaine version avec choix du séparateur ;)
[Ne prends pas la peine de la poster en xls, je serai en mesure d'ouvrir les *.xlsm avant le crépuscule de ce soir.]
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsoir Staple1600 :),
(...) mapomme (...) J'attends ta prochaine version avec choix du séparateur ;) (...)

Et voici une tentative avec séparateur. La fonction personnalisée:
Function ext_mot_sep_pos(Texte As String, No_Mot, xsep, Optional xvar)

  • Texte : phrase au sein de laquelle on recherche le No_Mot ième mot
  • xsep est un texte qui représente le séparateur (en France, ce sera bien souvent l'espace :p)
  • xvar : si absent, on renvoie le No_Mot ième mot
  • xvar : si présent (égale à n'importe quoi), on renvoie la position du No_Mot ième mot

VB:
Function ext_mot_sep_pos(Texte As String, No_Mot, xsep, Optional xvar)
Dim tablo, i&, n&, pos&

  tablo = Split(Texte, xsep)
  n = 0: pos = 1
  For i = 0 To UBound(tablo)
    If Len(tablo(i)) <> 0 Then
      n = n + 1
      If n = No_Mot Then Exit For Else pos = pos + Len(xsep) + Len(tablo(i))
    Else
      pos = pos + Len(xsep)
    End If
  Next i
  
  If n = No_Mot Then
    If IsMissing(xvar) Then ext_mot_sep_pos = tablo(i) Else ext_mot_sep_pos = pos
  Else
    If IsMissing(xvar) Then ext_mot_sep_pos = vbNullString Else ext_mot_sep_pos = 0
  End If
End Function
 

Pièces jointes

  • clochete - extraire mot v2.xlsm
    39.3 KB · Affichages: 50

clochete

XLDnaute Nouveau
Re : Renvoyer la position d'un mot dans une chaîne de caractères

Bonsoir Staple1600, Bonsoir mapomme, :D

Staple1600, en effet, je ne savais pas pour les formats de fichier. Lacune comblée ;)

mapomme t'es un artiste ! Je ne connaissais pas non plus IsMissing. Deuxième lacune comblée :D

Pourrais-tu avoir la gentillesse de m'éclairer sur la façon dont je pourrais utiliser ou adapter cette fonction à mon besoin. Mon problème se pose au moment de saisir le No_Mot. Les chaînes de caractères que je dois traiter sont longues et pour le moment j'en suis réduite à compter chaque mot de la chaîne avec mes petits yeux fatigués pour savoir quel est le numéro du mot que je dois extraire.

Ce que je souhaite obtenir au final c'est une fonction du type PosMot (Texte, Mot) qui renvoie la position du mot. Ce qui me permettrait de renseigner le No_Mot de l'autre fonction. Je ne sais pas comment faire pour renvoyer la position d'un mot et non la position du 1er caractère de ce mot. Je suis totalement perdue :confused:.

Mille mercis d'avance
Clochete
 

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 342
Membres
103 192
dernier inscrit
Corpdacier