copier/coller puis supprimer

ktran

XLDnaute Junior
bonjour a tous,

dans la feuille 1, j ai des donnees. dand la colonne K, j ai un statut 1 ou rien
si dans la colonne K, statut = 1 alors, copier la ligne entiere et la coller dans la feuille 2
ensuite, supprimer la ligne dans la feuille 1

evidemment, la macro doit se poursuivre jusqu'a qu elle rencontre une ligne vide et le collage dans la feuille 2 ne doit pas ecraser les donnees deja saisies

merci pour votre aide

cordialement
 

Pièces jointes

  • Book1.xlsm
    31.9 KB · Affichages: 91
  • Book1.xlsm
    31.9 KB · Affichages: 89
  • Book1.xlsm
    31.9 KB · Affichages: 85

ktran

XLDnaute Junior
Re : copier/coller puis supprimer

salut ktran,

j'ai mis des commentaires dans le code...

bonjour Kobaya,

j ai bien compris le commentaire pour le sub suppr()

concernant le commentaire sub copy(), je pense qu il y a un probleme :
cela ne copie pas la ou les lignes avec le statut "1" vers le Sheet2 mais ca copie une partie du fichier avec les donnees "24" du fichier Sheet1, euh... je comprends pas.

je te renvoie un fichier, pouvez vous jeter un coup d oeil.

merci d avance
 

Pièces jointes

  • Book4.xlsm
    19.5 KB · Affichages: 66
  • Book4.xlsm
    19.5 KB · Affichages: 71
  • Book4.xlsm
    19.5 KB · Affichages: 63

Kobaya

XLDnaute Occasionnel
Re : copier/coller puis supprimer

Bonsoir ktran,

Remplace ta procédure Sub copy() par le code ci-dessous. J'y ai ajouté un Stop au début. Quand l'éditeur VBA s'affiche, appuie sur F8 pour exécuter les commandes une à une.
Code:
Sub copy()
    Dim ligne   As Range
    Dim r       As Long
    
    Stop
    With Sheets("Sheet1")
        For Each ligne In .Range("A2:A" & m_nbLignes).Rows
            If .Cells(ligne.Row, 11).Value = "1" Then
                ' il faut initialiser r avant de l'utiliser.
                ' r vaut 0 au départ, et il n'y a pas de ligne 0 dans Excel...
                r = r + 1
                
                ' ligne est un objet Range, qui va prendre successivement toutes les valeurs
                ' de la plage définie dans le For Each/Next, soit A1, A2, A3, A4, A5, etc...
                ' place le curseur au dessus de ligne, et tu verras non pas le numéro de ligne que tu souhaites copier,
                ' mais le contenu de la cellule ($A$1) référencée par l'objet ligne, c'est à dire 3333333
                ' ==> donc tu copies la ligne 3333333 dans l'autre onglet
                ' il faut utiliser, comme sur la ligne If/Then ci-dessus, ligne.Row, qui renvoie le numéro de la ligne à copier (10)
                
                ' mauvais code
                '.Rows(ligne).copy Destination:=Sheets("Sheet2").Rows(r)
            
                ' bon code
                .Rows(ligne.Row).copy Destination:=Sheets("Sheet2").Rows(r)
            End If
        Next
    End With
End Sub
 
Dernière édition:

ktran

XLDnaute Junior
Re : copier/coller puis supprimer

Bonsoir ktran,

Remplace ta procédure Sub copy() par le code ci-dessous. J'y ai ajouté un Stop au début. Quand l'éditeur VBA s'affiche, appuie sur F8 pour exécuter les commandes une à une.
Code:
Sub copy()
    Dim ligne   As Range
    Dim r       As Long
    
    Stop
    With Sheets("Sheet1")
        For Each ligne In .Range("A2:A" & m_nbLignes).Rows
            If .Cells(ligne.Row, 11).Value = "1" Then
                ' il faut initialiser r avant de l'utiliser.
                ' r vaut 0 au départ, et il n'y a pas de ligne 0 dans Excel...
                r = r + 1
                
                ' ligne est un objet Range, qui va prendre successivement toutes les valeurs
                ' de la plage définie dans le For Each/Next, soit A1, A2, A3, A4, A5, etc...
                ' place le curseur au dessus de ligne, et tu verras non pas le numéro de ligne que tu souhaites copier,
                ' mais le contenu de la cellule ($A$1) référencée par l'objet ligne, c'est à dire 3333333
                ' ==> donc tu copies la ligne 3333333 dans l'autre onglet
                ' il faut utiliser, comme sur la ligne If/Then ci-dessus, ligne.Row, qui renvoie le numéro de la ligne à copier (10)
                
                ' mauvais code
                '.Rows(ligne).copy Destination:=Sheets("Sheet2").Rows(r)
            
                ' bon code
                .Rows(ligne.Row).copy Destination:=Sheets("Sheet2").Rows(r)
            End If
        Next
    End With
End Sub

Kobaya,

j ai copie le code ci-dessus et je ne trouve pas les resultats que tu mentionne
ci joint les messages d erreur.

ou es le probeleme, j ai beau cherche, je n y parviens vraiment pas.

merci d avance
 

Pièces jointes

  • error vba.JPG
    error vba.JPG
    40.6 KB · Affichages: 77
  • error vba3.jpg
    error vba3.jpg
    47.2 KB · Affichages: 73
  • error vba2.jpg
    error vba2.jpg
    42.6 KB · Affichages: 78

Kobaya

XLDnaute Occasionnel
Re : copier/coller puis supprimer

ooops! désolé ktran,

J'ai omis de te dire de déclarer la variable m_nbLignes au niveau module.

Essaie le fichier joint. J'espère que cette fois-ci, je n'ai rien oublié :eek:.
 

Pièces jointes

  • Book5.xlsm
    20.7 KB · Affichages: 74

ktran

XLDnaute Junior
Re : copier/coller puis supprimer

ooops! désolé ktran,

J'ai omis de te dire de déclarer la variable m_nbLignes au niveau module.

Essaie le fichier joint. J'espère que cette fois-ci, je n'ai rien oublié :eek:.

un grand merci Kobaya.

apres avoir teste, j ai juste detecte un petit souci.

1) quand il y a plusieurs lignes (ex. ligne 10 et 15) avec le statut "1", la macro copie bien ces 2 lignes dans le sheet2 mais des sauts de lignes.

2) lors d un nouveau test (controller s'i y a de nouvelles lignes avec le statut "1"), s'il y en a,la macro copie bien les lignes mais ecrase les anciennes lignes deja presente dans sheet2. la macro ne doit pas ecrase les anciennes lignes mais copier sur la(les) premiere ligne vide et ainsi de suite

3) dans sheet2, le statut "1" ne doit pas apparaitre.

j ai essaye de rajoute R+1 mais rien ny fait.

une idee d ou vient le probleme ?
 

Pièces jointes

  • test.JPG
    test.JPG
    40.1 KB · Affichages: 70
  • resultat.JPG
    resultat.JPG
    19.7 KB · Affichages: 68
  • test.JPG
    test.JPG
    40.1 KB · Affichages: 71
  • resultat.JPG
    resultat.JPG
    19.7 KB · Affichages: 69
  • resultat test 2.JPG
    resultat test 2.JPG
    18 KB · Affichages: 68
  • test.JPG
    test.JPG
    40.1 KB · Affichages: 66
  • resultat.JPG
    resultat.JPG
    19.7 KB · Affichages: 67
  • new test.JPG
    new test.JPG
    28.9 KB · Affichages: 69

Kobaya

XLDnaute Occasionnel
Re : copier/coller puis supprimer

Voici une nouvelle version, où la variable "r", dans la Sub copy(), a disparu au profit de la commande
Code:
Sheets("sheet2").Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset((Sheets("sheet2").Range("A1").Value <> "") * -1, 0)
Une commande, un peu compliquée je te l'accorde, mais qui a le triple avantage

  • de ne pas effacer les lignes déjà présentes dans Feuil2 (comme tu le demandes)
  • de fonctionner quelque soit la version Excel utilisée (2007 avec 1048576 lignes, les versions précédentes avec 65536 lignes, grâce à "ActiveSheet.Rows.Count")
  • "(Sheets("sheet2").Range("A1").Value <> "") * -1" : cette formule permet de ne pas se déplacer d'une ligne vers le bas dans le cas de la première ligne copiée (essaie la commande en commentaire avec .Offset(1, 0))
 

Pièces jointes

  • Book6.xlsm
    21.1 KB · Affichages: 81

ktran

XLDnaute Junior
Re : copier/coller puis supprimer

Voici une nouvelle version, où la variable "r", dans la Sub copy(), a disparu au profit de la commande
Code:
Sheets("sheet2").Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset((Sheets("sheet2").Range("A1").Value <> "") * -1, 0)
Une commande, un peu compliquée je te l'accorde, mais qui a le triple avantage

  • de ne pas effacer les lignes déjà présentes dans Feuil2 (comme tu le demandes)
  • de fonctionner quelque soit la version Excel utilisée (2007 avec 1048576 lignes, les versions précédentes avec 65536 lignes, grâce à "ActiveSheet.Rows.Count")
  • "(Sheets("sheet2").Range("A1").Value <> "") * -1" : cette formule permet de ne pas se déplacer d'une ligne vers le bas dans le cas de la première ligne copiée (essaie la commande en commentaire avec .Offset(1, 0))


Kobaya, je tenais a te remercier de ton aide pour ce petit projet. en plus du code qui fonctionne tres bien, les explications sont vraiment tres claires et j ai encore appris beaucoup de choses sur VBA.

un grand merci encore

cordialement
 

Discussions similaires

Réponses
56
Affichages
1 K
Réponses
22
Affichages
932

Statistiques des forums

Discussions
312 691
Messages
2 090 992
Membres
104 721
dernier inscrit
Hmidou