Macro excel - copié collé

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

20 réponses

  1. Contributeur
    Bonjour,

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

    ActiveSheet.Paste
    .

    Cordialement.
    0
    1. bonjours,

      Erreur d'éxecution 1004 - erreur défini par l'application ou par l'objet ...
      Merci quand même!
      0
      1. 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
        1. Contributeur
          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
          1. 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
            1. 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
              1. Contributeur
                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
                1. 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
                  1. Contributeur
                    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
                    1. 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
                      1. 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
                        1. Contributeur
                          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
                          1. 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
                            1. Contributeur
                              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
                              1. 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
                                1. 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
                                  1. Contributeur
                                    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
                                    1. 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
                                      1. Contributeur
                                        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
                                        1. 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