Copier lignes avec condition dans autre feuille

emicoma

Nouveau membre
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 :

[cpp]Option Explicit

Public Sub Copyreglements()

' COPIE DES LIGNES DESIREES DANS LES FEUILLES DE CALCUL DEDIEES

Dim Rw As Range
Dim Ligne As Long

Dim f_destination As Worksheet
Set f_destination = Worksheets("Sheet2")

' Sélectionne l'ensemble des données (utile pour qu'Excel ne "réfléchisse" pas sur les 65000 lignes)
Sheets("Sheet1").Select
ActiveCell.SpecialCells(xlLastCell).Select
Range(Selection, Cells(1)).Select


' Boucle qui va passer sur chaque ligne de la sélection afin de déterminer si des lignes contiennent le flag voulu
' puis copie dans une deuxième feuille de calcul

For Each Rw In Selection.Rows

Ligne = Rw.Row

If Rw.Cells(1, 3).Value = "cb" Then
Rw.Copy Worksheets("Sheet2").Cells(Ligne, 1).EntireRow
End If

Next Rw



' Supression des lignes vierges dans les feuilles de calcul récemment constituées
Dim derli
Dim r
Sheets("Sheet2").Activate

With ActiveSheet.UsedRange
derli = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For r = derli To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r




End Sub


[/cpp]
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 !
 

zeb

Modérateur
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".

Code:
Option Explicit

Public Sub CopieReglements()
' // Copie des lignes desirées dans les feuilles de calcul dédiées

    Dim PlageUtile As Range
    Dim Ligne As Range
    Dim Origine As Worksheet
    Dim Destination As Worksheet
    Dim LigneDestination As Integer
    
    Set Origine = Worksheets("Feuil1")
    Set Destination = Worksheets("Feuil2")
    
    Set PlageUtile = Range(Origine.Cells(1, 1), Origine.Cells(1, 1).SpecialCells(xlLastCell))
    
    MsgBox "Attention, nous allons travailler sur la plage " & PlageUtile.Address
    
    LigneDestination = 1
    For Each Ligne In PlageUtile.Rows
        If Ligne.Cells(1, 3).Value = "cb" Then
            Ligne.Copy Destination.Cells(LigneDestination, 1)
            LigneDestination = LigneDestination + 1
        End If
    Next
End Sub

Que dis-tu de ça ?
 

emicoma

Nouveau membre
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.
 

zeb

Modérateur
clair, simple et efficace :sol:
Merci. Je n'aide que pour recevoir de temps en temps ce genre de message ;)
 

emicoma

Nouveau membre
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 :
[cpp]
Dim PlageUtile As Range
Dim Origine As Worksheet
Dim Destination As Worksheet
Set Origine = Worksheets("liste")
Set Destination = Worksheets("exportation")
Set PlageUtile = Range(Origine.Cells(2, 1), Origine.Cells(2, 4).SpecialCells(xlLastCell))
PlageUtile.Copy Destination.Cells(2, 1)
[/cpp]

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.



 

emicoma

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

[cpp]Option Explicit
Public Sub copiedecellules()

Dim PlageUtile As Range
Dim Origine As Worksheet
Dim Destination As Worksheet
Set Origine = Worksheets("liste-orig")
Set Destination = Worksheets("internet")
Set PlageUtile = Range([A2], [D65635].End(xlUp))
PlageUtile.Copy Destination.Cells(2, 1)
End Sub
[/cpp]
 

mikebzh

Nouveau membre
Coucou

Dans la même logique mais en partant du haut tu peux faire

[D2].End(Xldown) au lieu de [D65635].End(XlUp)

Cela gagnera un petit peu de temps

Salut :)
 

zeb

Modérateur
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 : . Le tout est de savoir si tu as le droit d'avoir des lignes vides ou pas dans ton bloc.

Quant à ton code , 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").
 

emicoma

Nouveau membre
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 ?
[cpp]
Option Explicit
Public Sub copiedecellules()

Dim PlageUtile As Range
Dim Origine As Worksheet
Dim Destination As Worksheet
Set Origine = Worksheets("liste-orig")
Set Destination = Worksheets("internet")
Set PlageUtile = Origine.Range([A2], [D2].End(xlDown))
PlageUtile.Copy Destination.Cells(2, 1)
End Sub
[/cpp]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 129
Messages
6 717 854
Membres
1 586 377
Dernier membre
Noleki
Partager cette page
Haut