Copier ligne si une cellule dans celle-ci est non-nulle, entre deux feuilles de calcul - macro
Dernière réponse : dans Programmation
Bonjour à tous,
Premièrement, je tiens à préciser que je n'ai aucune formation autre qu'un peu d'essai erreur sur vba...
Mon but est de réussir à isoler rapidement les lignes qui contiennent des éléments et de copier celles-ci sur une autre feuille de calcul. Dans mon classeur, je peux savoir directement si la ligne est vide en ne regardant que les valeurs de la colonne H. Si H est nulle (en fait elle vaut "", donc 0), alors la ligne est vide et elle n'est pas à copier. Mon code, ci-bas, fonctionne, mais il est beaucoup trop lent... J'aimerais donc bien que vous m'aidiez à l'optimiser.
À noter que copier seulement les colonnes A à M selon la valeur de la colonne H pourrait suffire.
Merci beaucoup de l'aide apportée!
Premièrement, je tiens à préciser que je n'ai aucune formation autre qu'un peu d'essai erreur sur vba...
Mon but est de réussir à isoler rapidement les lignes qui contiennent des éléments et de copier celles-ci sur une autre feuille de calcul. Dans mon classeur, je peux savoir directement si la ligne est vide en ne regardant que les valeurs de la colonne H. Si H est nulle (en fait elle vaut "", donc 0), alors la ligne est vide et elle n'est pas à copier. Mon code, ci-bas, fonctionne, mais il est beaucoup trop lent... J'aimerais donc bien que vous m'aidiez à l'optimiser.
À noter que copier seulement les colonnes A à M selon la valeur de la colonne H pourrait suffire.
Sub Bouton1_Clic()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Sheets("COPIER ICI LES CELLULES NONVIDE").Activate ' feuille de destination
Col = "H" ' colonne de la donnée non vide à tester
NumLig = 2
With Sheets("Produit à copier") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = 3 To NbrLig
If .Cells(Lig, Col).Value <> "" Then
.Cells(Lig, Col).EntireRow.Copy
NumLig = NumLig + 1
Cells(NumLig, 1).Select
ActiveSheet.Paste
End If
Next
End With
End Sub
Merci beaucoup de l'aide apportée!
Autres pages sur : copier ligne cellule nulle feuilles calcul macro
Lassé par la pub ? Créez un compte
Bon y a pas de solution miracle, tu est déjà sur la bonne voie.
qq point pour accélerer:
1) évite le presse papier (en plus éthiquement c'est mieux) (en faisant "gnagna. copy target" ça copie sans utiliser le presse papier)
2) Coupe l'update de l'écran au début de ta procedure (application.screenupdating = false) puis après la boucle, réactive le.
3) si tu as peu de ligne vide une bonne solution serait de copier l'ensemble de la feuille(c'est instantanée), puis de supprimer les lignes après la copie (ça c'est lent, comme la copie d'une seule ligne).
Voila si tu as plus de question, aucun souci.
Edit: un exemple de ce que ça peut donner:
qq point pour accélerer:
1) évite le presse papier (en plus éthiquement c'est mieux) (en faisant "gnagna. copy target" ça copie sans utiliser le presse papier)
2) Coupe l'update de l'écran au début de ta procedure (application.screenupdating = false) puis après la boucle, réactive le.
3) si tu as peu de ligne vide une bonne solution serait de copier l'ensemble de la feuille(c'est instantanée), puis de supprimer les lignes après la copie (ça c'est lent, comme la copie d'une seule ligne).
Voila si tu as plus de question, aucun souci.
Edit: un exemple de ce que ça peut donner:
Dim Lig As Long Dim Col As String Dim NbrLig As Long Dim NumLig As Long Dim target As Range 'Sheets("COPIER ICI LES CELLULES NONVIDE").Activate ' feuille de destination Application.ScreenUpdating = False Col = "H" ' colonne de la donnée non vide à tester NumLig = 2 Set target = Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(2, 1) With Sheets("Produit à copier") ' feuille source NbrLig = .Cells(65536, Col).End(xlUp).Row .Range("A3:M" & NbrLig).Copy target NbrLig = Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(65536, Col).End(xlUp).Row For Lig = NbrLig To 2 Step -1 If Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(Lig, Col).Value = "" Then Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(Lig, Col).EntireRow.Delete End If Next Application.ScreenUpdating = True End With
- drul a édité ce message
- | Alerter
Ton probleme me perturbait, alors, j'ai un peu chercher,
La meilleure solution est de passer par une mémoire tampon et d'écrire toutes les données d'un coup !
P.S. il y surement moyen d'optimiser un peu ... (on peut surement copier toute la ligne d'un coup dans le buffer sans faire une deuxième boucle, mais j'ai plus le temps de chercher).
La meilleure solution est de passer par une mémoire tampon et d'écrire toutes les données d'un coup !
Sub Bouton1_Clic() Dim Lig As Long Dim Col As String Dim NbrLig As Long Dim NumLig As Long Dim target As Range Dim testbuffer As Variant Dim j As Long Col = "H" ' colonne de la donnée non vide à tester NumLig = 0 Set target = Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(2, 1) With Sheets("Produit à copier") ' feuille source NbrLig = .Cells(65536, Col).End(xlUp).Row ReDim testbuffer(NbrLig, 13) For Lig = 3 To NbrLig If .Cells(Lig, Col).Value <> "" Then For j = 1 To 13 testbuffer(NumLig, j - 1) = .Cells(Lig, j).Value Next NumLig = NumLig + 1 End If Next Sheets("COPIER ICI LES CELLULES NONVIDE").Range("A2:M" & NumLig).Value = testbuffer End With End Sub
P.S. il y surement moyen d'optimiser un peu ... (on peut surement copier toute la ligne d'un coup dans le buffer sans faire une deuxième boucle, mais j'ai plus le temps de chercher).
- | Alerter
drul a dit :
Ton probleme me perturbait, alors, j'ai un peu chercher,La meilleure solution est de passer par une mémoire tampon et d'écrire toutes les données d'un coup !
Sub Bouton1_Clic() Dim Lig As Long Dim Col As String Dim NbrLig As Long Dim NumLig As Long Dim target As Range Dim testbuffer As Variant Dim j As Long Col = "H" ' colonne de la donnée non vide à tester NumLig = 0 Set target = Sheets("COPIER ICI LES CELLULES NONVIDE").Cells(2, 1) With Sheets("Produit à copier") ' feuille source NbrLig = .Cells(65536, Col).End(xlUp).Row ReDim testbuffer(NbrLig, 13) For Lig = 3 To NbrLig If .Cells(Lig, Col).Value <> "" Then For j = 1 To 13 testbuffer(NumLig, j - 1) = .Cells(Lig, j).Value Next NumLig = NumLig + 1 End If Next Sheets("COPIER ICI LES CELLULES NONVIDE").Range("A2:M" & NumLig).Value = testbuffer End With End Sub
P.S. il y surement moyen d'optimiser un peu ... (on peut surement copier toute la ligne d'un coup dans le buffer sans faire une deuxième boucle, mais j'ai plus le temps de chercher).
Ces codes sont effectivement beaucoup plus rapide que les miens! (le mien copiait 2 lignes à la seconde et j'ai 10000 lignes) Avec ceux-ci, j'obtiens le résultat en 5-6 secondes. Le dernier est effectivement un peu plus rapide que le premier.
Après quelques tests, j'ai remarqué par contre un petit problème. La commande copie toutes les lignes requises, sauf la première et la dernière ligne...
Pourrais-tu m'aider là-dessus s'il te plait?
Outre cela, superbe réponse, merci!
- | Alerter
Contenus similaires
- Copier cellule autre feuille - Forum
- Copier un classeur excel - Forum
- Vba excel copier coller range - Forum
- Programme lit texte - Forum
- | Alerter
- | Alerter
- | Alerter
- | Alerter
- | Alerter
- | Alerter
- | Alerter
- | Alerter
Regarde ici: http://www.presence-pc.com/forum/id-2137992/probleme-bo...
cette façon de faire serait parfaite pour ton programme.
cette façon de faire serait parfaite pour ton programme.
- | Alerter
- | Alerter
Lassé par la pub ? Créez un compte