Accelerer une Boucle

cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 - 10 oct. 2007 à 16:43
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 - 11 oct. 2007 à 09:58
Bonjour voici un morceau de code vba, il permet de lire une plage de valeur de bas en haut et de gauche à droite.
Il supprimer les cases vides et decale les valeurs non nul vers l'extreme gauche.
Cette plage est assez importante  car :

nb_ligne= 3779
nb_col=40

Il faut plus d'une heure pour l'executer...avez vous une idée pour accelerer ce traitement

Application.ScreenUpdating = False ' Désactivation de la mise à jour de l'affichage
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
        End If
    Next J
Next i
Application.ScreenUpdating = True ' Réactivation de la mise à jour de l'affichage

It@li@

5 réponses

cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
10 oct. 2007 à 16:46
Désolé  cette boucle enléve les cellule >= Max
Max=450

It@li@
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 oct. 2007 à 18:42
Reagarde ici comment on traite:
http://www.vbfrance.com/forum.v2.aspx?ID=1019844

Faut faire avec objet Range, c'est en interne un pointeur d'adresse sur les données.
Vire les 'select', rien à faire dans de grosses boucles, ça ruine les perfs.

ciao...
BruNews, MVP VC++
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
10 oct. 2007 à 22:22
Bonsoir,

100% d'accord avec Brunews... Voici ce que ton code réécrit normalement donne :



Sub es()



'Paramètres
Dim Nb_Ligne As Long, Nb_Col As Long, Max As Double
Dim i As Long, j As Long



Nb_Ligne = 4000
Nb_Col = 40
Max = 60



'Algo
For i = 1 To Nb_Ligne
    For j = 1 To Nb_Col        If Cells(i, j) >Max Then Cells(i, j) ""
    Next j
Next i



End Sub



=

Amicalement,
Us.
0
SMaverick Messages postés 8 Date d'inscription lundi 19 juillet 2004 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 00:15
Salut,
Si Nb_Ligne et Nb_Col et Max ne changent pas, pourquoi faire reference a la variable, c'est du boulot en plus pour le programme .... Utilisent les valeurs directement dans le programme, c'est pas une revolution mais ça permet de gagner un peu de temps ... tutorial sur l'optimisation http://www.vbfrance.com/tutorial.aspx?id=519

bon courage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
11 oct. 2007 à 09:58
Bonjour à tous et merci de vos remarques..

us_30 : ton code ne decale pas les lignes < Max vers la gauche .... donc ne repond pas entierement à mon besoin.

BruNews : je ne vois pas comment faire avec un objet Range....peux tu m'aider s'il te plait

It@li@
0
Rejoignez-nous