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!
Configuration: Windows XP
Firefox 3.0.11

20 réponses

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

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

    ActiveSheet.Paste
    .

    Cordialement.
    0
  2. matt014
     
    bonjours,

    Erreur d'éxecution 1004 - erreur défini par l'application ou par l'objet ...
    Merci quand même!
    0
  3. 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
  4. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. 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
  8. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
     
    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
  9. 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
  10. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  11. 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
  12. 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
  13. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  14. 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
  15. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  16. 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
  17. 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
  18. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  19. 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
  20. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  21. 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