Rechercher : dans
Par :

Macro excel - copié collé

Dernière réponse le 6 jui 2009 à 15:30:42 matt014, le 3 jui 2009 à 14:00:49 
 Signaler ce message aux modérateurs

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!

Configuration: Windows XP
Firefox 3.0.11

Meilleures réponses pour « Macro excel copié collé » dans :
Ubuntu - Un copier coller rapide VoirUn copier-coller ultra-rapide Sous Ubuntu, Linux, il est très simple de faire un copier coller, encore plus simple qu'un “Ctrl + C” “Ctrl + V” : Il suffit de sélectionner le texte (juste le sélectionner) pour le mettre en mémoire puis de...

1

chossette9, le 3 jui 2009 à 14:18:00

Bonjour,

essaie de remplacer

ActiveRange.EntireRow.Select
Selection.Paste 
par

ActiveSheet.Paste
.

Cordialement. Si l'on devait enfermer tous les cons dans des placards, 
il n'y aurait plus personne pour fermer les portes.
Chossette un jour, chossette toujours !

Répondre à chossette9

2

matt014, le 3 jui 2009 à 14:20:57

Bonjours,

Erreur d'éxecution 1004 - erreur défini par l'application ou par l'objet ...
Merci quand même!

Répondre à matt014

3

matt014, le 3 jui 2009 à 15:43:14

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

Répondre à matt014

4

chossette9, le 3 jui 2009 à 16:58:09

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. Si l'on devait enfermer tous les cons dans des placards, 
il n'y aurait plus personne pour fermer les portes.
Chossette un jour, chossette toujours !

Répondre à chossette9

5

matt014, le 3 jui 2009 à 18:44:41

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!

Répondre à matt014

6

matt014, le 6 jui 2009 à 10:09:33

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 !

Répondre à matt014

7

chossette9, le 6 jui 2009 à 10:13:04

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. Si l'on devait enfermer tous les cons dans des placards, 
il n'y aurait plus personne pour fermer les portes.
Chossette un jour, chossette toujours !

Répondre à chossette9

8

matt014, le 6 jui 2009 à 10:18:32

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 !

Répondre à matt014

9

michel_m, le 6 jui 2009 à 10:57:10

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
Cordialement, Michel

Répondre à michel_m

10

matt014, le 6 jui 2009 à 11:07:11

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,

Répondre à matt014

11

matt014, le 6 jui 2009 à 11:26:19

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,

Répondre à matt014

12

michel_m, le 6 jui 2009 à 11:56:35

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 Cordialement, Michel

Répondre à michel_m

13

matt014, le 6 jui 2009 à 12:06:43

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

Répondre à matt014

14

michel_m, le 6 jui 2009 à 12:22:03

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...
Cordialement, Michel

Répondre à michel_m

15

matt014, le 6 jui 2009 à 12:41:04

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!

Répondre à matt014

16

matt014, le 6 jui 2009 à 13:47:34

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 !

Répondre à matt014

17

michel_m, le 6 jui 2009 à 14:14:41

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
http://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...



Cordialement, Michel

Répondre à michel_m

18

matt014, le 6 jui 2009 à 14:42:32

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

Répondre à matt014

19

michel_m, le 6 jui 2009 à 14:54:20

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 Cordialement, Michel

Répondre à michel_m