Votre question
Résolu

Problème avec macro de recherche de lignes

Tags :
  • Select
  • Programmation
  • VB
Dernière réponse : dans Programmation
24 Février 2011 11:12:48

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

Autres pages sur : probleme macro recherche lignes

a b L Programmation
24 Février 2011 11:26:12

Bonjour,

Merci de mettre ton message en forme, conformément au règlement.
m
0
l
24 Février 2011 11:44:33

j'attendais que tu me répondes Zeb mais là je t'avoue que je ne vois pas comment je pourrais modifier mon message, de ton point de vue , quel est le problème avec mon post que je le modifie? :) 
m
0
l
Contenus similaires
a b L Programmation
24 Février 2011 11:47:24

Rhoooo... :/ 

m
0
l
24 Février 2011 12:02:29

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:
  1. Sub search1()
  2. Dim i As Integer
  3. Dim MaVariable1 As String
  4.  
  5. MaVariable1 = "Chaine de caractères recherchée"
  6.  
  7. ' Boucle de recherche par ligne sur la colonne A
  8. For i = 1 To 537
  9. With Worksheets(1).Activate
  10. If .Cells(i, 1).Value = MaVariable1 Then
  11. Rows(i).Select ' Selection de la ligne
  12. Selection.Copy 'copie de la selection
  13. Sheets(2).Select 'changement de feuille
  14. Rows("1:1" ).Select 'Selection de la première ligne
  15. Selection.Insert Shift:=xlDown 'Insertion de la selection copier
  16. End If
  17. End With
  18. Next i
  19. 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

m
0
l

Meilleure solution

a b L Programmation
24 Février 2011 13:12:42

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 :vomi: 
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 :whistle:  :
  1. Dim cellule As Range
  2.  
  3. For Each cellule In Worksheets(1).Range("A1:A537")
  4. If cellule.Value = MaVariable1 Then
  5. Worksheets(2).Rows(1).Insert
  6. cellule.EntireRow.Copy Worksheets(2).Rows(1)
  7. End If
  8. 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. :/ 
partage
24 Février 2011 13:36:30

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 :) 
m
0
l
a b L Programmation
24 Février 2011 14:03:24

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 :sarcastic:  ) ce qui prouve bien que j'ai pris bonne note de ton effort : le nouveau smiley dit merci. :jap: 

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 :o 

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.
m
0
l
24 Février 2011 14:59:43

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 ... :D 
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
m
0
l
a b L Programmation
24 Février 2011 15:49:29

Oki

Eh, mais c'est pas fini !!!!!!!!!!!!!!
As-tu réussi à mettre plusieurs mots de recherche ?
Et ton histoire de (mot clé ,'valeur') ?
m
0
l
24 Février 2011 16:02:43

wi c'est bon j'ai réussi à mettre autant de mots de recherche que je voulais et pour l'histoire du 'mot clé ,'valeur') c'était juste pour la présentation donc j'ai fais un split voila :D 
m
0
l
a b L Programmation
24 Février 2011 16:16:01

Oki.

Pour la postérité, deux choses :

1°) Publie ton code résultat. Ainsi tout le monde pourra profiter de la solution.
2°) Choisis la moins mauvaise réponse comme étant la meilleure, ça passera le topic en résolu.
m
0
l
24 Février 2011 16:29:34

oki sa sera fait juste après cette question :) 

maintenant j'ai cette macro :
  1. Sub test()
  2.  
  3. Workbooks.OpenText Filename:= _
  4. "D:\Users\woow\Desktop\RAF1.txt"
  5. Workbooks.OpenText Filename:= _
  6. "D:\Users\woow\Desktop\NIR1.txt"
  7. Columns("A:A").Select
  8. Selection.NumberFormat = "0"
  9. Sheets.Add
  10. ActiveSheet.Name = "Resultat"
  11. i = 1
  12. For j = 2 To 16
  13. valeur = Workbooks("NIR1.txt").Sheets("NIR1").Cells(j, 1)
  14. Workbooks("RAF1.txt").Activate
  15. Set celluletrouvee = Range("A:A").Find(valeur)
  16. ligne = celluletrouvee.Row
  17. Do
  18. Workbooks("NIR1.txt").Sheets("Resultat").Cells(i, 1) = Workbooks("RAF1.txt").Sheets("RAF1").Cells(ligne, 1)
  19. i = i + 1
  20. ligne = ligne + 1
  21. Loop Until (Left(Workbooks("RAF1.txt").Sheets("RAF1").Cells(l igne, 1), 14)) = "S30.G01.00.001"
  22. Next
  23. End
  24. 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
m
0
l
24 Février 2011 16:30:11

Meilleure réponse sélectionnée par woow74.
m
0
l
24 Février 2011 16:33:31

code résultat pour le premier post :
  1. Dim cellule As Range
  2.  
  3. For Each cellule In Worksheets(1).Range("A1:A537" )
  4. 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
  5. Worksheets(2).Rows(1).Insert
  6. cellule.EntireRow.Copy Worksheets(2).Rows(1)
  7. End If
  8. Next

voila pour tout le monde :) 
m
0
l
24 Février 2011 17:06:32

zeb , à l'aiide s'il te plait... :D 
tu as pu regarder ce que j'ai posté ?
Merci
m
0
l
a b L Programmation
25 Février 2011 11:30:45

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 :o  )

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. :pfff: 
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 :
  1. Dim wb_RAF1 As Workbook
  2. Dim wb_NIR1 As Workbook
  3. Dim ws_resultat As Worksheet
  4. Dim celluletrouvee As Range
  5. Dim i As Long
  6. Dim j As Long
  7. Dim ligne As Long
  8. Dim valeur As String
  9.  
  10. Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt"
  11. Set wb_RAF1 = ActiveWorkbook
  12.  
  13. Workbooks.OpenText Filename:="D:\Users\woow\Desktop\NIR1.txt"
  14. Set wb_NIR1 = ActiveWorkbook
  15.  
  16. wb_NIR1.Worksheets("NIR1").Columns(1).NumberFormat = "0"
  17. Set ws_resultat = wb_NIR1.Worksheets.Add
  18. ws_resultat.Name = "Resultat"
  19.  
  20. i = 1
  21. For j = 2 To 16
  22. valeur = wb_NIR1.Worksheets("NIR1").Cells(j, 1).Value
  23.  
  24. Set celluletrouvee = wb_RAF1.Worksheets("RAF1").Columns(1).Find(valeur)
  25. ligne = celluletrouvee.Row
  26. Do
  27. ws_resultat.Cells(i, 1).Value = wb_RAF1.Worksheets("RAF1").Cells(ligne, 1).Value
  28. i = i + 1
  29. ligne = ligne + 1
  30. Loop Until (Left(wb_RAF1.Sheets("RAF1").Cells(ligne, 1).Text, 14)) = "S30.G01.00.001"
  31. 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 :
  1. Dim wb_RAF1 As Workbook
  2. Dim wb_NIR1 As Workbook
  3. Dim sb_RAF1 As Worksheet
  4. Dim sb_NIR1 As Worksheet
  5. Dim ws_resultat As Worksheet
  6. Dim cel_cherchee As Range
  7. Dim cel_trouvee As Range
  8. Dim cel_resultat As Range
  9.  
  10. Workbooks.OpenText Filename:="D:\Users\woow\Desktop\NIR1.txt"
  11. Set wb_NIR1 = ActiveWorkbook
  12. Set ws_NIR1 = wb_NIR1.Worksheets(1)
  13. ws_NIR1.Columns(1).NumberFormat = "0"
  14.  
  15. Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt"
  16. Set wb_RAF1 = ActiveWorkbook
  17. Set ws_RAF1 = wb_RAF1.Worksheets(1)
  18.  
  19. Set ws_resultat = wb_NIR1.Worksheets.Add
  20. ws_resultat.Name = "Resultat"
  21. Set cel_resultat = ws_resultat.Range("A1")
  22.  
  23. For Each cel_cherchee In ws_NIR1.Range("A2:A16")
  24. Set cel_trouvee = ws_RAF1.Columns(1).Find(cel_cherchee.Value)
  25. Do
  26. cel_resultat.Value = cel_trouvee.Value
  27. Set cel_resultat = cel_resultat.Offset(1)
  28. Set cel_trouvee = cel_trouvee.Offset(1)
  29. Loop Until (Left(cel_trouvee.Text, 14)) = "S30.G01.00.001"
  30. 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 ;)  )
m
0
l
25 Février 2011 12:09:26

:) 
Merci beaucoup Zeb je vais faire mes recherches de mon coté , mais je reviendrais vers toi et vers le forum cette après-midi si je ne réussi pas tout seul...
Encore merci
m
0
l
25 Février 2011 15:48:22

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 ... :whistle:  )
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 :

  1. Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt"
  2. Set wb_RAF1 = ActiveWorkbook
  3. 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 :sweat: 

______________
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 :o 
:D 
m
0
l
25 Février 2011 15:52:35

je ne comprend plus rien c qui qui envoi ce message EDIT:???
m
0
l
a b L Programmation
25 Février 2011 15:55:53

C'est moi. Regarde en bas à droite du message, il y a le nom de la personne qui se permet d'éditer ton post. Seul toi, un modérateur ou un administrateur peut modifier tes messages. Voir des noms propres me gêne beaucoup, alors je les vire :o 
;) 
m
0
l
25 Février 2011 16:02:07

merci cher zeb :D  tu comprendras que je suis nouveau et que j'ai pas l'habitude des forums , mais j'ai appris pas mal de choses avec toi merci!!
m
0
l
a b L Programmation
25 Février 2011 16:45:18

Et c'est pas fini. Attends mes réponses dans l'autre topic ;) 
m
0
l