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

Rechercher des sujets similaires à "execution code trop longue"