Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Blocage dans une boucle... sans message d'erreur

5 réponses
Avatar
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

lMax = ActiveSheet.Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
cMax = ActiveSheet.Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

Application.ScreenUpdating = False
Application.EnableEvents = False

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

5 réponses

Avatar
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

lMax = ActiveSheet.Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
cMax = ActiveSheet.Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

Application.ScreenUpdating = False
Application.EnableEvents = False

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

Avatar
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
Avatar
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
'------------------------------------------------

MichD
---------------------------------------------------------------
Avatar
MichD
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!


MichD
---------------------------------------------------------------
Avatar
HD
Effectivement, l'usage du filtre permet d'accélérer considérablement les
choses.

Un grand MERCI à vous de m'avoir aidé.

Cordialement,

@+
HD