Rechercher un mot dans un tableau

Le
Apitos
Bonjour à tous,

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

Une fois trouvée, on devra récupérer tous les numéros c=
orrespondants.

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

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

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

Un exemple en PJ.

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

Merci d’avance.
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichD
Le #26436436
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
Apitos
Le #26436482
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.
MichD
Le #26436533
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.
Apitos
Le #26436572
Bonjour,
J'ai essayé de traiter le cas ou mot = "tous", mais je n'arrive pas encore !
MichD
Le #26436573
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
Apitos
Le #26436574
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
MichD
Le #26436584
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
MichD
Le #26436595
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
Apitos
Le #26436602
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 !
MichD
Le #26436687
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
Publicité
Poster une réponse
Anonyme