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

Résolu/Fermé
Siemens_duj - Modifié par Siemens_duj le 21/12/2015 à 14:01
 Siamens_duj - 23 déc. 2015 à 09:56
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
A voir également:

2 réponses

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
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
Mosca > Siamens_duj
22 déc. 2015 à 15:43
Puis-je voir ce que tu as écrit?

A+
0
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
Mosca > Siamens_duj
22 déc. 2015 à 16:36
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
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
22 déc. 2015 à 09:41
Bonjour,

A quel moment ces deux variables prennent une valeur:

Dim Nom As String * 12
Dim PNom As String * 7
0
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > Siamens_duj
22 déc. 2015 à 14:08
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
Siamens_duj > f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024
Modifié par Siamens_duj le 22/12/2015 à 16:00
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