Macro excel - copié collé

matt014 -  
 matt014 -
Bonjour,
J'ai un tableau Excel de X colonnes et Y lignes. Le but est de pouvoir inserer dans une inputBox un mot de recherche, et que la macro trouve chaque ligne ou ce mot est présent, copie toutes ces lignes, et les colles dans une 3ème fenêtre.
Novice en VBA, j'ai déjà fais une ébauche qui me permet de trouver ou le mot est ( pour l'instant il le trouve une foi et cherche pas plu loin :S ), il active toute la ligne, la copie ... et après ne veux pas l'insérer dans la 3ème page!
Je souhaiterai également savoir si il existe un code permettant de rechercher juste dans les cellules occupé, et non sur toute la feuille.
Ci dessous, le code que j'ai réussi a tapé :

Public Sub CommandButton1_Click()
Dim a As String
a = InputBox("quel mot recherchez vous ?")
Range("h16") = a
For sh = 1 To Sheets.Count
With Sheets(sh).Range("a1:iv6553")
Set t = .Find(Sheets(1).Range("h16").Value, LookIn:=xlValues)
If Not t Is Nothing Then
Sheets(sh).Activate
b = t.Address
Range(b).Activate
b = ActiveCell.EntireRow.Select
Selection.Copy
Sheets("Recherche").Select
Range("A1").Select
ActiveRange.EntireRow.Select
Selection.Paste
End If
Exit Sub
End With
Next
End Sub


Le tout étant bien brouillon, j'espère pouvoir trouver qqn qui pourrais m'aider !
Merci d'avance!
A voir également:

20 réponses

chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
Bonjour,

essaie de remplacer
ActiveRange.EntireRow.Select
Selection.Paste 
par

ActiveSheet.Paste
.

Cordialement.
0
matt014
 
bonjours,

Erreur d'éxecution 1004 - erreur défini par l'application ou par l'objet ...
Merci quand même!
0
matt014
 
Après vérification, ActiveSheet.Paste fonctionne, il suffisais d'agrandir les ligne dans la 3ème feuille.
Merci Chossette9 !!
Le problème est que la ligne collé veut se placer uniquement dans la 1er ligne, et déclare une erreur si elle est déjà occupé.
Il me reste également le problème qu'il ne veuille copié collé qu'une seul des lignes, et pas toutes celle qui contient le mot clef de recherche.
Je reposte ma macro :

Public Sub CommandButton1_Click()
Dim a As String
Dim i As Integer
a = InputBox("quel mot recherchez vous ?")
Range("h16") = a
For sh = 1 To Sheets.Count
With Sheets(sh).Range("a1:iv6553")
Set t = .Find(Sheets(1).Range("h16").Value, LookIn:=xlValues)
If Not t Is Nothing Then
Sheets(sh).Activate
b = t.Address
Range(b).Activate
b = ActiveCell.EntireRow.Select
Selection.Copy
Sheets("Recherche").Select
Sheets("Recherche").Activate
ActiveSheet.Paste
End If
Exit Sub
End With
Next
End Sub
0
chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
Alors pour régler le problème de toujours coller dans la même ligne tu peux sélectionner ta cellule A1 de ta 2e feuille par
Range("A1").Select
.

Ensuite tu places le code suivant :
Do While ActiveCell <> "" 'tant que la cellule active n'est pas vide
ActiveCell.Offset(0,1).Select 'tu sélectionnes la cellule (donc la ligne) d'en dessous
Loop


Ceci devrait te permettre de coller tes lignes les unes en dessous des autres.

Pour le problème d'effectuer la recherche plusieurs fois, je vais me pencher dessus ce weekend.

Cordialement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
matt014
 
Merci bien !
Etant en week end, je ne pourrai tester ca avant lundi. Je vous tiendrais au courant de l'évolution!
Encore merci, et bon week end!
0
matt014
 
Bonjour,

En ayant suivi vos instruction, j'obtient maintenant le code suivant :

Public Sub CommandButton1_Click()
Dim a As String
Dim i As Integer
a = InputBox("quel mot recherchez vous ?")
Range("h16") = a
For sh = 1 To Sheets.Count
With Sheets(sh).Range("a1:iv6553")
Set t = .Find(Sheets(1).Range("h16").Value, LookIn:=xlValues)
If Not t Is Nothing Then
Sheets(sh).Activate
b = t.Address
Range(b).Activate
b = ActiveCell.EntireRow.Select
Selection.Copy
Sheets("Recherche GCS").Select
Range("A2").Select
Do While ActiveCell <> ""
ActiveCell.Offset(0, 1).Select
Loop
ActiveCell.Paste
End If
Exit Sub
End With
Next
End Sub


Le problème vien maintenant de "Range("A2").Select" qui donne une erreur 1004, erreur défini par l'application ou par l'objet .

Merci par avance !
0
chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
Bonjour,

souvent lorsque j'ai rencontré des erreurs 1004, je remplaçait le "Select" par "Activate".

Peut être que ça peut marcher dans ton cas ?

Cordialement.
0
matt014
 
Bonjour,

Merci d'une réponse aussi rapide!
Malheureusement, j'ai déjà essayé .Activate et il me sort la même erreur au même endroit ...
VBA me rendra fou, a force de passer des heures a recherchez sur le net des solutions !
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour

essaies ceci:

Public Sub CommandButton1_Click()
Dim mot As String
Dim cellule As Range
Dim sh as byte 'maxi 255 feuilles

'première lig vide dans rech gcs
 With Sheets("Recherche GCS")
 derlig = Range("A65536").End(xlUp).Row + 1
 End With
 
mot = InputBox("quel mot recherchez vous ?")
If mot = "" Then: Exit Sub 'gère le vide ou l'appui sur le bouton rouge
    
    For sh = 1 To Sheets.Count
        With Sheets(sh).Cells
            Set cellule = .Find(mot, LookIn:=xlValues)
            If Not cellule Is Nothing Then
                'copie la ligne
                .Rows(cellule.Row).Copy Sheets("Recherche GCS").Cells(derlig, 1)
            End If
        End With
        derlig = derlig + 1
    Next

set cellule=nothing
Sheets("Recherche GCS").activate
End Sub
0
matt014
 
Bonjour,

La macro se déroule normalement, aucun bug, sauf que rien ne se passe. L'inputBox aparait, mais rien ne s'écri dans la feuille "Recherche GCS" par la suite ...

Cordialement,
0
matt014
 
bonjour,

Rectificatif, je m'en excuse.
La ligne recherché s'ajoute bien a la feuille "Recherche GCS", mais elle s'inscrit a la ligne 15, et la remet exactement pareil a la ligne 16 ...
De plus, j'aurai souhaiter que si l'on effectue une autre recherche, la nouvelle ligne s'ajoute en dessous de la première recherche.

Merci pour toute votre aide,
Cordialement,
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Excuses moi mais j'ai pas mal merdé dans mon truc...
question:
si le mot cherché est "tata" par ex., il y a t'il qu'un seul tata par ligne?
merci d'avance
0
matt014
 
Bonjour,

Il n'y a aucun problème, ce code donne déjà bcp plus de resultat que celui que j'avais essayé d'élaborer!
Pour l'exemple de "tata", oui sa peu arriver. Chaque ligne contient soi du texte, soi des nombres.
pou info, jai pu faire en sorte que les lignes vienne bien s'inscrire a partir de la ligne 2, mais juste en faisan .Rows(cellule.Row).Copy Sheets("Recherche GCS").Cells(derlig - 13, 1) ==> derlig -13 ...
j'ai tjrs le problème que la boucle fait réécrire une deuxième foi en dessous la même ligne, et que chaque foi que je lance la macro, les nouvelles données vont remplacer les 1er ...

Merci bcp
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
OK,
une première c... (au choix)
With Sheets(sh).Cells
Set cellule = .Find(mot, LookIn:=xlValues)
If Not cellule Is Nothing Then
'copie la ligne
.Rows(cellule.Row).Copy Sheets("Recherche GCS").Cells(derlig, 1)
End If
derlig = derlig + 1
End With

Next

MAIS,
pour l'instant on ne cherche qu'une fois
si tu as plusieurs tata par ligne, la fonction "find" va répéter la manip autant de fois qu'elle rencontre tata
d'autre part la fonction find commence sa recherche qu'à partir de la 2° cellule. c.a.d. que si tu as tata en A1...
le correctif se trouve dans l'aide microsoft de l'exemple de "find"

d'autre part, pour lancer la macro de n'importe quelle feuille (j'avais mis le bouton dans GCS)
il faut ajouter un point devant range
'première lig vide dans rech gcs
With Sheets("Recherche GCS")
derlig = .Range("A65536").End(xlUp).Row + 1
End With

je regarde tout çà en début d'aprèm...
0
matt014
 
je vais essayer de mieu poser ma situation, peutêtre que cela aidera.
Mon classeur Excel contient 2 feuille. La première contient un tableau, et s'apelle "GCS". C'est sur cette feuille que j'ai mi le bouton de commande, ainsi qu'une cellule ou s'affiche le mot recherché ( j'explique ceci pour mieu comprendre le "Range(H16) = mot " de ma macro que je vais mettre en bas). La première ligne de cette feuille est ocupé par des titres, donc pas de problème pour la fonction "find".
La deuxième feuille, appeler "Recherche GCS" contient uniquement la même 1er ligne que la feuille 1, cad les titres.
Le but précis de la macro est qu'en cliquan juste sur le bouton de commande et en tapant le mot clef, toutes les lignes correspondante se mette dans la 2ème feuille, et que si on désire y rajouter d'autre ligne avec un autre mot clef de recherche, elles se rajoutent en dessous .

Encore merci pour toute votre aide!
0
matt014
 
Public Sub CommandButton1_Click()
Dim mot As String
Dim cellule As Range
Dim sh As Byte 'maxi 255 feuilles

'première lig vide dans rech gcs
With Sheets("Recherche GCS")
derlig = Range("A65536").End(xlUp).Row + 1
End With

mot = InputBox("quel mot recherchez vous ?")
Range("H16") = mot
If mot = "" Then: Exit Sub 'gère le vide ou l'appui sur le bouton rouge

For sh = 1 To Sheets.Count
With Sheets(sh).Cells
Set cellule = .Find(mot, LookIn:=xlValues)
If Not cellule Is Nothing Then
'copie la ligne
.Rows(cellule.Row).Copy Sheets("Recherche GCS").Cells(derlig - 13, 1)
End If
derlig = derlig + 1
End With
Next

Set cellule = Nothing
Sheets("Recherche GCS").Activate
End Sub



La macro !
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
re,

pour l'avenir:l'exposé de post 15 est très clair; pense aux prochaines fois où il serait bien d'exposer ton pb du 1° coup
surtout le fait qu'il n'y ait qu'une feuille de recherche: cgs !!!

mais j'avoue ne pas comprendre range H16 qui va faire recopier la ligne 16 dans rech gcs.

en espèrant être mieux réveillé que ce matin

Private Sub CommandButton1_Click()
Dim mot As Variant
Dim ligvide As Long, derlig As Long
Dim lig As Long

mot = InputBox("nom?")
If mot = "" Then Exit Sub
'Range("H16") = mot '???? fera recopier la ligne 16 dans rech gcs

'-----initialisations
'première ligne vide dans rech gcs
ligvide = Sheets("recherche gcs").Range("A65536").End(xlUp).Row + 1
'dernière ligne de gcs où il y a le mot
derlig = Cells.Find(mot, , xlFormulas, , xlByRows, xlPrevious).Row
lig = 0
While lig < derlig
    'détection d 'une ligne avec mot
    lig = Cells.Find(mot, Cells(lig + 1, 1)).Row
    'copie la ligne en rech gcs
    Rows(lig).Copy Sheets("recherche gcs").Cells(ligvide, 1)
    ligvide = ligvide + 1
Wend

End Sub

fichier test
https://www.cjoint.com/?hgonMxdvnU

question à 1000 €: si le 2) mot est toto, quelles lignes recopier? toutes ou seulement celes ou il n'y avait pas "tata" ? je te laisse chercher...



0
matt014
 
Bonjour,

Tout d'abord, merci bcp !

Ce code fonctionne parfaitement. Le fait d'insérer le mot recherché en Range("H16") est pour la feuille GCS, juste a coter du bouton de commande. Il sert a l'utilisateur, afin qu'il puisse voir le mot qu'il recherche, si il na pas fait de faute de frappe ou autre. Jusqu'à présent, cette cellule s'affichait uniquement dans la feuille "GCS", mais maintenant elle ce met dans les 2 feuilles .
Je m'excuse du manque de clarté, novice en VBA, et 1er foie sur un forum !

Maintenant il ne me reste plus qu'a faire une dernière petite macro qui permettrai d'effacer les lignes rempli dans Recherche GCS, afin de refaire une recherche à neuf.
Ça me semble moins compliqué, et peut-être dans mes cordes !

Concernant la question a 1000€, je ne suis pas sur de l'avoir bien comprise.
Si je ne me trompe pas, la question est savoir ce qui serait le plus efficace, et vu que mon tableau n'est pas énorme, environ 100 lignes, je dirait que la macro dans ce sens reste efficace, assez pour ne pas remettre du code qui ferai le travail dans l'autre sens ...
Ais-je gagné ?

Encore un grand merci
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
question à 1000 €

tu as écrit:
toutes les lignes correspondante se mette dans la 2ème feuille, et que si on désire y rajouter d'autre ligne avec un autre mot clef de recherche, elles se rajoutent en dessous .


voilà: que fait on si sur une ligne où on trouve toto, il y a déjà tata ?

pas convaincu par H16: comme on cherche les lignes "tata" sur toute la feuille par cette instruction
lig = Cells.Find(mot, Cells(lig + 1, 1)).Row
tu copies donc cette ligne 16

Ou alors cherche uniquement dans ton tableau
range("A1:G78") X78 au zazar mais hors H16
lig =range("A1:G78") .Find(mot, Cells(lig + 1, 1)).Row

ou alors met range("H16") à la fin
0
matt014
 
Pour la question a 1000€ je pense avoir mieux compris !
La question vient du fait que l'on peu se retrouver 2 foi avec la même ligne dans la 2ème feuille ?
Si c'est effectivement cela, je n'y avais pas penser !
Le fait de sélectionné une ligne complète empêche de faire une petite comparaison entre 2 cellules, me semble-t-il. Cela aurais pu permettre de dire si oui ou non il faut recopié la ligne. Une foi de plus, toutes mes lacunes en VBA m'empêche de comprendre toutes les différentes solution qu'il pourrait y avoir !
Je crois que je vais devoir me déclarer perdant de ces 1000€ ... pour l'instant !

Pour H16, cette cellule n'est d'aucune utilité dans la macro, elle sert juste d'indication a l'utilisateur, qui ne sera pas moi-même, afin qu'il sache bien a partir de quelle mot il a fait ça recherche.

Cordialement,
0