Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rechercher un mot dans un tableau

15 réponses
Avatar
Apitos
Bonjour =C3=A0 tous,

J'aimerais trouver une sous-chaines dans un tableau de type variant.

Une fois trouv=C3=A9e, on devra r=C3=A9cup=C3=A9rer tous les num=C3=A9ros c=
orrespondants.

J'ai essay=C3=A9 avec Application.Match et Application.Index, mais j'ai tou=
jours une errer 2048 :

p =3D Application.Match(x, Application.Index(a, , 1), 0)

p =3D Application.Match(x, a, 1)

Un exemple en PJ.

http://www.cjoint.com/c/GFvl6RogezA

Merci d=E2=80=99avance.

10 réponses

1 2
Avatar
MichD
Bonjour,
Soit un tableau "T" dans lequel tu recherches un "Mot" d'une chaîne de caractère
"Mot" et "T" sont des variables.
X = application.Match("*" & mot & "*", T, 0)
MichD
Avatar
Apitos
Bonjour MichD,
Avec mot="sc1"
Sub rechercheTb()
Dim Mot As String
T = [A2:A30]
For i = LBound(a) To UBound(a)
' Si H1 = Tous récupérer tous les numéros
' Si H1 = une sous-chaine à rechercher alors
' Récupérer seulement les sous-chaines identiques
' avec leurs numéros correspondants
Mot = [H1]
X = Application.Match("*" & Mot & "*", T, 0)
Next
End Sub
X sera égal à 1, soit la première occurrence dans le tableau .
Comment faire pour retrouver le reste des occurrences ?
Merci.
Avatar
MichD
Essaie comme ceci :
'--------------------------------------------
Sub rechercheTb()
Dim Mot As String
Mot = "sc1"
T = [A2:A30]
For i = LBound(A) To UBound(A)
Mot = [H1]
If InStr(1, A(1), Mot, vbTextCompare) > 0 Then
MsgBox "Le " & Mot & " est présent dans la chaîne " & A(1) & _
". Il se retrouve au " & i & "rang."
End If
Next
End Sub
'--------------------------------------------
MichD
"Apitos" a écrit dans le message de groupe de discussion :
Bonjour MichD,
Avec mot="sc1"
Sub rechercheTb()
Dim Mot As String
T = [A2:A30]
For i = LBound(a) To UBound(a)
' Si H1 = Tous récupérer tous les numéros
' Si H1 = une sous-chaine à rechercher alors
' Récupérer seulement les sous-chaines identiques
' avec leurs numéros correspondants
Mot = [H1]
X = Application.Match("*" & Mot & "*", T, 0)
Next
End Sub
X sera égal à 1, soit la première occurrence dans le tableau.
Comment faire pour retrouver le reste des occurrences ?
Merci.
Avatar
Apitos
Bonjour,
J'ai essayé de traiter le cas ou mot = "tous", mais je n'arrive pas encore !
Avatar
MichD
Tu as bien raison. Toutes mes excuses!
Lorsqu'un tableau (array) représente une plage de cellules,
le tableau a 2 dimensions ( lignes, colonnes) comme l'adresse d'une cellule.
'------------------------------------------------------------------
Sub rechercheTb()
Dim Mot As String
Dim T() ' As Variant
'Adapte le nom de l'onglet de la feuille
With Worksheets("Feuil1")
'L'Expression cherchée
Mot = .Range("H1")
'Dans le tableau suivant
T = .Range("A2:A30").Value
End With
For i = LBound(T, 1) To UBound(T, 1)
If InStr(1, T(i, 1), Mot, vbTextCompare) > 0 Then
MsgBox "Le """ & Mot & """ est présent dans la chaîne """ & _
T(i, 1) & """. Il se retrouve au " & i & " rang."
End If
Next
End Sub
'------------------------------------------------------------------
MichD
Avatar
Apitos
Oui, j'ai réglé l'erreur du tableau (L'indice n'appartient pas à la sélection) car il faut l’écrire en deux dimensi ons : T(i,1)
Mais comment écrire un code pour traiter le cas ou mot = "tous"
'------------
Sub RechercheTb()
Dim mot As String, rL1, rL2
Dim i As Integer, Lastrw As Long, plg As Range, c As Range, cc As Range
Set rL1 = CreateObject("System.Collections.ArrayList")
Set rL2 = CreateObject("System.Collections.ArrayList")
mot = Sheets("Feuil1").Range("H1")
Lastrw = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
Range("K2:L" & Lastrw).ClearContents
a = Sheets("Feuil1").Range("A2:A" & Lastrw)
If mot <> "tous" Then
For i = LBound(a) To UBound(a)
If InStr(1, a(i, 1), mot) > 0 Then
rL1.Add i 'c.Row
End If
Next
End If
r = rL1.Toarray()
' Si mot = "tous" alors ?
For j = LBound(r) To UBound(r)
For k = r(j) + 1 To UBound(a)
If IsNumeric(Split(a(k, 1), "L3-")(1)) Then
rL2.Add Mid(a(k, 1), 4, Len(a(k, 1)) - 3)
Else
GoTo nt:
End If
Next
nt:
Next
End Sub
'------------
http://www.cjoint.com/c/GFyataqbo6m
Avatar
MichD
Dans ton fichier, le contenu de la cellule H1 est : sc1
et non l'expression "tous".
Le contenu de chaque cellule de la plage A2:A27 contenant
l'expression de la cellule H1 est placé dans un tableau
(array) appelé R. Ce tableau n'a qu'une dimension.
Je t'ai donné un exemple quant à la manière de récupérer
dans une plage de cellule le contenu du tableau R.
Si tu veux autre chose, il faudra que tu sois plus explicite.
'--------------------------------------------------------------------
Sub rechercheTb_MichD()
Dim Mot As String
Dim T(), R(), Compteur As Long
'Adapte le nom de l'onglet de la feuille
With Worksheets("Feuil1")
'L'Expression cherchée
Mot = .Range("H1")
'Dans le tableau suivant
T = .Range("A2:A30").Value
End With
For i = LBound(T, 1) To UBound(T, 1)
If InStr(1, T(i, 1), Mot, vbTextCompare) > 0 Then
Compteur = Compteur + 1
ReDim Preserve R(1 To Compteur)
R(Compteur) = T(i, 1)
End If
Next
With Worksheets("Feuil1")
'Pour copier dans une colonne le contenu du tableau R
.Range("B1").Resize(UBound(R)) = Application.Transpose(T)
'Pour copier dans une ligne le contenu du tableau R
.Range("B1").Resize(, UBound(R)) = T
End With
End Sub
'--------------------------------------------------------------------
MichD
Avatar
MichD
Peux-tu me donner un exemple concret sur la finalité de la procédure?
Que veux-tu récupérer? La position, le contenu du texte à cette position, autre chose?
Au lieu de faire une boucle pour récupérer les positions et dans un second temps,
boucler sur le tableau ayant recueilli les positions pour extraire je ne sais pas quoi,
pourquoi ne pas faire une seule boucle et récupérer immédiatement ce que tu veux?
Pour faire cela, il faut savoir ce que tu veux obtenir à la fin de l'opération.
MichD
"Apitos" a écrit dans le message de groupe de discussion :
Bonjour MichD,
Dans ton fichier, le contenu de la cellule H1 est : sc1
et non l'expression "tous".

[H1] est une liste déroulante qui contient à titre d'exemple : "sc1", "sc2" et "tous".
L'exemple en pj est fournit à titre d'exemple.
Or dans mon fichier d'origine, je n'utilise pas les feuilles pour traiter et afficher le
résultat, puisque les données sont extraites d'un fichier texte et le résultat est lui aussi
écrit dans un fichier texte.
C'est pour ça que je n'utilise que les tableaux pour récupérer/écrire les données depuis/vers
un fichier texte.
Si je choisi depuis la liste déroulante:
- "sc1" : tous textes contenant ce mot, avec ces numéros correspondants au dessous devront être
traités et extraits.
- "sc2" : tous textes contenant ce mot, avec ces numéros au dessous correspondants devront être
traités et extraits.
- "tous" : tous les textes sans exception avec leurs numéros correspondants au dessous devront
être traités et extraits.
En premier, il faut déterminer les positions dans le premier tableau T du mot recherché.
Les positions sont sauvegardées dans le tableau R.
Après, on boucle sur le tableau R pour traiter chaque position et récupérer les numéros qui lui
appartient.
J’espère avoir bien exposé mon problème !
Merci.
------
Cordialement
Avatar
Apitos
Re,
En PJ, quatre fichiers texte.
Le premier (Source clients.txt) représente la source de données sur laquelle sera fait le traitement.
http://www.cjoint.com/c/GFyrjoIhL2N
Le nom de l’agence vient après le "< !", celui entre parenth èses représente la circonscription ou est située cette agenc e.
Les numéros à extraire viennent dans les lignes contenant le pr éfixe "LI3".
Une fois le fichier texte source parcouru ligne par ligne, le résultat de l’extraction est mis dans un tableau T. (Tableau T.txt)
http://www.cjoint.com/c/GFyriRI6FtN
Pour avoir un fichier texte selon un choix fais par circonscription, ici [T ET, MHI, FND et Tous], on parcourt le tableau T pour n’extraire que les agences avec leurs numéros appartenant à notre choix :
TET : fichier texte avec le nom (Clients TET.txt) http://www.cjoint.com/c/G FyrjTBc1bN
MHI : fichier texte avec le nom (Clients MHI.txt)
http://www.cjoint.com/c/GFyrkkuJ76N
FND : fichier texte avec le nom (Clients FND.txt)
http://www.cjoint.com/c/GFyrkMDU8dN
Tous : fichier texte avec le nom (Clients global.txt)
http://www.cjoint.com/c/GFyrk7dDIvN
Voila !
Avatar
MichD
Dans cette proposition, si tu veux obtenir le rang plutôt que la valeur,
modifie cette ligne de code comme ceci :
Remplace ceci R(Compteur) = T(i, 1) par R(Compteur) = i
Je n'ai pas beaucoup de temps pour revoir la totalité de l'approche...
'--------------------------------------------------------------------
Sub rechercheTb_MichD()
Dim Mot As String
Dim T(), R(), Compteur As Long
'Adapte le nom de l'onglet de la feuille
With Worksheets("Feuil1")
'L'Expression cherchée
Mot = .Range("H1")
'Dans le tableau suivant
T = .Range("A2:A30").Value
End With
For i = LBound(T, 1) To UBound(T, 1)
If InStr(1, T(i, 1), Mot, vbTextCompare) > 0 Then
Compteur = Compteur + 1
ReDim Preserve R(1 To Compteur)
R(Compteur) = T(i, 1)
End If
Next
With Worksheets("Feuil1")
'Pour copier dans une colonne le contenu du tableau R
.Range("B1").Resize(UBound(R)) = Application.Transpose(T)
'Pour copier dans une ligne le contenu du tableau R
.Range("B1").Resize(, UBound(R)) = T
End With
End Sub
'--------------------------------------------------------------------
MichD
1 2