VBA - Exécution de Code est Extrêmement Lent
J'ai un assez simple morceau de code que j'utilise pour faire une boucle dans une feuille excel de données. En gros, j'ai plus de 150 000 lignes de données et je veux supprimer toutes les lignes à l'exception de ceux qui ont "une Panne de l'Instrument", dans ce cas, je veux que la ligne et l'un immédiatement au-dessus et au-dessous (qui peut contenir des détails relatifs à l'échec).
Voici mon code:
Sub UnsignedFailure()
Application.ScreenUpdating = False
'Start point
Set r = Range("E1")
'Loop, total rows is a function, executes quickly
For t = 3 To TotalRows
'Check for a failure
k = InStr(1, r.Cells(t, 1).Value, "Instrument Failure")
'Verify that it corresponds to a GC
b = InStr(1, r.Cells(t, 1).Offset(0, -3).Value, "GC")
If k <> 0 And b <> 0 Then
'Skip two rows if it is true
t = t + 2
Else
'Delete the previous row since this row is not a failure
r.Cells(t - 1, 1).EntireRow.Delete
'Go back a row to account for the deleted row
t = t - 1
End If
Next t
Application.ScreenUpdating = True
End Sub
J'ai vérifié ce en les passant en revue, et cela fonctionne. Cependant, même ayant le code de pause à chaque fois que le "SI" est vrai, le temps entre les pauses semble très longtemps (peut-être à 5 min de la case à 20 000 cellules). Si je laisse le code exécuté sans les casser, j'ai pas encore le faire au complet (ordinateur se fige). Ai-je raté quelque chose ou d'être inefficace dans mon code? Toute aide serait grandement appréciée!
Puis-je vous intéresser dans tout à fait nouvelle façon de faire cela?
Je serais!
Depuis l'OP ignoré mon commentaire, j'ai jeté le code LOL
En parcourant 150,00 lignes est le mal.
OriginalL'auteur Gaussian Blur | 2013-04-23
Vous devez vous connecter pour publier un commentaire.
Mon expérience avec des macros excel m'a appris qu'il est beaucoup plus efficace pour copier les données correspondant à vos conditions pour une nouvelle feuille, pas de suppression de lignes qui ne correspondent pas.
Chaque fois que vous supprimez une ligne, il faut excel quelques millisecondes pour recalculer la feuille (même si il n'y a pas de formules, il vérifie toujours toutes les cellules pour voir si elle a besoin de mise à jour) et mise à jour de l'affichage pour l'utilisateur. Vous avez déjà désactiver l'écran de mise à jour, qui va certainement couper certains de ce temps de repos. Une autre façon est de désactiver le Calcul Excel, mettre
Application.Calculation = xlCalculationManual
en haut de votre sous pour désactiver le recalcul etApplication.Calculation = xlCalculationAutomatic
au bas de l'activer de nouveau. Ce site a quelques bons conseils sur l'optimisation de code VBA pour excel.Comme je l'ai dit, je pense que le plus efficace serait de déplacer les données vers une nouvelle feuille quand il correspond à vos conditions.
+1 mais je voudrais aussi vous suggère fortement de copier l'appropriées, que les données d'un tableau, supprimer toutes les lignes puis coller le tableau plus haut. Si vous souhaitez conserver la mise en forme de supprimer toutes les mais la taille de la ligne sur le solde de votre tableau avant de vous y coller.
Wow, c'est incroyable de voir comment beaucoup de temps d'éteindre
Calculation
etScreenUpdating
sauve! Merci pour les conseils.OriginalL'auteur Pete Garafano