Exécution de code trop longue
Bonjour,
J'ai une extraction de données à réaliser à partir d'une feuille de calcul comprenant environ 9000 lignes et une trentaine de colonnes.
Voici la structure du code. J'ai placé une partie du code en explication "française" de ce qui est réalisé pour l'alléger.
Application.ScreenUpdating = False
'Déclaration et initialisation des variables
'Parcours de toute une colonne avec une boucle for afin de connaître la dernière ligne du tableau
'Boucle principale :
For Each c In Sheets(1).Range(Cells(2, 4), Cells(Lder, 4)).Cells
'Récupération d'une date qui peut se trouver dans trois colonnes
If Cells(c.Row, 19).Value <> "" Then
Ferme(c.Row) = Cells(c.Row, 19).Value
ElseIf Cells(c.Row, 22).Value <> "" Then
Ferme(c.Row) = Cells(c.Row, 22).Value
ElseIf Cells(c.Row, 23).Value <> "" Then
Ferme(c.Row) = Cells(c.Row, 23).Value
End If
'Remplissage de la feuille d'extraction si la variable Ferme() indique que le travail de la ligne a été cloturé
If Ferme(c.Row) <> "" Then
Sheets(2).Cells(Lencours, CRF).Value = Sheets(1).Cells(c.Row, 5).Value & "-001"
Sheets(2).Cells(Lencours, Cdatedebut).Value = c.Value
Sheets(2).Cells(Lencours, Cdatefin).Value = Ferme(c.Row)
Sheets(2).Cells(Lencours, Ctypeaction).Value = TypeAction(c.Row)
Sheets(2).Cells(Lencours, Ccouleur).Value = Couleur(c.Row)
Sheets(2).Cells(Lencours, Cdemandeur).Value = Sheets(1).Cells(c.Row, 9).Value
Sheets(2).Cells(Lencours, Ccommentaires).Value = Sheets(1).Cells(c.Row, 24).Value
Sheets(2).Cells(Lencours, Cxxx).Value = Sheets(1).Cells(c.Row, 25).Value
Sheets(2).Cells(Lencours, COT).Value = Sheets(1).Cells(c.Row, 15).Value
Sheets(2).Cells(Lencours, CRClassement).Value = Sheets(1).Cells(c.Row, 6).Value
Sheets(2).Cells(Lencours, Cyyy).Value = Sheets(1).Cells(c.Row, 3).Value
Lencours = Lencours + 1
End If
Next c
Application.ScreenUpdating = True
Je pense que c'est le remplissage de la feuille qui prend du temps mais je ne vois pas comment racourcir ces opérations... Actuellement le temps de traitement est d'environ 30min...
Si vous avez une idée je suis preneur
Merci d'avance !
Bonjour
Une idée à tester
Sub test()
Dim ModeDeCalcul As Integer
With Application
.ScreenUpdating = False
.EnableEvents = False
ModeDeCalcul = .Calculation
.Calculation = xlCalculationManual
End With
'Déclaration et initialisation des variables
'Parcours de toute une colonne avec une boucle for afin de connaître la dernière ligne du tableau
'Boucle principale :
' ....
' ....
' ....
Lencours = Lencours + 1
End If
Next c
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = ModeDeCalcul
End With
End Sub
C'est super merci beaucoup.
Y'a-t-il moyen de me dire un mot sur ce que tu as rajouté ?
Bonjour à toi aussi
Un mot ?
Sub test()
Dim ModeDeCalcul As Integer
With Application
.ScreenUpdating = False ' Bloque le rafraîchissement écran
.EnableEvents = False ' Bloque les évènements
ModeDeCalcul = .Calculation ' Récupère le mode de calcul en cours
.Calculation = xlCalculationManual ' Passe en calcul manuel (sur ordre)
End With
'Déclaration et initialisation des variables
'Parcours de toute une colonne avec une boucle for afin de connaître la dernière ligne du tableau
'Boucle principale :
' ....
' ....
' ....
Lencours = Lencours + 1
End If
Next c
With Application
.ScreenUpdating = True ' Débloque le rafraîchissement écran
.EnableEvents = True ' Débloque les évènements (très important)
.Calculation = ModeDeCalcul ' Replace dans l'état initial
End With
End Sub
Bonjour et merci pour tes explications.
Je cherche simplement à comprendre pourquoi ce code permet en effet d'améliorer le traitement du code.
Quels type d'évenements sont bloqués par ".EnableEvents = False " ?
De même j'avais cru comprendre que le ".Calculation = xlCalculationManual" évite le recalcul des formules de excel hors je n'en ai pas.
Pourtant c'est bien c'est deux instructions qui améliorent considérablement le temps d'execution du code
Bonjour
timay83 a écrit :Quels type d'évenements sont bloqués par ".EnableEvents = False " ?
Tout événement déclenché automatiquement par une action
Modification d'une cellule, déplacement de la sélection d'une cellule, ouverture d'un classeur,fermeture d'un classeur, impression activation d'une feuille, désactivation d'une feuille etc ... etc ...
Généralement on utilise ce code pour éviter le déclenchement de l'évènement lors de la modification d'une cellule, car c'est ce genre d'évènement que l'on code le plus souvent
timay83 a écrit :évite le recalcul des formules de excel hors je n'en ai pas.
Comment dire ces instructions font partie d'un "package" ce n'est pas le fait de les utiliser qui gène le programme