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

  • Votes
  • Date
  • Date décroissante
  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,
    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
      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
        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...

          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 !
            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!
              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...
                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
                  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
                    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,
                      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,
                        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
                          
                          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 !
                            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.
                              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 !
                                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!
                                  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.
                                    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
                                      1. bonjours,

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

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

                                          ActiveSheet.Paste
                                          .

                                          Cordialement.