Recherche d'un mot dans une chaîne de caractères

Résolu
Siemens_duj -  
 Siamens_duj -
Bonjour,

J'essaie de faire un code qui me permettrait de chercher dans la colonne E de chaque ligne un mot commençant par "UP-" suivi de 9 caractères dont un tiret et un chiffre à la fin ou par "UT-" suivi de 4 caractères.

J'ai donc fais :

Sub chercher()

Dim I As Integer
Dim Nom As String * 12
Dim PNom As String * 7
Dim Instruc As String * 12
Dim Proc As String * 7
Dim ligne As String

Ligne = "*" & Instruc 'il y a parfois d'autres caractères après Instruc dans la ligne
Instruc = "UP-" & "*" & "-?"
Proc = "UT-" & "*"

I = 1

Do While cells(I, 5).value <> ""

If Nom = Instruc Then
Sheets("Feuil2").Cells(I, 1).value = Nom 'copie le résultat dans la feuille 2 à partir de la cellule A1

Goto fin

Elseif Nom <> Instruc Then
Goto suite

End if

Suite :

If PNom = Proc Then
Sheets("Feuil2").Cells(I, 2).Value = PNom 'Copie le résultat dans la feuille 2 à partir de la cellule B1.
Else: Msgbox "Aucune valeur trouvé"

End if

I = I + 1

Fin:

Loop

End sub


Avec ce code j'obtiens toujours "Aucune valeur trouvé"

Quelqu'un pourrait t-il m'aider svp

2 réponses

  1. Mosca
     
    Bonjour,

    On ne peut pas comparer des chaines avec des caractères joker *?

    Dans ton cas une solution serait de coder des fonctions spécialisées.
    Par exemple, voici une fonction qui cherche un mot de 12 caractères commençant par "UP-" et de terminant par "-" suivi d'un chiffre

    Function cherche_UP(ligneTXT As String) As String
    Dim pos As Integer
    Dim mot As String
    pos = InStr(ligneTXT, "UP-")
    cherche_UP = ""
    If pos > 0 Then
    mot = Mid(ligneTXT, pos, 12)
    If Mid(mot, 11, 1) = "-" _
    And Asc(Mid(mot, 12, 1)) >= Asc("0") _
    And Asc(Mid(mot, 12, 1)) <= Asc("9") Then
    cherche_UP = mot
    End If
    End If
    End Function


    En voici une autre qui cherche un mot de 7 caractères commençant par "UP-"

    Function cherche_UP(ligneTXT As String) As String
    Dim pos As Integer
    Dim mot As String
    pos = InStr(ligneTXT, "UP-")
    cherche_UP = ""
    If pos > 0 Then
    mot = Mid(ligneTXT, pos, 12)
    If Mid(mot, 11, 1) = "-" _
    And Asc(Mid(mot, 12, 1)) >= Asc("0") _
    And Asc(Mid(mot, 12, 1)) <= Asc("9") Then
    cherche_UP = mot
    End If
    End If
    End Function


    Il faut placer ces fonctions dans un module
    Voici une procédure test qui montre comment appeler ces fonctions

    Sub test()
    Dim ligneTEXTE As String 'texte à scanner
    Dim RES As String 'resultat

    'appel fonction cherche_UP
    ligneTEXTE = "blabla UP-xxxxxxx-3 blablabla"
    RES = cherche_UP(ligneTEXTE)
    If RES <> "" Then
    MsgBox "test UP- trouvé -> " & RES
    Else
    MsgBox "test UP- pas trouvé"
    End If

    'appel fonction cherche_UT
    ligneTEXTE = "blabla UT-xxxxxxx-3 blablabla"
    RES = cherche_UT(ligneTEXTE)
    If RES <> "" Then
    MsgBox "test UT- trouvé -> " & RES
    Else
    MsgBox "test UT- pas trouvé"
    End If

    End Sub
    1
    1. Siamens_duj
       
      Merci beaucoup pour votre réponse.
      Cependant cela ne fonctionne pas, j'ai "test UT- pas trouvé" et "test UP- pas trouvé" à tout les coup ...
      0
    2. Mosca > Siamens_duj
       
      Puis-je voir ce que tu as écrit?

      A+
      0
    3. Siamens_duj
       
      Dans un module comme vous me l'avez dit :

      Function cherche_UP(ligneTXT As String) As String
      Dim pos As Integer
      Dim mot As String
      pos = InStr(ligneTXT, "UP-")
      cherche_UP = ""
      If pos > 0 Then
      mot = Mid(ligneTXT, pos, 12)
      If Mid(mot, 11, 1) = "-" _
      And Asc(Mid(mot, 12, 1)) >= Asc("0") _
      And Asc(Mid(mot, 12, 1)) <= Asc("9") Then
      cherche_UP = mot
      End If
      End If
      End Function


      Function cherche_UT(ligneTXT As String) As String
      Dim pos As Integer
      Dim mot As String
      pos = InStr(ligneTXT, "UT-")
      cherche_UT = ""
      If pos > 0 Then
      mot = Mid(ligneTXT, pos, 7)
      If Mid(mot, 6, 1) <> "-" _
      And Asc(Mid(mot, 7, 1)) >= Asc("0") _
      And Asc(Mid(mot, 7, 1)) <= Asc("9") Then
      cherche_UT = mot
      End If
      End If
      End Function


      Et dans "Thisworkbook"

      Sub Recherche()
      Dim ligneTEXTE As String 'texte à scanner
      Dim RES As String 'resultat

      'appel fonction cherche_UT
      ligneTEXTE = "blabla UT-xxxx blablabla"
      RES = cherche_UT(ligneTEXTE)
      If RES <> "" Then
      MsgBox "test UT- trouvé -> " & RES
      Else
      MsgBox "test UT- pas trouvé"
      End If

      'appel fonction cherche_UP
      ligneTEXTE = "blabla UP-xxxxxxx-x blablabla"
      RES = cherche_UP(ligneTEXTE)
      If RES <> "" Then
      MsgBox "test UP- trouvé -> " & RES
      Else
      MsgBox "test UP- pas trouvé"
      End If

      End Sub
      0
    4. Mosca > Siamens_duj
       
      Tu n'as pas bien recopié

      'appel fonction cherche_UP
      ligneTEXTE = "blabla UP-xxxxxxx-x blablabla"

      Il faut tester avec un chiffre à la 12è position
      'appel fonction cherche_UP
      ligneTEXTE = "blabla UP-xxxxxxx-5 blablabla"
      puisque le 12ème caractère doit etre un chiffre

      pour ma part j'ai fait un faux copié collé pour la fonction cherche_UT

      voici la bonne
      Function cherche_UT(ligneTXT As String) As String
      Dim pos As Integer
      Dim mot As String
      MsgBox ligneTXT
      pos = InStr(ligneTXT, "UT-")
      cherche_UT = ""
      If pos > 0 Then
      mot = Mid(ligneTXT, pos, 7)
      If Len(mot) = 7 Then
      cherche_UT = mot
      End If
      End If
      End Function
      0
    5. Siamens_duj > Mosca
       
      Bonjour et merci pour votre réponse.

      Votre code fonctionne, j'ai cependant retiré le chiffre en dernière position car on sait que le code UP doit faire 12 caractères et j'ai fais en sorte qu'il me copie le résultat dans la feuil2.

      Aussi, j'aimerais parcourir toutes les cellules de ma feuil1 et copier le résultat qu'il trouve en feuil2 colonne A pour les UP et en colonne B pour les UT.

      J'ai fais un code mais il ne me copie que ce qu'il trouve dans la cellule E de la première ligne.

      Comment puis-je faire ?
      0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    A quel moment ces deux variables prennent une valeur:

    Dim Nom As String * 12
    Dim PNom As String * 7
    0
    1. Siamens_duj
       
      Bonjour,

      Et merci pour votre réponse.
      Apres quelques remarques j'ai modifié mon code.

      Cependant lorsque je donne une valeur à Nom il n'accepte pas ceci : "UP-" & "*" & "-?"
      Je dois donc lui attribuer une valeur en dur alors que Nom n'a pas toujours la même valeur.
      Idem pour PNom.
      Aussi, la position de la sous chaîne n'est jamais la même, et là aussi j'ai du lui attribuer une position en dur.
      Mon code ne fonctionne donc que pour recherche UNE unique valeur dans UNE unique cellule, ce qui n'est pas du tout ce que je veux faire mais je n'arrive pas à faire autrement.

      Je vous joins mon code :

      Sub Cherche()

      Dim PlageDeRecherche As Range
      Dim Nom As String * 12
      Dim PNom As String * 7
      Dim i As Integer
      Dim j As Integer

      j = 1
      'For i = 1 To 2000
      i = 1954

      Nom = "UP-M-03454-1"
      PNom = "UT-" & "????"

      Do While Cells(i, 5).Value <> ""

      Set PlageDeRecherche = Sheets("Feuil1").Cells(i, 5)

      If InStr(PlageDeRecherche, Nom) = 14 Then

      ' MsgBox "trouvé"

      Sheets("Feuil2").Cells(j, 1).Value = Nom
      GoTo fin

      Else

      GoTo Suite

      End If

      Suite:

      If InStr(PlageDeRecherche, PNom) = 1 Then

      MsgBox "IP trouvé"

      Sheets("Feuil2").Cells(j, 2).Value = PNom

      Else

      MsgBox " Aucun UT ou UP trouvé"

      i = i + 1

      End If

      fin:
      j = j + 1
      Loop

      'Next i

      End Sub


      Merci par avance pour votre aide.
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Siamens_duj
         
        Re,

        Pouvez-vous mettre un fichier avec des donnees significatives et une explication claire de ce que voue voulez obtenir pour que nous puissions comprendre ?????
        0
      2. Siamens_duj > f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention  
         
        Je dispose d'un classeur Excel composé d'une "feuil1" qui comporte des données en ligne dont les données qui m'intéressent en colonne E.

        Par exemple =
        A1 = La petite
        B1 = Fille de ce
        C1 = Monsieur aime
        D1 = Aimer les
        E1 = Poneys de numéro "UP-M-03434-1"

        Les données dans les autres cellules ne m'intéressent pas car elles peuvent être les même que dans d'autres cellules.

        Par contre, le numéro qui m'intéresse en "E" n'est pas toujours à la même position et la longueur de la chaîne n'est pas toujours la même.

        Le numéro n'est jamais le même dans d'autre cellule mais commence toujours par "UP-" fini par "- un chiffre" et comporte en tout 12 caractères ou commence par "UT-" suivi de 4 caractères.

        J'espère avoir été un peu plus claire, j'avoue avoir un peu de mal à expliquer.

        Je vous remercie tout de même pour votre aide.
        0