Problème avec macro de recherche de lignes
Dernière réponse : dans Programmation
Bonjour tt le monde , je reviens vers vous car j'ai encore un petit souci avec ma macro.( enfin une macro qu'une persone de votre site a ienvoulu nous faire [^^happy17] )
la voila:
Sub search1()
Dim i As Integer
Dim MaVariable1 As String
MaVariable1 = "Chaine de caractères recherchée"
' Boucle de recherche par ligne sur la colonne A
For i = 1 To 537
With Worksheets(1).Activate
If .Cells(i, 1).Value = MaVariable1 Then
Rows(i).Select ' Selection de la ligne
Selection.Copy 'copie de la selection
Sheets(2).Select 'changement de feuille
Rows("1:1").Select 'Selection de la première ligne
Selection.Insert Shift:=xlDown 'Insertion de la selection copier
End If
End With
Next i
End Sub
J'ai TROIS problèmes :
1- elle ne marche pas quand je la lance sur mon fichier Excel devrais-je spécifier un chemin pour le fichier ouvert ou autre?
2- cette macro fait la recherche à partir d'un mot clé Mavariable1 , comment pourrais-je lui faire faire la recherche mais avec plusieurs mots clé car j'ai des lignes qui contiennent differents mots clé que je souhaites extraire...
3- Le mot clé recherché est dans une cellule qui se présente comme cela (mot clé ,'valeur') pourrais-je faire la recherche sur ce mot clé mais extraire toute la cellule avec la valeur a coté?
Merci bc
la voila:
Sub search1()
Dim i As Integer
Dim MaVariable1 As String
MaVariable1 = "Chaine de caractères recherchée"
' Boucle de recherche par ligne sur la colonne A
For i = 1 To 537
With Worksheets(1).Activate
If .Cells(i, 1).Value = MaVariable1 Then
Rows(i).Select ' Selection de la ligne
Selection.Copy 'copie de la selection
Sheets(2).Select 'changement de feuille
Rows("1:1").Select 'Selection de la première ligne
Selection.Insert Shift:=xlDown 'Insertion de la selection copier
End If
End With
Next i
End Sub
J'ai TROIS problèmes :
1- elle ne marche pas quand je la lance sur mon fichier Excel devrais-je spécifier un chemin pour le fichier ouvert ou autre?
2- cette macro fait la recherche à partir d'un mot clé Mavariable1 , comment pourrais-je lui faire faire la recherche mais avec plusieurs mots clé car j'ai des lignes qui contiennent differents mots clé que je souhaites extraire...
3- Le mot clé recherché est dans une cellule qui se présente comme cela (mot clé ,'valeur') pourrais-je faire la recherche sur ce mot clé mais extraire toute la cellule avec la valeur a coté?
Merci bc
Autres pages sur : probleme macro recherche lignes
Lassé par la pub ? Créez un compte
Meilleure solution
Re-Salut,
Tu reviens vers nous !
Ben t'es qui toi, alors, si t'es pas un nouveau ?
Qui t'a pondu un code aussi horrible ? Beurk
En plus, il ne peut pas fonctionner.
Entrez-vous tous ça dans le crâne (toi, les autres, débutants, anciens, tous) :
On ne touche pas au presse-papier qui ne doit contenir que des données que l'utilisateur y a mis lui-même !!!!
Et puis c'est quoi cette façon de ne pas indenter ton code. C'est immonde, odieux, irrespectueux.... (ça se sent là, que je n'aime pas ça ?)
Je refais ton code, pour qu'il fonctionne
:
Bon. Maintenant, si tu as plusieurs mots-clef, un truc tout bête est de mettre une autre condition dans ton If .. Then, joint à la première par un Or. Reste à savoir si tu as un nombre fixe de conditions.
Quant à ton point trois, je n'ai rien compris.
Tu reviens vers nous !
Ben t'es qui toi, alors, si t'es pas un nouveau ?
Qui t'a pondu un code aussi horrible ? Beurk
En plus, il ne peut pas fonctionner.
Entrez-vous tous ça dans le crâne (toi, les autres, débutants, anciens, tous) :
On ne touche pas au presse-papier qui ne doit contenir que des données que l'utilisateur y a mis lui-même !!!!
Et puis c'est quoi cette façon de ne pas indenter ton code. C'est immonde, odieux, irrespectueux.... (ça se sent là, que je n'aime pas ça ?)
Je refais ton code, pour qu'il fonctionne
:
Dim cellule As Range For Each cellule In Worksheets(1).Range("A1:A537") If cellule.Value = MaVariable1 Then Worksheets(2).Rows(1).Insert cellule.EntireRow.Copy Worksheets(2).Rows(1) End If Next
Bon. Maintenant, si tu as plusieurs mots-clef, un truc tout bête est de mettre une autre condition dans ton If .. Then, joint à la première par un Or. Reste à savoir si tu as un nombre fixe de conditions.
Quant à ton point trois, je n'ai rien compris.
Bonjour tt le monde , je reviens vers vous car j'ai encore un petit souci avec ma macro.( enfin une macro qu'une persone de votre site a ienvoulu nous faire [^^happy17] )
la voila:
J'ai TROIS problèmes :
1- elle ne marche pas quand je la lance sur mon fichier Excel devrais-je spécifier un chemin pour le fichier ouvert ou autre?
2- cette macro fait la recherche à partir d'un mot clé Mavariable1 , comment pourrais-je lui faire faire la recherche mais avec plusieurs mots clé car j'ai des lignes qui contiennent differents mots clé que je souhaites extraire...
3- Le mot clé recherché est dans une cellule qui se présente comme cela (mot clé ,'valeur') pourrais-je faire la recherche sur ce mot clé mais extraire toute la cellule avec la valeur a coté?
Merci bc
la voila:
Sub search1()
Dim i As Integer
Dim MaVariable1 As String
MaVariable1 = "Chaine de caractères recherchée"
' Boucle de recherche par ligne sur la colonne A
For i = 1 To 537
With Worksheets(1).Activate
If .Cells(i, 1).Value = MaVariable1 Then
Rows(i).Select ' Selection de la ligne
Selection.Copy 'copie de la selection
Sheets(2).Select 'changement de feuille
Rows("1:1" ).Select 'Selection de la première ligne
Selection.Insert Shift:=xlDown 'Insertion de la selection copier
End If
End With
Next i
End Sub
J'ai TROIS problèmes :
1- elle ne marche pas quand je la lance sur mon fichier Excel devrais-je spécifier un chemin pour le fichier ouvert ou autre?
2- cette macro fait la recherche à partir d'un mot clé Mavariable1 , comment pourrais-je lui faire faire la recherche mais avec plusieurs mots clé car j'ai des lignes qui contiennent differents mots clé que je souhaites extraire...
3- Le mot clé recherché est dans une cellule qui se présente comme cela (mot clé ,'valeur') pourrais-je faire la recherche sur ce mot clé mais extraire toute la cellule avec la valeur a coté?
Merci bc
Merci pour l'effort de me répondre.Mais:
Pourquoi être si desagréable en répondant aux demandes des gens?? Je ne vois pas où est le problème avec le fait de dire je reviens vers vous!!! Et puis pour le code j'ai pris ta remarque en compte et je l'ai remis en forme.
C'est dommage car j'espérais que c'était toi qui allait me répondre mais pas de cette manière...
Bref je te remercie pour ton aide
Pourquoi être si desagréable en répondant aux demandes des gens?? Je ne vois pas où est le problème avec le fait de dire je reviens vers vous!!! Et puis pour le code j'ai pris ta remarque en compte et je l'ai remis en forme.
C'est dommage car j'espérais que c'était toi qui allait me répondre mais pas de cette manière...
Bref je te remercie pour ton aide
Oups, je ne pensais pas être désagréable.
Mais j'insiste : t'es nouveau ici ou pas ?
Si t'es nouveau, tu viens à nous et, il faut que je te souhaite la bienvenue.
Si t'es pas nouveau, tu reviens à nous, mais alors comment ça se fait que tu te sois inscrit aujourd'hui et que tu n'aies que 3 messages (4 maintenant) à ton actif ? Si tu as changé de pseudo, c'est peut être l'occasion de le dire. Ça me permettrait de retrouver le topic précédent d'où tu tires ton exemple.
Pour la remarque sur la mise en forme, tu remarqueras que j'ai changé le smiley (peut-on encore parle de smiley
) ce qui prouve bien que j'ai pris bonne note de ton effort : le nouveau smiley dit merci.
Donc, ton code avait deux problèmes, un sur la forme, l'autre sur le fond. Pour la forme, tu as corrigé. C'est réglé. Pour le fond..... rolala, mais quelle horreur c'était. Là, c'est moi qui ai corrigé. C'est donc aussi réglé, surtout si tu prends la peine de bien comprendre ce que je t'ai proposé. En plus t'as vu je n'avais pas dit que tu étais mauvais ou autre méchanceté, j'avaisi demandé qui avait osé te proposer ça
Or donc, je vais continuer à vous aider (toi et les autres), sur le ton qui me plaît et que je te demanderai de ne pas prendre pour volontairement désagréable.
T'as quelques questions auxquelles répondre pour que je puisse continuer à t'aider.
Mais j'insiste : t'es nouveau ici ou pas ?
Si t'es nouveau, tu viens à nous et, il faut que je te souhaite la bienvenue.
Si t'es pas nouveau, tu reviens à nous, mais alors comment ça se fait que tu te sois inscrit aujourd'hui et que tu n'aies que 3 messages (4 maintenant) à ton actif ? Si tu as changé de pseudo, c'est peut être l'occasion de le dire. Ça me permettrait de retrouver le topic précédent d'où tu tires ton exemple.
Pour la remarque sur la mise en forme, tu remarqueras que j'ai changé le smiley (peut-on encore parle de smiley
) ce qui prouve bien que j'ai pris bonne note de ton effort : le nouveau smiley dit merci.
Donc, ton code avait deux problèmes, un sur la forme, l'autre sur le fond. Pour la forme, tu as corrigé. C'est réglé. Pour le fond..... rolala, mais quelle horreur c'était. Là, c'est moi qui ai corrigé. C'est donc aussi réglé, surtout si tu prends la peine de bien comprendre ce que je t'ai proposé. En plus t'as vu je n'avais pas dit que tu étais mauvais ou autre méchanceté, j'avaisi demandé qui avait osé te proposer ça
Or donc, je vais continuer à vous aider (toi et les autres), sur le ton qui me plaît et que je te demanderai de ne pas prendre pour volontairement désagréable.
T'as quelques questions auxquelles répondre pour que je puisse continuer à t'aider.
Merci Zeb,
Je suis nouveau sur le forum et sur tous les forums en général donc je m'en excuse si j'étais non courtois.
Donc je viens vers vous ...
Autrement , je te remercie pour avoir corriger le code que j'ai posté et ta nouvelles version marche à merveille
Je reviendrai vers toi pour une autre question sur un autre bout de code que j'ai et cette fois je ferais attention à ce que sa soit nickel
Merci encore Zeb et à tous les membres de ce forum
Je suis nouveau sur le forum et sur tous les forums en général donc je m'en excuse si j'étais non courtois.
Donc je viens vers vous ...
Autrement , je te remercie pour avoir corriger le code que j'ai posté et ta nouvelles version marche à merveille
Je reviendrai vers toi pour une autre question sur un autre bout de code que j'ai et cette fois je ferais attention à ce que sa soit nickel
Merci encore Zeb et à tous les membres de ce forum
oki sa sera fait juste après cette question
maintenant j'ai cette macro :
Donc cette macro recherche à partir de NIR1.txt dans le fichier RAF1.txt , ce que je veux c'est lui spécifier un répertoire RAF ( qui contient plusieurs fichiers RAF*.txt) et faire la même recherche dedans.
J'ai fais un essai mais sa ne donne rien
J'espère que je suis assez clair sur ce point
Merci zeb
maintenant j'ai cette macro :
Sub test() Workbooks.OpenText Filename:= _ "D:\Users\woow\Desktop\RAF1.txt" Workbooks.OpenText Filename:= _ "D:\Users\woow\Desktop\NIR1.txt" Columns("A:A").Select Selection.NumberFormat = "0" Sheets.Add ActiveSheet.Name = "Resultat" i = 1 For j = 2 To 16 valeur = Workbooks("NIR1.txt").Sheets("NIR1").Cells(j, 1) Workbooks("RAF1.txt").Activate Set celluletrouvee = Range("A:A").Find(valeur) ligne = celluletrouvee.Row Do Workbooks("NIR1.txt").Sheets("Resultat").Cells(i, 1) = Workbooks("RAF1.txt").Sheets("RAF1").Cells(ligne, 1) i = i + 1 ligne = ligne + 1 Loop Until (Left(Workbooks("RAF1.txt").Sheets("RAF1").Cells(l igne, 1), 14)) = "S30.G01.00.001" Next End End Sub
Donc cette macro recherche à partir de NIR1.txt dans le fichier RAF1.txt , ce que je veux c'est lui spécifier un répertoire RAF ( qui contient plusieurs fichiers RAF*.txt) et faire la même recherche dedans.
J'ai fais un essai mais sa ne donne rien
J'espère que je suis assez clair sur ce point
Merci zeb
code résultat pour le premier post :
voila pour tout le monde
Dim cellule As Range
For Each cellule In Worksheets(1).Range("A1:A537" )
If cellule.Value = "S30.G01.00.001" Or cellule.Value = "S30.G01.00.008.010" Or cellule.Value = "S30.G01.00.009" Or cellule.Value = "S41.G01.00.011.001" Or cellule.Value = "S41.G01.00.001" Or cellule.Value = "S41.G01.00.003" Or cellule.Value = "S53.G01.00.009.001" Or cellule.Value = "S53.G01.00.010.001" Then
Worksheets(2).Rows(1).Insert
cellule.EntireRow.Copy Worksheets(2).Rows(1)
End If
Next
voila pour tout le monde
Salut,
Pour bien faire les choses, je t'intime l'ordre d'éradiquer de toutes tes macros la moindre sélection, la moindre activation.
(Non, non, je ne suis pas autoritaire
)
Déclare toutes tes variables. Pour être sûr de ne pas en oublier, utile l'Option Explicit.
Respecte l'indentation. C'est un des commandements du programmeur.
Ces crétins de chez MS n'ont pas fini le boulot, le modèle objet d'Excel est imparfait.
Par exemple, Workbooks.Open() renvoie bien un Workbook, mais Workbooks.OpenText() ne le fait pas.
Et on est obligé de se fier à ce qui est actif ou pas, en cours de programmation. C'est du grand n'importe quoi.
Alors je comprends très bien que tu ne te sente pas morveux quand toi aussi tu actives des classeurs pour y accéder.
Pour référencer tes classeurs par des variables, je te propose donc soit d'utiliser Open(), soit d'agir dès l'ouverture par OpenText().
Pour que ce code reste le tien, on reste avec OpenText().
Les colonnes "A:A", c'est la colonne "A". (Ligne 6). Moi, je préfère dire que c'est la colonne 1. Mais bon.
Pas de Truc.Select/Selection.Machin. Ecris Truc.Machin directement (lignes 7, 8).
Mets tous tes nouveaux objets dans des variables (ligne 9).
Si tu t'intéresses à une cellule, précise bien que c'est le texte ou la valeur qui t'intéresse (lignes 13, 18, 21).
Puisque tu utilises des feuilles de calcul, sois précis, écris Worksheet et non pas simplement Sheet.
Ça donne :
Bon, les 15 premières lignes sont de la préparation. On va augmenter ça. Plus on en fait en dehors de la boucle pour en faire moins à l'intérieur, mieux c'est.
En plus, tes histoires de i, j, ligne, etc, ça m'embête un peu. Pourquoi ne pas réfléchir en terme de cellule directement plutôt qu'en coordonnées ?
Regarde :
Dis-donc, je relis ce code, et je me dis qu'il doit y avoir un lien fort entre cel_cherchee.Value et S30.G01.00.001. T'est sûr que c'est bon de mettre ça en dur ?
Or donc, après factorisation du code et utilisation de variables, il n'y a plus qu'à un seul endroit où on fait référence au nom du fichier. Ca devient facile à changer, non ?
Pour parcourir les fichiers d'un dossier, intéresse-toi à la bibliothèque FileSystemObject. Je te laisse chercher un peu, pour ne pas te gâcher le plaisir. (tips: regarde parmi les derniers topics
)
Pour bien faire les choses, je t'intime l'ordre d'éradiquer de toutes tes macros la moindre sélection, la moindre activation.
(Non, non, je ne suis pas autoritaire
)Déclare toutes tes variables. Pour être sûr de ne pas en oublier, utile l'Option Explicit.
Respecte l'indentation. C'est un des commandements du programmeur.
Ces crétins de chez MS n'ont pas fini le boulot, le modèle objet d'Excel est imparfait.
Par exemple, Workbooks.Open() renvoie bien un Workbook, mais Workbooks.OpenText() ne le fait pas.
Et on est obligé de se fier à ce qui est actif ou pas, en cours de programmation. C'est du grand n'importe quoi.
Alors je comprends très bien que tu ne te sente pas morveux quand toi aussi tu actives des classeurs pour y accéder.
Pour référencer tes classeurs par des variables, je te propose donc soit d'utiliser Open(), soit d'agir dès l'ouverture par OpenText().
Pour que ce code reste le tien, on reste avec OpenText().
Les colonnes "A:A", c'est la colonne "A". (Ligne 6). Moi, je préfère dire que c'est la colonne 1. Mais bon.
Pas de Truc.Select/Selection.Machin. Ecris Truc.Machin directement (lignes 7, 8).
Mets tous tes nouveaux objets dans des variables (ligne 9).
Si tu t'intéresses à une cellule, précise bien que c'est le texte ou la valeur qui t'intéresse (lignes 13, 18, 21).
Puisque tu utilises des feuilles de calcul, sois précis, écris Worksheet et non pas simplement Sheet.
Ça donne :
Dim wb_RAF1 As Workbook Dim wb_NIR1 As Workbook Dim ws_resultat As Worksheet Dim celluletrouvee As Range Dim i As Long Dim j As Long Dim ligne As Long Dim valeur As String Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt" Set wb_RAF1 = ActiveWorkbook Workbooks.OpenText Filename:="D:\Users\woow\Desktop\NIR1.txt" Set wb_NIR1 = ActiveWorkbook wb_NIR1.Worksheets("NIR1").Columns(1).NumberFormat = "0" Set ws_resultat = wb_NIR1.Worksheets.Add ws_resultat.Name = "Resultat" i = 1 For j = 2 To 16 valeur = wb_NIR1.Worksheets("NIR1").Cells(j, 1).Value Set celluletrouvee = wb_RAF1.Worksheets("RAF1").Columns(1).Find(valeur) ligne = celluletrouvee.Row Do ws_resultat.Cells(i, 1).Value = wb_RAF1.Worksheets("RAF1").Cells(ligne, 1).Value i = i + 1 ligne = ligne + 1 Loop Until (Left(wb_RAF1.Sheets("RAF1").Cells(ligne, 1).Text, 14)) = "S30.G01.00.001" Next
Bon, les 15 premières lignes sont de la préparation. On va augmenter ça. Plus on en fait en dehors de la boucle pour en faire moins à l'intérieur, mieux c'est.
En plus, tes histoires de i, j, ligne, etc, ça m'embête un peu. Pourquoi ne pas réfléchir en terme de cellule directement plutôt qu'en coordonnées ?
Regarde :
Dim wb_RAF1 As Workbook Dim wb_NIR1 As Workbook Dim sb_RAF1 As Worksheet Dim sb_NIR1 As Worksheet Dim ws_resultat As Worksheet Dim cel_cherchee As Range Dim cel_trouvee As Range Dim cel_resultat As Range Workbooks.OpenText Filename:="D:\Users\woow\Desktop\NIR1.txt" Set wb_NIR1 = ActiveWorkbook Set ws_NIR1 = wb_NIR1.Worksheets(1) ws_NIR1.Columns(1).NumberFormat = "0" Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt" Set wb_RAF1 = ActiveWorkbook Set ws_RAF1 = wb_RAF1.Worksheets(1) Set ws_resultat = wb_NIR1.Worksheets.Add ws_resultat.Name = "Resultat" Set cel_resultat = ws_resultat.Range("A1") For Each cel_cherchee In ws_NIR1.Range("A2:A16") Set cel_trouvee = ws_RAF1.Columns(1).Find(cel_cherchee.Value) Do cel_resultat.Value = cel_trouvee.Value Set cel_resultat = cel_resultat.Offset(1) Set cel_trouvee = cel_trouvee.Offset(1) Loop Until (Left(cel_trouvee.Text, 14)) = "S30.G01.00.001" Next
Dis-donc, je relis ce code, et je me dis qu'il doit y avoir un lien fort entre cel_cherchee.Value et S30.G01.00.001. T'est sûr que c'est bon de mettre ça en dur ?
Or donc, après factorisation du code et utilisation de variables, il n'y a plus qu'à un seul endroit où on fait référence au nom du fichier. Ca devient facile à changer, non ?
Pour parcourir les fichiers d'un dossier, intéresse-toi à la bibliothèque FileSystemObject. Je te laisse chercher un peu, pour ne pas te gâcher le plaisir. (tips: regarde parmi les derniers topics
)
Bonjour Zeb , bonjour le forum
Je reviens vers vous pour la suite de mon histoire ...(j'ai cherché pour avoir plus d'informations sur FSO mais ...
)
Je n'arrive pas à voir comment je pourrai changer ces lignes de code pour dire à ma macro qu'elle cherche dans un dossier et non dans un fichier , voila les lignes qui me causent problème :
please help Zeb , Help le forum , je sais que c'est simple pour vous mais pour moi j'ai l'impression que je suis entrain de developper une énorme application
______________
EDIT: t'as fini de laisser ton nom dans les chemins gros malin ! Puisque tu t'appelles woow, c'est D:\USER\woow picétou
Je reviens vers vous pour la suite de mon histoire ...(j'ai cherché pour avoir plus d'informations sur FSO mais ...
)Je n'arrive pas à voir comment je pourrai changer ces lignes de code pour dire à ma macro qu'elle cherche dans un dossier et non dans un fichier , voila les lignes qui me causent problème :
Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt" Set wb_RAF1 = ActiveWorkbook Set ws_RAF1 = wb_RAF1.Worksheets(1)
please help Zeb , Help le forum , je sais que c'est simple pour vous mais pour moi j'ai l'impression que je suis entrain de developper une énorme application
______________
EDIT: t'as fini de laisser ton nom dans les chemins gros malin ! Puisque tu t'appelles woow, c'est D:\USER\woow picétou
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumMacro recherche fichier
- ForumMacro recherche valeurs
- ForumMacro recherche plage
- ForumMacro recherche ligne
- ForumMacro recherche cellule
- ForumMacro recherche valeur excel
- ForumMacro recherche vba excel
- ForumInsertion plusieurs lignes avec une macro
- ForumMacro recherche cellule et copier coller ligne
- ForumMacro compter les lignes
- Voir plus
