Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle longue à s'exécuter.

7 réponses
Avatar
Roland Miller
Bonjour,

Je cherche =C3=A0 r=C3=A9duire le temps d'ex=C3=A9cution d'une macro.

Le code au bas prend au moins 6 secondes =C3=A0 s'ex=C3=A9cuter. Le range n=
'a pourtant que 10 cellules.

Croyez-vous qu'une formule pourrait =C3=AAtre possible afin de savoir si la=
colonne est visible ou non? Ou une autre fa=C3=A7on de faire?

Merci =C3=A0 l'avance.


For Each cell In Feuil42.Range("CN_RegulFilterRow2").Cells
If cell.Column <> Feuil42.Range("CN_RegulNumZone").Column Then
If cell.EntireColumn.Hidden =3D True Then
cell.Value =3D 1
Else
cell.Value =3D ""
End If
End If
Next

7 réponses

Avatar
MichD
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
Avatar
patrice.blasquez
Bonjour,
Tu pourrais aussi limiter l'exploration à la zone utilisée
For Each cell In Feuil42.Range("CN_RegulFilterRow2").UsedRange.Cells
Avatar
Roland Miller
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.
Avatar
Geo
Bonjour
OK. Merci de me le mentionner. Je vais m'efforcer de le faire.

Ca va faire grimper la facture.
Avatar
Geo
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 ...
Avatar
patrice.blasquez
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 iÞb 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.
Avatar
Geo
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.