Se connecter avec
S'enregistrer | Connectez-vous

Copier lignes avec condition dans autre feuille

Dernière réponse : dans Programmation

Bonjour,

Je cherche à copier les lignes d'un tableau contenant une valeur dans la colonne 3, sur une autre feuille, et supprimer les lignes vides sur cette dernière.
Concrètement : un tableau des règlements clients, recopiés sur une feuille banque où on trouvera que les règlements "cb"par exemple.
je me suis inspirée d'exemples, ce qui me donne :

  1. Option Explicit
  2.  
  3. Public Sub Copyreglements()
  4.  
  5. ' COPIE DES LIGNES DESIREES DANS LES FEUILLES DE CALCUL DEDIEES
  6.  
  7. Dim Rw As Range
  8. Dim Ligne As Long
  9.  
  10. Dim f_destination As Worksheet
  11. Set f_destination = Worksheets("Sheet2")
  12.  
  13. ' Sélectionne l'ensemble des données (utile pour qu'Excel ne "réfléchisse" pas sur les 65000 lignes)
  14. Sheets("Sheet1").Select
  15. ActiveCell.SpecialCells(xlLastCell).Select
  16. Range(Selection, Cells(1)).Select
  17.  
  18.  
  19. ' Boucle qui va passer sur chaque ligne de la sélection afin de déterminer si des lignes contiennent le flag voulu
  20. ' puis copie dans une deuxième feuille de calcul
  21.  
  22. For Each Rw In Selection.Rows
  23.  
  24. Ligne = Rw.Row
  25.  
  26. If Rw.Cells(1, 3).Value = "cb" Then
  27. Rw.Copy Worksheets("Sheet2").Cells(Ligne, 1).EntireRow
  28. End If
  29.  
  30. Next Rw
  31.  
  32.  
  33.  
  34. ' Supression des lignes vierges dans les feuilles de calcul récemment constituées
  35. Dim derli
  36. Dim r
  37. Sheets("Sheet2").Activate
  38.  
  39. With ActiveSheet.UsedRange
  40. derli = .Row + .Rows.Count - 1
  41. End With
  42. Application.ScreenUpdating = False
  43. For r = derli To 1 Step -1
  44. If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
  45. Next r
  46.  
  47.  
  48.  
  49.  
  50. End Sub

Mais il ne se passe absolument rien quand je lance la macro depuis excel.
Avec ou sans la partie qui efface les lignes vierges, c'est pareil.
Ma feuille origine est "Sheet1", la feuille de destination "Sheet2".
Après des heures de tests et essais divers, je n'ai vraiment plus aucune idée, dans la mesure où en plus je débute...
Merci de votre aide !

Autres pages sur : copier lignes condition feuille

Lassé par la pub ? Créez un compte
Expert Programmation

Hum, intéressant. Un mélange de codes très bons et très mauvais. On voit le débutant éclairé qui cherche à bien faire. C'est donc avec plaisir que je vais t'aider.

Pour commencer, a chaque fois que tu as un des mots suivants, tu as fait une connerie : Select, Selection, Activate, ActiveTruc.
Lignes 10, 11, tu définies ta feuille de destination. C'est bien. Pourquoi ne pas t'en servir ? Définie de la même façon ta feuille d'origine et utilise-là aussi.

Ligne 14, tu sélectionnes une feuille (pourquoi la sélectionner ?)
Ligne 15, tu considères la cellule active (ActiveCell). Oui mais comment savoir que tu es sur la bonne cellule ?

Sinon, c'et vraiment moche, le coup de "je-copie-avec-des-trous-que-je-supprimerais-après".

  1. Option Explicit
  2.  
  3. Public Sub CopieReglements()
  4. ' // Copie des lignes desirées dans les feuilles de calcul dédiées
  5.  
  6. Dim PlageUtile As Range
  7. Dim Ligne As Range
  8. Dim Origine As Worksheet
  9. Dim Destination As Worksheet
  10. Dim LigneDestination As Integer
  11.  
  12. Set Origine = Worksheets("Feuil1")
  13. Set Destination = Worksheets("Feuil2")
  14.  
  15. Set PlageUtile = Range(Origine.Cells(1, 1), Origine.Cells(1, 1).SpecialCells(xlLastCell))
  16.  
  17. MsgBox "Attention, nous allons travailler sur la plage " & PlageUtile.Address
  18.  
  19. LigneDestination = 1
  20. For Each Ligne In PlageUtile.Rows
  21. If Ligne.Cells(1, 3).Value = "cb" Then
  22. Ligne.Copy Destination.Cells(LigneDestination, 1)
  23. LigneDestination = LigneDestination + 1
  24. End If
  25. Next
  26. End Sub


Que dis-tu de ça ?

Merci Zeb : c'est clair, simple et efficace.
C'est vraiment gentil d'avoir pris le temps de m'aider. En plus cela améliore grandement ma compréhension de vba, dont je me sers occasionnelement pour le moment. Mais j'ai l'intention d'aller plus loin : excel et vba permettent de problèmes courants.

Bonjour Zeb,

Je cherche une autre méthode simple pour un besoin simple :
je veux copier une plage de cellule allant de A2 jusqu'à l'intersection de la colonne D et de la dernière ligne utilisée.
Et coller le tout en A2 d'une autre feuille.

je bute sur la sélection de la plage de cellule, pour le moment j'ai fait ça :
  1. Dim PlageUtile As Range
  2. Dim Origine As Worksheet
  3. Dim Destination As Worksheet
  4. Set Origine = Worksheets("liste")
  5. Set Destination = Worksheets("exportation")
  6. Set PlageUtile = Range(Origine.Cells(2, 1), Origine.Cells(2, 4).SpecialCells(xlLastCell))
  7. PlageUtile.Copy Destination.Cells(2, 1)


mais je copie toute la ligne, alors que je ne veux que les 4 premières colonnes.
je sais que "specialscells(xlastcell) n'est pas adapté, mais je n'arrive pas à trouver la bonne syntaxe.
si tu as encore le temps, ton aide sera appréciée une fois de plus.



j'ai ce code qui fonctionne, mais je pense qu'il y a mieux non ?

  1. Option Explicit
  2. Public Sub copiedecellules()
  3.  
  4. Dim PlageUtile As Range
  5. Dim Origine As Worksheet
  6. Dim Destination As Worksheet
  7. Set Origine = Worksheets("liste-orig")
  8. Set Destination = Worksheets("internet")
  9. Set PlageUtile = Range([A2], [D65635].End(xlUp))
  10. PlageUtile.Copy Destination.Cells(2, 1)
  11. End Sub
Expert Programmation

Salut Emicoma,

Evite de dire "Salut Zeb", imagine que Mike (Salut Mike :hello:  ) ait une solution, il pourrait ne pas se sentir concerné. ;) 
La soluce de Mike est excellente.

Mais attention à ceux que tu veux vraiment. La dernière ligne vide et la prochaine ligne vide, ce n'est pas la même chose. Là, je fais un topo : http://www.presence-pc.com/forum/ppc/Programmation/exce... . Le tout est de savoir si tu as le droit d'avoir des lignes vides ou pas dans ton bloc.

Quant à ton code http://www.presence-pc.com/forum/ppc/Programmation/copi... , il est très laid : Ligne 9, tu te sers de la feuille courante, pas du tout de ce que tu as mis dans Origine.
Plutôt que [A2], écris Origine.Range("A2").

Bien noté.
Ce que je souhaite, c'est sélectionner les lignes utilles. normalement je n'ai pas de lignes vides, mais je pourrais l'envisager.
Dans ce cas là, il faudrait sélectionner la dernière ligne vide ? comment ?
j'ai modifié le code ainsi, c'est correct ?
  1. Option Explicit
  2. Public Sub copiedecellules()
  3.  
  4. Dim PlageUtile As Range
  5. Dim Origine As Worksheet
  6. Dim Destination As Worksheet
  7. Set Origine = Worksheets("liste-orig")
  8. Set Destination = Worksheets("internet")
  9. Set PlageUtile = Origine.Range([A2], [D2].End(xlDown))
  10. PlageUtile.Copy Destination.Cells(2, 1)
  11. End Sub
Lassé par la pub ? Créez un compte