[VBA] Blocage dans une boucle... sans message d'erreur
5 réponses
HD
Bonjour,
J'effectue une boucle afin de supprimer des lignes qui ne me conviennent pas
dans un classeur. Le classeur en question comporte plus de 13 000 lignes.
Mon souci est que alors que je fais pourtant apparaitre dans la barre de
statut l'avancement du travail l'écran va se figer et Excel va afficher ne
répond pas (il me faut appuyer briévement sur Echap pour revoir la barre de
statut défilée) mon autre souci est que plus la macro avance et plus le
défilement ralentit. Je pense que le souci vient du fait que la variable
Plage contient de plus en plus de donnée (sur les 13000 lignes il y'a
environ 7000 lignes de supprimées)...
Voici mon script :
-----------------------------------
Dim i As Long
Dim lMax As Long
Dim cMax As Long
Dim Plage As Range
Set Plage = Nothing
i = 8
Do
Application.StatusBar = i & " / " & lMax
If Cells(i, 2).Value <> 280 Then
If Plage Is Nothing Then
Set Plage = Range(Cells(i, 1), Cells(i, cMax))
Else
Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax)))
End If
End If
i = i + 1
Loop Until Cells(i, 2).Value = ""
Plage.Delete
Set Plage = Nothing
Application.StatusBar = ""
Application.ScreenUpdating = True
Application.EnableEvents = True
-----------------------------------
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jacky
Bonjour,
...supprimer des lignes qui ne me conviennent pas dans un classeur
Si j'ai bien compris...... Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la dernière ligne de la feuille active Supprime les lignes dont la valeur en colonne B est <> de 280 '---------------------- Sub jj() Dim i As Long Dim LMax As Long LMax = ActiveSheet.Cells.Find(What:="*", _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row
Application.ScreenUpdating = False Application.EnableEvents = False For i = LMax To 8 Step -1 Application.StatusBar = i & " / " & LMax If Cells(i, 2).Value <> 280 Then Rows(Cells(i, 2).Row).Delete End If Next Application.StatusBar = "" Application.ScreenUpdating = True Application.EnableEvents = True End Sub '------------------ -- Salutations JJ
"HD" a écrit dans le message de news: k3hevt$1mof$
Bonjour,
J'effectue une boucle afin de supprimer des lignes qui ne me conviennent pas dans un classeur. Le classeur en question comporte plus de 13 000 lignes. Mon souci est que alors que je fais pourtant apparaitre dans la barre de statut l'avancement du travail l'écran va se figer et Excel va afficher ne répond pas (il me faut appuyer briévement sur Echap pour revoir la barre de statut défilée) mon autre souci est que plus la macro avance et plus le défilement ralentit. Je pense que le souci vient du fait que la variable Plage contient de plus en plus de donnée (sur les 13000 lignes il y'a environ 7000 lignes de supprimées)...
Voici mon script : ----------------------------------- Dim i As Long Dim lMax As Long Dim cMax As Long Dim Plage As Range
Set Plage = Nothing i = 8 Do Application.StatusBar = i & " / " & lMax If Cells(i, 2).Value <> 280 Then If Plage Is Nothing Then Set Plage = Range(Cells(i, 1), Cells(i, cMax)) Else Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax))) End If End If i = i + 1 Loop Until Cells(i, 2).Value = "" Plage.Delete Set Plage = Nothing Application.StatusBar = "" Application.ScreenUpdating = True Application.EnableEvents = True -----------------------------------
Merci d'avance pour votre aide,
Cordialement,
@+ HD
Bonjour,
...supprimer des lignes qui ne me conviennent pas dans un classeur
Si j'ai bien compris......
Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la dernière ligne de la feuille active
Supprime les lignes dont la valeur en colonne B est <> de 280
'----------------------
Sub jj()
Dim i As Long
Dim LMax As Long
LMax = ActiveSheet.Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Application.ScreenUpdating = False
Application.EnableEvents = False
For i = LMax To 8 Step -1
Application.StatusBar = i & " / " & LMax
If Cells(i, 2).Value <> 280 Then
Rows(Cells(i, 2).Row).Delete
End If
Next
Application.StatusBar = ""
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
'------------------
--
Salutations
JJ
"HD" <dah@nomail.fr> a écrit dans le message de news: k3hevt$1mof$1@saria.nerim.net...
Bonjour,
J'effectue une boucle afin de supprimer des lignes qui ne me conviennent pas dans un classeur. Le classeur
en question comporte plus de 13 000 lignes. Mon souci est que alors que je fais pourtant apparaitre dans la
barre de statut l'avancement du travail l'écran va se figer et Excel va afficher ne répond pas (il me faut
appuyer briévement sur Echap pour revoir la barre de statut défilée) mon autre souci est que plus la macro
avance et plus le défilement ralentit. Je pense que le souci vient du fait que la variable Plage contient de
plus en plus de donnée (sur les 13000 lignes il y'a environ 7000 lignes de supprimées)...
Voici mon script :
-----------------------------------
Dim i As Long
Dim lMax As Long
Dim cMax As Long
Dim Plage As Range
Set Plage = Nothing
i = 8
Do
Application.StatusBar = i & " / " & lMax
If Cells(i, 2).Value <> 280 Then
If Plage Is Nothing Then
Set Plage = Range(Cells(i, 1), Cells(i, cMax))
Else
Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax)))
End If
End If
i = i + 1
Loop Until Cells(i, 2).Value = ""
Plage.Delete
Set Plage = Nothing
Application.StatusBar = ""
Application.ScreenUpdating = True
Application.EnableEvents = True
-----------------------------------
...supprimer des lignes qui ne me conviennent pas dans un classeur
Si j'ai bien compris...... Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la dernière ligne de la feuille active Supprime les lignes dont la valeur en colonne B est <> de 280 '---------------------- Sub jj() Dim i As Long Dim LMax As Long LMax = ActiveSheet.Cells.Find(What:="*", _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row
Application.ScreenUpdating = False Application.EnableEvents = False For i = LMax To 8 Step -1 Application.StatusBar = i & " / " & LMax If Cells(i, 2).Value <> 280 Then Rows(Cells(i, 2).Row).Delete End If Next Application.StatusBar = "" Application.ScreenUpdating = True Application.EnableEvents = True End Sub '------------------ -- Salutations JJ
"HD" a écrit dans le message de news: k3hevt$1mof$
Bonjour,
J'effectue une boucle afin de supprimer des lignes qui ne me conviennent pas dans un classeur. Le classeur en question comporte plus de 13 000 lignes. Mon souci est que alors que je fais pourtant apparaitre dans la barre de statut l'avancement du travail l'écran va se figer et Excel va afficher ne répond pas (il me faut appuyer briévement sur Echap pour revoir la barre de statut défilée) mon autre souci est que plus la macro avance et plus le défilement ralentit. Je pense que le souci vient du fait que la variable Plage contient de plus en plus de donnée (sur les 13000 lignes il y'a environ 7000 lignes de supprimées)...
Voici mon script : ----------------------------------- Dim i As Long Dim lMax As Long Dim cMax As Long Dim Plage As Range
Set Plage = Nothing i = 8 Do Application.StatusBar = i & " / " & lMax If Cells(i, 2).Value <> 280 Then If Plage Is Nothing Then Set Plage = Range(Cells(i, 1), Cells(i, cMax)) Else Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax))) End If End If i = i + 1 Loop Until Cells(i, 2).Value = "" Plage.Delete Set Plage = Nothing Application.StatusBar = "" Application.ScreenUpdating = True Application.EnableEvents = True -----------------------------------
Merci d'avance pour votre aide,
Cordialement,
@+ HD
HD
Si j'ai bien compris...... Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la dernière ligne de la feuille active Supprime les lignes dont la valeur en colonne B est <> de 280
C'est bien ça. Sauf qu'en fait plutôt que de supprimer ligne à ligne lorsque la suppression répond au critère je préfère mettre les lignes à supprimer dans une plage pour tout supprimer à la fin car c'est beaucoup plus rapide.
J'ai trouvé pourquoi la macro avait des réactions bizarres... avec gèle d'écran et ralentissements excessifs... Honte à moi, j'ai cliqué à un moment donné pour enregistrer une macro manuellement et... j'ai dû être appelé et lorsque je suis revenu je n'ai plus pensé à l'enregistrement de macro que j'avais lancée. D'où les ralentissements d'Excel...
@+ HD
Si j'ai bien compris......
Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la
dernière ligne de la feuille active
Supprime les lignes dont la valeur en colonne B est <> de 280
C'est bien ça. Sauf qu'en fait plutôt que de supprimer ligne à ligne lorsque
la suppression répond au critère je préfère mettre les lignes à supprimer
dans une plage pour tout supprimer à la fin car c'est beaucoup plus rapide.
J'ai trouvé pourquoi la macro avait des réactions bizarres... avec gèle
d'écran et ralentissements excessifs... Honte à moi, j'ai cliqué à un moment
donné pour enregistrer une macro manuellement et... j'ai dû être appelé et
lorsque je suis revenu je n'ai plus pensé à l'enregistrement de macro que
j'avais lancée. D'où les ralentissements d'Excel...
Si j'ai bien compris...... Ceci prend en compte un tableau commençant à la ligne 8 jusqu'a la dernière ligne de la feuille active Supprime les lignes dont la valeur en colonne B est <> de 280
C'est bien ça. Sauf qu'en fait plutôt que de supprimer ligne à ligne lorsque la suppression répond au critère je préfère mettre les lignes à supprimer dans une plage pour tout supprimer à la fin car c'est beaucoup plus rapide.
J'ai trouvé pourquoi la macro avait des réactions bizarres... avec gèle d'écran et ralentissements excessifs... Honte à moi, j'ai cliqué à un moment donné pour enregistrer une macro manuellement et... j'ai dû être appelé et lorsque je suis revenu je n'ai plus pensé à l'enregistrement de macro que j'avais lancée. D'où les ralentissements d'Excel...
@+ HD
MichD
Bonjour,
Si tu veux quelque chose de performant, essaie ceci :
'------------------------------------------------ Sub Test() Dim i As Long, lMax As Long Dim Plage As Range, cMax As Long
With Feuil1 ' ActiveSheet lMax = .Cells.Find(What:="*", _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row cMax = .Cells.Find(What:="*", _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column Set Plage = .Range("A1", .Cells(lMax, cMax)) End With
Application.ScreenUpdating = False Application.EnableEvents = False Application.DisplayAlerts = False With Plage .AutoFilter field:=2, Criteria1:="<>280" .SpecialCells(xlCellTypeVisible).Delete .AutoFilter End With Application.ScreenUpdating = True Application.EnableEvents = True Application.DisplayAlerts = True End Sub '------------------------------------------------
Sur une grande plage, lorsque tu as plusieurs cellules qui répondent aux critères, cette ligne de code va prendre de plus en plus de temps à s'exécuter. Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax)))
Dans la mesure du possible, on réserve cette approche sur des petites plages de cellules où lorsque l'on sait d'avance qu'il y a peu de cellules qui répondent au critère. Lorsque tu peux utiliser le filtre, c'est beaucoup plus rapide qu'une boucle!
Sur une grande plage, lorsque tu as plusieurs cellules qui répondent
aux critères, cette ligne de code va prendre de plus en plus de temps
à s'exécuter.
Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax)))
Dans la mesure du possible, on réserve cette approche sur des
petites plages de cellules où lorsque l'on sait d'avance qu'il y a
peu de cellules qui répondent au critère.
Lorsque tu peux utiliser le filtre, c'est beaucoup plus rapide
qu'une boucle!
Sur une grande plage, lorsque tu as plusieurs cellules qui répondent aux critères, cette ligne de code va prendre de plus en plus de temps à s'exécuter. Set Plage = Union(Plage, Range(Cells(i, 1), Cells(i, cMax)))
Dans la mesure du possible, on réserve cette approche sur des petites plages de cellules où lorsque l'on sait d'avance qu'il y a peu de cellules qui répondent au critère. Lorsque tu peux utiliser le filtre, c'est beaucoup plus rapide qu'une boucle!