Boucle longue à s'exécuter.

Le
Roland Miller
Bonjour,

Je cherche à réduire le temps d'exécution d'une macro.

Le code au bas prend au moins 6 secondes à s'exécuter. Le range n=
'a pourtant que 10 cellules.

Croyez-vous qu'une formule pourrait être possible afin de savoir si la=
colonne est visible ou non? Ou une autre façon de faire?

Merci à l'avance.


For Each cell In Feuil42.Range("CN_RegulFilterRow2").Cells
If cell.Column <> Feuil42.Range("CN_RegulNumZone").Column Then
If cell.EntireColumn.Hidden = True Then
cell.Value = 1
Else
cell.Value = ""
End If
End If
Next
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichD
Le #26538321
Le 15/02/20 à 18:12, Roland Miller a écrit :
Bonjour,
Je cherche à réduire le temps d'exécution d'une macro.
Le code au bas prend au moins 6 secondes à s'exécuter. Le range n'a pourtant que 10 cellules.
Croyez-vous qu'une formule pourrait être possible afin de savoir si la colonne est visible ou non? Ou une autre façon de faire?
Merci à l'avance.
For Each cell In Feuil42.Range("CN_RegulFilterRow2").Cells
If cell.Column <> Feuil42.Range("CN_RegulNumZone").Column Then
If cell.EntireColumn.Hidden = True Then
cell.Value = 1
Else
cell.Value = ""
End If
End If
Next


Bonjour,
En supposant que j'ai bien compris ce que tu voulais faire...
N.B. C'est quand même bien d'expliquer un peu ce que tu veux faire
plutôt que de nous demander de le déduire à partir de ton code!
'----------------------------------
Sub test()
Dim Col As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each Col In Feuil42.Range("CN_RegulFilterRow2").Columns
If Intersect(Col, Feuil42.Range("CN_RegulNumZone")) Is Nothing Then
If Col.EntireColumn.Hidden = True Then
Col.Value = 1
Else
Col.Value =""
End If
End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'----------------------------------
MichD
patrice.blasquez
Le #26538336
Bonjour,
Tu pourrais aussi limiter l'exploration à la zone utilisée
For Each cell In Feuil42.Range("CN_RegulFilterRow2").UsedRange.Cells
Roland Miller
Le #26538408
Bonjour,
Concernant … N.B. C'est quand même bien d'expliquer un peu ce que tu veux faire
plutôt que de nous demander de le déduire à partir de ton co de!
OK. Merci de me le mentionner. Je vais m'efforcer de le faire.
Merci je vais appliquer cette méthode.
Geo
Le #26538452
Bonjour
OK. Merci de me le mentionner. Je vais m'efforcer de le faire.

Ca va faire grimper la facture.
Geo
Le #26538451
Tu pourrais aussi limiter l'exploration à la zone utilisée
For Each cell In Feuil42.Range("CN_RegulFilterRow2").UsedRange.Cells

Autant que je me souvienne le for each est très gourmand.
Pour une zone simple, ici une portion de colonne, il vaut mieux
calculer les bornes,
puis faire un for i = ... to ...
patrice.blasquez
Le #26538771
Le lundi 17 février 2020 13:30:11 UTC+1, Geo a écrit :
Tu pourrais aussi limiter l'exploration à la zone utilisée
For Each cell In Feuil42.Range("CN_RegulFilterRow2").UsedRange.Cells

Autant que je me souvienne le for each est très gourmand.
Pour une zone simple, ici une portion de colonne, il vaut mieux
calculer les bornes,
puis faire un for i = ... to ...

For Each Cell In Feuil42.Range("CN_RegulFilterRow2").UsedRange.Cells
est moins gourmand que
For ib to fin
Il ne faut que 4 octets pour Cell (type Range) et Feuil42 existe en natif.
Il faut 4+4+4 = 12 octets pour i + deb + fin (type Long)!
Mais il y a maintenant plusieurs décennies qu'on ne se préoccupe plus de ces quelques octets de différence.
Geo
Le #26538774
Bonjour
Mais il y a maintenant plusieurs décennies qu'on ne se préoccupe plus de ces
quelques octets de différence.

Il me semble qu'on parlait surtout de vitesse d'exécution.
Or, justement, il vaut mieux travailler en type long qu'en integer car
le processeur travaille en type long, contrairement à autrefois.
Publicité
Poster une réponse
Anonyme