optimisation de temps d'execution d'une macro

N

nono

Guest
Salut le forum,

Bon comme dab' j'ai une question à la con alors avis aux amateurs (plutot aux pros)
Dans une macro, j'ai défini une zone :
dim zone as range
Set Zone = Range("C" & Total & ":Z" & Total2)

Ensuite je fais un for each Cell in zone ...

Bon ca marche sauf que quand ma zone est grande, ça met un max de temps, alors je voudrais lui dire dans un premier temps, si à l'intérieur de la zone, il n'y a aucune cellule non-vide (si toute les cellules sont vides) alors "passe à la suite" . Bien sur, je cherche le mot clé qui scan une plage entière et qui sait immédiatement si elle est vide ou non !! Je ne veux plus du classique for each ...

Deuxièmement, toujours dans un soucis d'optimisation, je voudrais que si dans ma plage C1 à Z20, la première cellule non vide est E12, ma plage devient automatiquement E1:Z20 (ceci n'est valable que si vba scan colonne par colonne et non pas ligne par ligne ! )
Si c'était possible de trouver également la dernière cellule non-vide dans ma zone, ca serait encore mieux mais bon, faut peut-etre pas abuser !!!

Voila, j'espere avoir été assez clair dans ma question ... Maintenant je m'en remet à vous !!

Merci d'avance.
Nono ;-)
 
M

Michel_M

Guest
Salut Nono,

1/pour savoir si ta zone est vide, essaies:

if application.countA(range("C" & Total & ":Z" & Total2))=0 then
passe à la suite
counta etant le mot anglais pour notre nbval


2/ ta syntaxe:

dim zone as range
Set Zone = Range("C" & Total & ":Z" & Total2)
for each Cell in zone...

rend ton déroulement très lent, il vaudrait mieux écrire:
for each cell in Range("C" & Total & ":Z" & Total2)

Je tire ca du site de Laurent Longre, the big Chief, (www.longre.free.fr) à la rubrique programmation/ accélérer VBA

Quant à la 2° partie, je regardes mais la journée fut rude, donc...
A+
Michel
 
M

Michel_M

Guest
Re,

Oublie ma réponse numéro 2 (lenteur): je n'en suis plus sûr du tout, sans doute la fatigue

Pour la 1° cellule non vide, c'est pas trop dur apparemment, je verrai demain si par hasard tu n'as pas eu de réponses...

Excuses moi

Michel
 
M

myDearFriend

Guest
Bonsoir Nono, Michel,

Afin d'optimiser le temps de d'exécution, je pense qu'il convient d'abord de transférer la zone de cellule dans un tableau variant puis d'effectuer les traitement directement dans ce tableau.

Pour exemple, voici 2 procédures qui font exactement la même chose :

Sub Test1()
Dim R As Range
Dim C As Range
Dim T As Double
Dim N As Long
T = Timer
Set R = Sheets(1).Range("A1:GZ30000")
For Each C In R
N = N + 1
If C.Value = "A" Then MsgBox "J'ai trouvé un 'A' !"
Next C
MsgBox "C'est fini! " & CStr(N) & " cellules testées en " & CStr(Timer - T) & " secondes"
End Sub

Sub Test2()
Dim TabTemp As Variant
Dim L As Long
Dim C As Long
Dim T As Double
Dim N As Long
T = Timer
TabTemp = Sheets(1).Range("A1:GZ30000").Value
For L = 1 To UBound(TabTemp, 1)
For C = 1 To UBound(TabTemp, 2)
N = N + 1
If TabTemp(L, C) = "A" Then MsgBox "J'ai trouvé un 'A' !"
Next C
Next L
MsgBox "C'est fini! " & CStr(N) & " cellules testées en " & CStr(Timer - T) & " secondes"
End Sub

Sur ma machine, la première version Test1 prend 49,25 secondes pour s'exécuter. La deuxième version ne prend que 2,91 secondes ! Y'a pas photo !


Ensuite, pour mettre à jour la feuille en fonction des éventuels traitements effectués dans le tableau variant, on fait l'opération inverse :

Sheets(1).Range("A1:GZ30000").Value = TabTemp

Par ailleurs, l'utilisation de "Application.ScreenUpdating = False" avant les traitements de mise à jour de feuille et "Application.ScreenUpdating = True" à l'issue des traitements permet également de gagner un temps précieux.
Cela permet de désactivez la mise à jour de l'écran et accélère grandement l'exécution du code.

Cordialement.
Didier
 
L

LaurentTBT

Guest
Bonjour à tous,

Un autre point important, aussi, pour optimiser le code, il faudrait savoir ce qu'il y a après le for each Cell in zone ...
Si par exemple le code passe par des "select", alors il y a moyen de gagner un temps fou!

Bonne journée.

Laurent.
 

Discussions similaires

Réponses
5
Affichages
372

Statistiques des forums

Discussions
312 312
Messages
2 087 149
Membres
103 484
dernier inscrit
maintenance alkern