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

Fermé
PhenlKs Messages postés 16 Date d'inscription lundi 25 avril 2016 Statut Membre Dernière intervention 6 mars 2018 - 25 avril 2016 à 10:27
PhenlKs Messages postés 16 Date d'inscription lundi 25 avril 2016 Statut Membre Dernière intervention 6 mars 2018 - 26 avril 2016 à 09:52
Bonjour,
Je cherche depuis quelques jours, sans résultats, le moyen pour trouver un mot dans une chaîne de caractère. Le mot en question est saisi par un utilisateur via une TextBox et je voudrais qu'une fois le mot entré, toutes les lignes du classeur situé dans un autre onglet contenant ce mot s'affiche en dessous de la TextBox.

Par exemple, dans la colonne I, j'ai recensé différents types de panne sur un équipement dont les Feux. Hors si je tape ce mot il ne me sortira pas les lignes où est écris "Feu latéral" ou "Voyant température +Feu gabarit"...

Pour l'instant j'ai ça mais ça me donne que les lignes ne contenant que le mot seul :


Private Sub Constat_Change()
Dim i As Integer, k As Integer

Application.ScreenUpdating = False

If UCase(Constat.Text) Like "" Then 'si le champ est vide, ne rien afficher
Exit Sub
End If


i = 6 'commencer à la ligne 6 pour garder de la place
For k = 2 To 1142 'mettre la dernière ligne du tableur

If UCase(Constat.Text) Like Sheets("Extract").Range("I" & k).Value Then 'rechercher un mot dans les constats
Sheets("Sélection").Range("A" & i & ":" & "N" & i).Value = Sheets("Extract").Range("A" & k & ":" & "N" & k).Value
i = i + 1
End If

Next
End Sub


J'espère que mon problème est clairement visible et que vous pourrez m'aider à trouver une solution.

Cordialement,
PhenlKs
A voir également:

1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
25 avril 2016 à 21:40
Bonsoir Pheniks, bonsoir le forum,

Comme tu n'as pas joint un fichier exemple j'ai créé en me basant sur ton code mais il te faudra certainement adapter à ton fichier.
Dans l'onglet Sélection, clique sur le bouton Extraire. Dans l'Userform, édite le texte recherché. Au fur et à mesure de l'édition, la ListBox1 affiche la liste des éléments correspondants, trouvés dans la colonne I de l'onglet Extract. Si la ListBox1 est vide c'est qu'il n'y a aucun élément correspondant.

Si la ListBox1 n'est pas vide, tu peux :
• soit Extraire la liste à partir de la ligne 6 de l'onglet Sélection avec le bouton Extraire de l'UserForm
• soit sélectionner la ligne dans l'onglet Extract en cliquant sur l'élément dans la ListBox1.

Tu peux faire des tests avec les mots avant, arrière et feu

La première colonne affiche le numéro de ligne de l'élément dans l'onglet Extract.

Le Code de l'UserForm :
Private S As Worksheet 'déclare la variable S (onglet Sélection)
Private E As Worksheet 'déclare la variable E (onglet Extract)
Private TV As Variant 'déclare la variable TV (Tableau des valeurs)
Private NL As Long 'déclare la variable NL (Nombre de Lignes)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Private TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Private Sub UserForm_Initialize() 'à l'initialisation de l'Userorm
Set S = Sheets("Sélection") 'définit l'onglet S
Set E = Sheets("Extract") 'définit l'onglet E
TV = E.Range("A2:N1142") 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonnes de la ListBox1 (une de plus que TV)
End Sub

Private Sub Constat_Change() 'au changement dans [Constat]
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Long 'déclare la variable K (incrément)

Me.ListBox1.Clear 'vide la ListBox1
'si la textbox [Constat] est effacée efface la Label2, sort de la procédure
If Me.Constat.Value = "" Then Exit Sub
K = 1 'initialise la variable K
For I = 1 To NL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV
    'condition : si le texte tapé dans [Constat] est contenu dans la donnée ligne I colonne 9 (=> colonne J) de TV
    If InStr(1, TV(I, 9), Me.Constat, vbTextCompare) <> 0 Then
        ReDim Preserve TL(1 To NC + 1, 1 To K) 'redimensionne le tableau des lignes TL
        TL(1, K) = I + 1 'récupère dans la première ligne de TL le numéro de ligne correspondant
        For J = 1 To NC 'boucle 2 : sur toutes les colonnes du tableau des valeurs TV
            TL(J + 1, K) = TV(I, J) 'récupère dans : ligne J+1 colonne K de TL, la valeur de la données ligne I colonne J de TV (Transposition)
        Next J 'prochaine colonne de la boucle 2
        K = K + 1 'incrémente K (rajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 1 Then 'si K est supérieure à 1 (au moins une occurrence trouvée)
    If K = 2 Then ReDim Preserve TL(1 To NC + 1, 1 To 2) 'si une seule occurrence trouvée, redimensionne TL pour un affichage en ligne
    Me.ListBox1.List = Application.Transpose(TL) 'alimente la ListBox1 avec le trableau TL transposé
    'renseigne le mnombre de lignes dans la Label 2
End If
End Sub

Private Sub ListBox1_Click() 'au clic dans la ListBox1
E.Select 'délectionne l'onglet E
With ListBox1 'prend en compte la ListBox1
    'récupère le numéro de ligne de l'élément sélectionné
    E.Rows(CLng(.Column(0, .ListIndex))).Select 'sélectionne la ligne de l'élément sélectionné
End With 'fin de la prise en compte de la ListBox1
Unload Me 'vide et ferme l'UserFormn1
End Sub

Private Sub CommandButton1_Click() 'bouton "Extraire"
'renvoie dans la celluel A6 (redimensionné) de l'onglet S le tableau TL transposé
S.Range("A6").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
Unload Me 'vide et ferme l'UserFormn1
End Sub
Private Sub CommandButton2_Click()
Unload Me 'vide et ferme l'UserFormn1
End Sub


Le code du bouton Extraire de l'onglet Sélection :
Private Sub CommandButton1_Click()
Dim PL As Range 'déclare la variable PL

Set PL = Range("A5").CurrentRegion 'définit la plage PL
If Range("A6") <> "" Then
    Set PL = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, PL.Columns.Count) 'redéfinit la plage PL (sans la première ligne
    PL.ClearContents 'efface d'éventuelles anciennes données
End If
ActiveCell.Select 'enlève le focus au bouton
UserForm1.Show 'affiche l'UserForm1
End Sub


Le Fichier :

https://www.cjoint.com/c/FDztJ22yjER

Le fichier :

1
PhenlKs Messages postés 16 Date d'inscription lundi 25 avril 2016 Statut Membre Dernière intervention 6 mars 2018
26 avril 2016 à 09:52
Merci ThauTheme, ça répond exactement à mon problème. En fait entre temps j'ai réussi à faire fonctionner mon programme avec une fonction Find (c'est une vrai usine à gaz mais ça tourne) mais comme beaucoup de choses s'imbriquent (j'ai en réalité 2 critères et une liste d'équipements) je vais garder ce que j'ai fait.
Par contre j'ai un autre classeur où là je n'ai qu'un critère de recherche et où je vais donc essayer d'utiliser ton code (qui est quand même bien plus présentable et peaufiné).

Et encore merci pour le temps que tu y as passé.

See u
PhenlKs
0