Accelerer une Boucle

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

5 réponses

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

It@li@
Commenter la réponse de cs_ITALIA
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
7
0
Merci
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.
Commenter la réponse de us_30
Messages postés
8
Date d'inscription
lundi 19 juillet 2004
Statut
Membre
Dernière intervention
11 octobre 2007
0
Merci
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
Commenter la réponse de SMaverick
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
8
0
Merci
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@
Commenter la réponse de cs_ITALIA