Macro VBA pour supprimer des lignes rapidement
J'ai plusieurs très grandes excel fichiers de données et j'ai besoin d'aller à travers eux tous, et supprimer toutes les lignes dont la valeur de la cellule dans la colonne T est 1. Droit maintenant, mon code ressemble à ceci:
Sub test()
Dim cell As Range
For Each cell In Worksheets("Sheet1").Range("T5", "T900000")
If cell.Value = 1 Then
cell.EntireRow.Delete
End If
Next cell
End Sub
Il semble fonctionner, mais prend une éternité à courir et je vais avoir à faire un tas de fois. Est-il une meilleure manière de faire ceci, ou d'une certaine façon à optimiser ce que j'ai déjà à faire tourner plus vite?
Range([T5], [T5].End(xlDown))
sélectionner toutes les cellules contigües avec des valeurs de départ à T5
. Sauf si vous avez vraiment 900k lignes c'est lié à être beaucoup plus rapide...Ouais, j'ai vraiment que de nombreuses cellules...
OriginalL'auteur scaevity | 2013-03-13
Vous devez vous connecter pour publier un commentaire.
Cela ne fonctionne pas comme vous le pensez... Lorsque vous supprimez des lignes que vous itérer à travers eux, vous vous retrouvez à sauter des lignes. Exemple: imaginez que votre lignes ont les numéros 1...10 dans la colonne A. Vous regardez la première ligne et de décider de le supprimer. Maintenant, vous regardez à la deuxième ligne. Il a le numéro 3! Vous n'avez jamais regardé la ligne 2!!
Meilleure méthode serait de filtrer la feuille de calcul sur votre critères de la colonne T, le copier, le coller j'ai une nouvelle feuille de calcul (avec mise en forme, etc).
Vous pouvez activer l'enregistrement de la macro et de le faire manuellement, puis vous aura exactement le même code VBA. Je suis sûr que ce sera beaucoup plus rapide.
Même si vous ne le faites pas, si vous voulez faire un
for each
où vous supprimez les choses, d'inverser l'ordre (de début à la fin et travailler à rebours)Floris' approche est certainement le moyen le plus rapide. Dans le cas où vous avez vraiment besoin de parcourir les lignes, la suppression de bas en haut est un bon moyen d'accélérer les choses, tout en évitant la ligne de référence de problème, fait-il remarquer.
Oui! Le filtrage de la feuille de calcul, la copie de cellules visibles et de les coller à une nouvelle Feuille de calcul est LA réponse.
Comment faites-vous pour chacune d'elles dans l'ordre inverse? Je ne pense pas qu'il y avait un moyen de le faire...
en fait, vous avez de l'indice de la boucle "manuellement" -
For i = n To 1 Step -1
etc. il n'y a pas de direct "reverse pour chaque" en VBA autant que je sache.OriginalL'auteur Floris
Si vous souhaitez utiliser une boucle, ne devraient pas ignorer les éléments.
Je pense que @Floris Filtre méthode pourrait être plus rapide si.
Mise à jour
J'ai basculé
Application.ScreenUpdating
autour de la boucle, qui sont généralement des vitesses des trucs comme ça beaucoup!Vous pouvez également désactiver les calculs automatiques, sur le dessus de la désactivation des mises à jour d'écran. L'exécution du script vers l'arrière (à Partir de lastLine à FirstLine l'étape 1) est de la plus grande importance, sinon vous passez à la ligne suivante à chaque fois que vous avez supprimé une ligne.
ne saviez pas sur le calcul. Cette fonction ne sera pas sauter des lignes!
La désactivation des calculs et des mises à jour d'écran feront de votre macro courir plus vite. Sinon, à chaque suppression de ligne, la feuille de calcul est recalculée et les mises à jour affichées sur l'écran. Même avec le calcul éteint, vous serez toujours à sauter des lignes, si vous exécutez de haut en bas car la ligne de références ont changé. ligne 20 est maintenant en ligne 19 et lorsque vous sauter à la ligne 20, vous avez raté la ligne 19 (ancienne ligne 20). Lorsque vous exécutez la suppression de la boucle dans le bas-haut de la boucle, vous permettra de vérifier les lignes de doubler sur une ligne a été supprimée, mais vous aurez assurez-vous que toutes les lignes ont été supprimées.
Im pleinement conscients de cela et ma fonction prend cela en compte, veuillez lire le code.
OriginalL'auteur NickSlash
Dans le cas où vous gérez vos données comme une base de données et que vous voulez supprimer des lignes spécifiques et il est possible de les filtrer, il existe une astuce pour accélérer votre supprimer. C'est très rapide contrairement à la simple boucle-processus:
Je compare la fois pour les différents exemples (avec 4806 lignes).
Exemple: j'ai des données dans 'Tabelle5' et que vous voulez supprimer des lignes spécifiques. Les données commence à la ligne 6. Chaque ligne dans la colonne 1, qui commencent avec "OLD#" devrait être supprimé.
1) Voici la solution standard (le plus long temps):
2) Voici l'Éventail de solution (moyen terme):
3) solution de Filtre (temps le plus court):
Ici les lignes vertes seront commandés pour le haut et une gamme de vert hits sera supprimé dans son ensemble. C'est le moyen le plus rapide que je connaisse! 🙂
J'espère que ça aidera quelqu'un!
Cordialement
Tom
OriginalL'auteur MosTwanTedT
La méthode la plus rapide que j'ai trouvé est d'effacer la ligne de données (.claire) et de les trier.
Par exemple, je veux me débarrasser de sauts de page qui montrent que " ========= "
Maintenant trier ensuite faire un xlUp dernière ligne (volet 3.Range("A1000000").End(xlUp).Ligne), etc.
De supprimer les lignes (dans un de mes fichiers qui est de 220 000 lignes environ). prend 3 minutes. Effacement du contenu prend moins de 10 secondes.
Le problème devient alors de savoir comment supprimer les lignes vides si vous avez besoin de déplacer les données ci-dessous les lignes à celle du dessus avant que ce soit fait. 🙂
Cheers,
BJ
OriginalL'auteur user3431068