Optimisation d'une Boucle

Bonjour,

ma macro posséde une boucle permettant de supprimer toutes les cellules >=Max...et de decaler vers la gauche tous celles qui ne le sont pas.

Cette boucle mais un temps fou car le nombre de cellule est élevé, on m'a dit qu'en passant par un objet range ça irait 100 fois plus vite...mais je ne sais pas comment faire..MERCI DE VOTRE AIDE !!

Max=450

nb_ligne=4000

nb_col=40

For i = -nb_ligne - 1 To -2

For j = -nb_col - 2 To -3

Cells(-i, -j).Select

If Cells(-i, -j) >= Max Then

Selection.Delete Shift:=xlToLeft

'Selection.FormatConditions.Delete

End If

Next j

Next i

Bonjour,

essaye déjà comme ceci :

1. Rajoute ceci en début de macro:

Dim max As Integer, nb_ligne As Integer, nb_col As byte
Application.ScreenUpdating = False

2. Ton tableau de 4000 lignes et 40 colonnes peut changer ou pas et y a t-il des données en dessous et à gauche ou non ?

A te lire

Dan

Bonjour Nad-Dan

J'ai déja essayé de mettre Application.ScreenUpdating = False mais ça ne fait pas gagner beaucoup de temps

Le nombre de colonne et de lignes peut être différents...

Voici un exemple de ligne et ceux que doit obtenir

02/05/2007 05:21:10 5 480 5 550

02/05/2007 05:21:25 40 40 455 40

Resultat toutes les valeurs superieurs à 450 sont gardées et sont poussées vers la gauche..dans mon exemple ci dessus il y a 4 colonnes de valeurs mais je peut en avoir une quarantaine.

02/05/2007 05:21:10 480 550

02/05/2007 05:21:25 455

Re,

Pas facile de trouver ce qu'il te faut. J'ai effectué pas mal d'essais sans vraiment trouver de solution car dès qu'il y a beaucoup de données, cela devient long.

Faut dire aussi que 40000 données c'est quand même beaucoup.

Par rapport à cela je pense que l'on pourrait accélérer en connaissant la dimension de ton tableau.

Il faudrait donc que la macro prenne cela en considération plutôt que de définir les variables nb_ligne et nb_col car, par cette définition, tu demandes à la macro de parcourir des cellules qui sont peut être vides et là on perd du temps.

Il faut donc savoir lorsque tu parles de 4000 lignes si pour chaque colonne tu as des données jusqu'à la ligne 4000 ou non. (exemple : B2:B4000 mais C2:C500)

Idem dans l'autre sens, si ta dernière colonne est la colonne Z, est-ce que pour toutes les lignes tu as des données encodées jusque Z.

Sinon tu peux aussi essayer cette macro :

Sub test()
Dim max As Integer, nb_ligne As Integer, I As Integer
Dim nb_col As Byte
Application.ScreenUpdating = False
max = 450
nb_ligne = 400
nb_col = 10
With Sheets("Feuil1")
While nb_col <> 1
    For I = .Range("a" & nb_ligne).End(xlToLeft).Row To 1 Step -1
    If .Cells(I, nb_col) <= max Then .Cells(I, nb_col).Delete Shift:=xlToLeft
    Next I
nb_col = nb_col - 1
Wend
End With
End Sub

A te lire

Dan

Merci Nad-Dan,

Ton code m'a donné des idées, et j'ai put ameliorer.

Grazie

re,

Tu peux remplacer nb_ligne =400 et nb_col = 10 par le code ci-dessous. La macro prendra uniquement en compte les lignes et colonnes complétées sur ta feuille et ce, de manière automatique

nb_ligne = ActiveSheet.UsedRange.Rows.Count
nb_col = ActiveSheet.UsedRange.Columns.Count

Ciao

Dan

Rechercher des sujets similaires à "optimisation boucle"