Accelerer une Boucle

Signaler
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
-
cs_ITALIA
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
-
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

Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
8
Désolé  cette boucle enléve les cellule >= Max
Max=450

It@li@
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
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.
Messages postés
8
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
11 octobre 2007

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
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
8
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@