OVH Cloud OVH Cloud

Code Lent

4 réponses
Avatar
Pascal
Bonjour à tous,
J'ai un code:
Sub Saisie()
i = [Date_Début]
j = [Date_fin]
Sheets("Général").Select
Range("A3:A367").Select
For Each Cell In Selection
If Cell > i And Cell <= j + 1 Then
Cell(Jour, 4).Value = [Heures_Début]
Cell(Jour, 5).Value = [Heures_Fin]
End If
Next
End Sub

Il fonctionne, mais il s'avère qu'il est très lent.
Est-ce du au code lui-même ou selon vous à autre chose (La taille de
A4:A367)

Merci

PB

4 réponses

Avatar
Bourby
bonjour,

as-tu employé en début de code
Application.ScreenUpdatingúlse
et en fin de code:
Application.ScreenUpdating=true

De plus, il est inutile de sélectionner la plage,
Range("A3:A367").Select
For Each Cell In Selection
tu peux écrire:

For Each Cell In Range("A3:A367")


Si ça ne suffit pas, tu peux encore éviter d'évaluer
360 fois [Heures_Début] et [Heures_Fin]
Pour cela, créer avant la boucle 2 variables VBA
heuresDébut=[Heures_Début]
heuresFin = [Heures_Fin]

et les réutiliser dans la boucle:
Cell(Jour, 4).Value = heuresDébut
Cell(Jour, 5).Value = [Heures_Fin]

Si ça ne suffit pas, ça dépasse mes compétences.

Cordialement

Bourby

"Pascal" a écrit dans le message news:

Bonjour à tous,
J'ai un code:
Sub Saisie()
i = [Date_Début]
j = [Date_fin]
Sheets("Général").Select
Range("A3:A367").Select
For Each Cell In Selection
If Cell > i And Cell <= j + 1 Then
Cell(Jour, 4).Value = [Heures_Début]
Cell(Jour, 5).Value = [Heures_Fin]
End If
Next
End Sub

Il fonctionne, mais il s'avère qu'il est très lent.
Est-ce du au code lui-même ou selon vous à autre chose (La taille de
A4:A367)

Merci

PB




Avatar
Pascal
Merci ,
Rien qu'avec Application.ScreenUpdating=true
Cela va beaucoup plus vite.
Mais pour ma simple gouverne à quoi cela correspond cette "Instruction"

Merci
Pascal
"Bourby" a écrit dans le message de news:

bonjour,

as-tu employé en début de code
Application.ScreenUpdatingúlse
et en fin de code:
Application.ScreenUpdating=true

De plus, il est inutile de sélectionner la plage,
Range("A3:A367").Select
For Each Cell In Selection
tu peux écrire:

For Each Cell In Range("A3:A367")


Si ça ne suffit pas, tu peux encore éviter d'évaluer
360 fois [Heures_Début] et [Heures_Fin]
Pour cela, créer avant la boucle 2 variables VBA
heuresDébut=[Heures_Début]
heuresFin = [Heures_Fin]

et les réutiliser dans la boucle:
Cell(Jour, 4).Value = heuresDébut
Cell(Jour, 5).Value = [Heures_Fin]

Si ça ne suffit pas, ça dépasse mes compétences.

Cordialement

Bourby

"Pascal" a écrit dans le message news:

Bonjour à tous,
J'ai un code:
Sub Saisie()
i = [Date_Début]
j = [Date_fin]
Sheets("Général").Select
Range("A3:A367").Select
For Each Cell In Selection
If Cell > i And Cell <= j + 1 Then
Cell(Jour, 4).Value = [Heures_Début]
Cell(Jour, 5).Value = [Heures_Fin]
End If
Next
End Sub

Il fonctionne, mais il s'avère qu'il est très lent.
Est-ce du au code lui-même ou selon vous à autre chose (La taille de
A4:A367)

Merci

PB








Avatar
Pascal
Voilà mon code final
C'est mieux
Sub normaux()
Application.ScreenUpdating = False

i = [Date_Début]
j = [Date_fin]
r = [Détail]
For Each Cell In [Détail]
If Cell > i And Cell <= j + 1 Then
Cell(jour, 4).Value = [Heures_Début]
Cell(jour, 5).Value = [Heures_Fin]
End If
Next
Application.ScreenUpdating = True
End Sub
C'est mieux???

"Bourby" a écrit dans le message de news:

bonjour,

as-tu employé en début de code
Application.ScreenUpdatingúlse
et en fin de code:
Application.ScreenUpdating=true

De plus, il est inutile de sélectionner la plage,
Range("A3:A367").Select
For Each Cell In Selection
tu peux écrire:

For Each Cell In Range("A3:A367")


Si ça ne suffit pas, tu peux encore éviter d'évaluer
360 fois [Heures_Début] et [Heures_Fin]
Pour cela, créer avant la boucle 2 variables VBA
heuresDébut=[Heures_Début]
heuresFin = [Heures_Fin]

et les réutiliser dans la boucle:
Cell(Jour, 4).Value = heuresDébut
Cell(Jour, 5).Value = [Heures_Fin]

Si ça ne suffit pas, ça dépasse mes compétences.

Cordialement

Bourby

"Pascal" a écrit dans le message news:

Bonjour à tous,
J'ai un code:
Sub Saisie()
i = [Date_Début]
j = [Date_fin]
Sheets("Général").Select
Range("A3:A367").Select
For Each Cell In Selection
If Cell > i And Cell <= j + 1 Then
Cell(Jour, 4).Value = [Heures_Début]
Cell(Jour, 5).Value = [Heures_Fin]
End If
Next
End Sub

Il fonctionne, mais il s'avère qu'il est très lent.
Est-ce du au code lui-même ou selon vous à autre chose (La taille de
A4:A367)

Merci

PB








Avatar
Olivier D.
Bonsoir,

Pour votre gouverne, il s'agit d'une instruction qui dit à
Excel ne pas afficher les modifications de la macros à
l'écran. Excel n'affiche rien durant l'évolution de la
macro et rafraîchit l'écran à la fin du traitement.

Bonne soirée,

Olivier

-----Message d'origine-----
Merci ,
Rien qu'avec Application.ScreenUpdating=true
Cela va beaucoup plus vite.
Mais pour ma simple gouverne à quoi cela correspond
cette "Instruction"


Merci
Pascal
"Bourby" a écrit dans le
message de news:


bonjour,

as-tu employé en début de code
Application.ScreenUpdatingúlse
et en fin de code:
Application.ScreenUpdating=true

De plus, il est inutile de sélectionner la plage,
Range("A3:A367").Select
For Each Cell In Selection
tu peux écrire:

For Each Cell In Range("A3:A367")


Si ça ne suffit pas, tu peux encore éviter d'évaluer
360 fois [Heures_Début] et [Heures_Fin]
Pour cela, créer avant la boucle 2 variables VBA
heuresDébut=[Heures_Début]
heuresFin = [Heures_Fin]

et les réutiliser dans la boucle:
Cell(Jour, 4).Value = heuresDébut
Cell(Jour, 5).Value = [Heures_Fin]

Si ça ne suffit pas, ça dépasse mes compétences.

Cordialement

Bourby

"Pascal" a écrit dans
le message news:



Bonjour à tous,
J'ai un code:
Sub Saisie()
i = [Date_Début]
j = [Date_fin]
Sheets("Général").Select
Range("A3:A367").Select
For Each Cell In Selection
If Cell > i And Cell <= j + 1 Then
Cell(Jour, 4).Value = [Heures_Début]
Cell(Jour, 5).Value = [Heures_Fin]
End If
Next
End Sub

Il fonctionne, mais il s'avère qu'il est très lent.
Est-ce du au code lui-même ou selon vous à autre
chose (La taille de



A4:A367)

Merci

PB








.