Résolu Problème avec macro de recherche de lignes

woow74

Habitué
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
 

woow74

Habitué
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? :)
 

woow74

Habitué
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:
[cpp]
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
[/cpp]
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

 

zeb

Modérateur
Meilleure réponse
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: :
Code:
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. :/
 

woow74

Habitué
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 :)
 

zeb

Modérateur
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. :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 :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.
 

woow74

Habitué
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
 

zeb

Modérateur
Oki

Eh, mais c'est pas fini !!!!!!!!!!!!!!
As-tu réussi à mettre plusieurs mots de recherche ?
Et ton histoire de (mot clé ,'valeur') ?
 

woow74

Habitué
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
 

zeb

Modérateur
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.
 

woow74

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

maintenant j'ai cette macro :
[cpp]
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
[/cpp]

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
 

woow74

Habitué
code résultat pour le premier post :
[cpp]
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

[/cpp]
voila pour tout le monde :)
 

zeb

Modérateur
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 :
Code:
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 :
Code:
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 ;) )
 

woow74

Habitué
:)
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
 

woow74

Habitué
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 :

[cpp]Workbooks.OpenText Filename:="D:\Users\woow\Desktop\RAF1.txt"
Set wb_RAF1 = ActiveWorkbook
Set ws_RAF1 = wb_RAF1.Worksheets(1)
[/cpp]

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
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 002
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut