Excel macro copier ligne
outch
-
gbinforme Messages postés 15481 Date d'inscription Statut Contributeur Dernière intervention -
gbinforme Messages postés 15481 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un classeur excel dans mon service qui permet de suivre les réceptions à venir et cellles déjà faites, tout cela dans deux onglets Réceptions et Archives.
Mon but est que lorsqu'une personne remplie une cellule (qui correspond au bon de réception ex: BR021225) dans l'onglet réception, toute la ligne avec la ref article, la date de commande etc aille se coller en fin de tableau sur l'onglet archive.
Pour l'instant j'ai ça
Ca fonctionne mais j'ai les problèmes suivant :
La ligne avec le titre est systématiquement coupée et collée => n'y a t'il pas un moyen pour l'ignorer ds la macro ? En fait elle detecte les cellules "remplies" et les collent et bien sûr la colonne avec le titre est reconnue comme "pleine" et donc coupée/collée.
Les lignes coupées laissent un espace vide dans le tableau => n'y a t'il pas moyen de supprimer les lignes vides.
J'aimerais aussi executer cette macro avec un bouton "archiver"
J'espere que j'ai été précis, je m'y connais peu en vba donc merci de votre aide.
Cordialement
Outch
J'ai un classeur excel dans mon service qui permet de suivre les réceptions à venir et cellles déjà faites, tout cela dans deux onglets Réceptions et Archives.
Mon but est que lorsqu'une personne remplie une cellule (qui correspond au bon de réception ex: BR021225) dans l'onglet réception, toute la ligne avec la ref article, la date de commande etc aille se coller en fin de tableau sur l'onglet archive.
Pour l'instant j'ai ça
Sub FiltreOutch()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Sheets("Archives").Activate ' feuille de destination
Col = "J" ' colonne de la donnée non vide à tester
NumLig = 0
With Sheets("Receptions") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = 1 To NbrLig
If .Cells(Lig, Col).Value <> "" Then
.Cells(Lig, Col).EntireRow.Cut
NumLig = NumLig + 1
Cells(NumLig, 1).Select
ActiveSheet.Paste
End If
Next
End With
End Sub
Ca fonctionne mais j'ai les problèmes suivant :
La ligne avec le titre est systématiquement coupée et collée => n'y a t'il pas un moyen pour l'ignorer ds la macro ? En fait elle detecte les cellules "remplies" et les collent et bien sûr la colonne avec le titre est reconnue comme "pleine" et donc coupée/collée.
Les lignes coupées laissent un espace vide dans le tableau => n'y a t'il pas moyen de supprimer les lignes vides.
J'aimerais aussi executer cette macro avec un bouton "archiver"
J'espere que j'ai été précis, je m'y connais peu en vba donc merci de votre aide.
Cordialement
Outch
A voir également:
- Excel macro copier ligne
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Partager photos en ligne - Guide
- Word et excel gratuit - Guide
- Formule somme excel ligne - Guide
8 réponses
bonjour
Si tu commences ta boucle à 2 tu résous ton titre :
Si tu rajoutes cette ligne après la copie tu ne devrais plus avoir tes lignes vides
Si tu commences ta boucle à 2 tu résous ton titre :
For Lig = 2 To NbrLig
Si tu rajoutes cette ligne après la copie tu ne devrais plus avoir tes lignes vides
.Cells(Lig, Col).EntireRow.delete
excuses, j avais mal lu le pb, je pensais que tu ralais parce que c'etait coupé.
...
gbinforme t a repondu
...
gbinforme t a repondu
Ok merci,
J'ai réussi à gérer le problème du titre, mais pour la suppression des lignes vides j'ai un souci
voici le code
Le souci c'est que ça ne colle que la moitié de mes lignes et quand je relance la macro ça me supprime une ligne dans l'onglet des réceptions, enfin ça me coupe ma ligne sans la coller dans la partie archive quoi...
Une aide ?
Merci d'avance
J'ai réussi à gérer le problème du titre, mais pour la suppression des lignes vides j'ai un souci
voici le code
Sub FiltreOutch()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Sheets("Archives").Activate ' feuille de destination
Col = "J" ' colonne de la donnée non vide à tester
NumLig = 0
With Sheets("Receptions") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = 2 To NbrLig ' commence boucle à 2
If .Cells(Lig, Col).Value <> "" Then
.Cells(Lig, Col).EntireRow.Cut
NumLig = NumLig + 1
Cells(NumLig, 1).Select
ActiveSheet.Paste
.Cells(Lig, Col).EntireRow.Delete
End If
Next
End With
End Sub
Le souci c'est que ça ne colle que la moitié de mes lignes et quand je relance la macro ça me supprime une ligne dans l'onglet des réceptions, enfin ça me coupe ma ligne sans la coller dans la partie archive quoi...
Une aide ?
Merci d'avance
re
pour repondre a ton pb, je ferais un truc comme ca
Dim i As Integer, valeur As String
i = 1
Do While i < 56000
valeur = Range("J" & i).Value
If valeur = "" Then
Rows(i & ":" & i).Delete
i=i-1 '(pour relire la ligne si y'en a 2 consecutives vides)
End If
i = i + 1
Loop
End Sub
pour repondre a ton pb, je ferais un truc comme ca
Dim i As Integer, valeur As String
i = 1
Do While i < 56000
valeur = Range("J" & i).Value
If valeur = "" Then
Rows(i & ":" & i).Delete
i=i-1 '(pour relire la ligne si y'en a 2 consecutives vides)
End If
i = i + 1
Loop
End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
bonjour
Le souci c'est que ça ne colle que la moitié de mes lignes
Lorsque tu supprime des lignes, il faut commencer en bas :
Le souci c'est que ça ne colle que la moitié de mes lignes
Lorsque tu supprime des lignes, il faut commencer en bas :
For Lig = NbrLig To 2 step -1 ' termine boucle à 2
Merci gbinform j'ai pris ta solution.
En revanche tu pourrais m'aider à coller la ligne à la suite des lignes de la partie archive. Avec ce script ellles se collent à la place de la première ligne
mon code
Encore merci
En revanche tu pourrais m'aider à coller la ligne à la suite des lignes de la partie archive. Avec ce script ellles se collent à la place de la première ligne
mon code
Sub FiltreOutch()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Sheets("Archives").Activate ' feuille de destination
Col = "J" ' colonne de la donnée non vide à tester
NumLig = 0
With Sheets("Receptions") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = NbrLig To 2 Step -1 ' termine boucle à 2
If .Cells(Lig, Col).Value <> "" Then
.Cells(Lig, Col).EntireRow.Cut
NumLig = NumLig + 1
Cells(NumLig, 1).Select
ActiveSheet.Paste
.Cells(Lig, Col).EntireRow.Delete
End If
Next
End With
End Sub
Encore merci
bonjour
Tu peux le faire ainsi en utilisant la fonction de dernière ligne utilisée par une cellule documentée :
Tu peux le faire ainsi en utilisant la fonction de dernière ligne utilisée par une cellule documentée :
Sub FiltreOutch()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Sheets("Archives").Activate ' feuille de destination
Col = "J" ' colonne de la donnée non vide à tester
With Sheets("Receptions") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = NbrLig To 2 Step -1 ' termine boucle à 2
If .Cells(Lig, Col).Value <> "" Then
.Cells(Lig, Col).EntireRow.Cut _
Destination:=Cells(Cells.SpecialCells(xlCellTypeLastCell).Row + 1, 1)
.Cells(Lig, Col).EntireRow.Delete
End If
Next
End With
End Sub
Bonjour à tous,
Je me suis aussi heurté à ce genre de situation, alors je vous fais part d'une observation
qui m'apparait importante.
Cette instruction :
NbrLig = .Cells(65536, Col).End(xlUp).Row
informe sur le nombre de ligne !
Et cette instruction diminue le nombre de ligne
.Cells(Lig, Col).EntireRow.Delete
donc NbrLig devrait être décrémenté en plus de la décrémentation automatique de la boucle !
NbrLig = (NbrLig - 1)
Est-ce que je me fais comprendre ?
Lupin
p.s. gbinforme, nous avons du temps relativement doux dans mon coin de pays, j'espère
que Dame nature est aussi clémente pour vous :-)
Je me suis aussi heurté à ce genre de situation, alors je vous fais part d'une observation
qui m'apparait importante.
Cette instruction :
NbrLig = .Cells(65536, Col).End(xlUp).Row
informe sur le nombre de ligne !
Et cette instruction diminue le nombre de ligne
.Cells(Lig, Col).EntireRow.Delete
donc NbrLig devrait être décrémenté en plus de la décrémentation automatique de la boucle !
NbrLig = (NbrLig - 1)
Est-ce que je me fais comprendre ?
Lupin
p.s. gbinforme, nous avons du temps relativement doux dans mon coin de pays, j'espère
que Dame nature est aussi clémente pour vous :-)
bonjour Lupin.A,
Effectivement je vois que le climat du nouveau monde n'est pas fidèle à sa réputation et en France nous sommes loin du réchauffement climatique avec un hiver comme dans les cartes postales.
donc NbrLig devrait être décrémenté en plus de la décrémentation automatique de la boucle !
NbrLig = (NbrLig - 1)
Décrémenter ne va servir à rien car la variable n'est utilisée que comme point de départ et on aurait pu s'en passer en écrivant :
Effectivement, lorsque l'on fait une boucle de suppression, il vaut mieux commencer par le bas car sinon il faut à la fois faire varier la borne et l'indice utilisé dans la boucle ce qui n'est jamais simple à maitriser.
Effectivement je vois que le climat du nouveau monde n'est pas fidèle à sa réputation et en France nous sommes loin du réchauffement climatique avec un hiver comme dans les cartes postales.
donc NbrLig devrait être décrémenté en plus de la décrémentation automatique de la boucle !
NbrLig = (NbrLig - 1)
Décrémenter ne va servir à rien car la variable n'est utilisée que comme point de départ et on aurait pu s'en passer en écrivant :
For Lig = .Cells(65536, Col).End(xlUp).Row To 2 Step -1 ' termine boucle à 2
Effectivement, lorsque l'on fait une boucle de suppression, il vaut mieux commencer par le bas car sinon il faut à la fois faire varier la borne et l'indice utilisé dans la boucle ce qui n'est jamais simple à maitriser.