Optimisation temps d'exécution de macro

Bonjour à tous,

J'ai rencontré un problème dans mon fichier excel avec macro. Mon code fonctionne comme je le voudrai pour créer mes documents. Cependant le temps d'exécution est trop long surtout sur le dernier module dont j'ai besoin (Code_Partie5_BD3).
Pouvez vous m'aider a optimiser mon code ?

De plus j'ai 4 liaisons que je n'arrive pas a supprimer.

Je voulais joindre un fichier mais celui ci est trop volumineux. Comment puis je faire ? je vous joins le code quand meme.

Dim dlg&, i&, ht&, Fin&, x&, y& 'Déclarer variable
Dim CEL, PLAGE As Range 'Déclarer variable

Sub RempBD3()

        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '''''''Après avoir rempli les cellules de la feuille''''''''
        '''''''''''''''''''Cliquer sur le bouton''''''''''''''''''''
        '''''''Renvoie les valeurs de la feuille BD3 vers AR''''''''
        '''''''Renvoie les valeurs de la feuille BD3 vers FTI'''''''
        '''''''Renvoie les valeurs de la feuille BD3 vers FTF'''''''
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    With Sheets("BD3") 'Dans la feuille BD3
        Worksheets("BD3").Select 'Activer onglet
        dlg = Sheets("BD3").Range("B" & Rows.Count).End(xlUp).Row  'Calcul dernière ligne
        .Rows("9:" & dlg).Copy Sheets("BD1").Rows("9:9") 'Renvoie les valeurs vers BD1
        Application.CutCopyMode = False 'Fin du mode copier couper coller
    End With

    Sheets("BD3").Copy After:=Sheets(3) 'Copie de l'onglet BD

    With Sheets("BD3 (2)") 'Dans la feuille BD3 (2)
        Worksheets("BD3 (2)").Visible = True 'Afficher onglet
        Worksheets("BD3").Visible = False 'Fermer onglet
        Sheets("BD3 (2)").Select 'Activer la feuille
        ActiveWindow.FreezePanes = False 'Libérer les volets
        ActiveSheet.DrawingObjects.Delete 'Supprimer les objets
        .Columns("L:M").Delete 'Supprimer colonnes L et M
        .Columns("A:A").Cut 'Couper colonne A
        .Columns("P:P").Insert shift:=xlToRight 'Insérer
        Application.CutCopyMode = False 'Fin du mode copier couper coller
        .PageSetup.Orientation = xlLandscape 'Mettre en format paysage
        .PageSetup.PaperSize = xlPaperA4 'Mettre au format A4
        .PageSetup.LeftMargin = Application.InchesToPoints(0) 'Valeur marge gauche
        .PageSetup.RightMargin = Application.InchesToPoints(0) 'Valeur marge droite
        .PageSetup.TopMargin = Application.InchesToPoints(0.15748031496063) 'Valeur marge haut
        .PageSetup.BottomMargin = Application.InchesToPoints(1) 'Valeur marge bas
        .PageSetup.HeaderMargin = Application.InchesToPoints(0.31496062992126) 'Valeur marge en tete
        .PageSetup.FooterMargin = Application.InchesToPoints(0.31496062992126) 'Valeur marge pied de page
        Sheets("ModAR").Rows("10:17").Copy 'Copier
        Sheets("BD3 (2)").Rows("1:1").Select 'Collage spécial
        Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
              SkipBlanks:=False, Transpose:=False
        ActiveSheet.Paste
        Application.CutCopyMode = False 'Fin du mode copier couper coller
        ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
        ActiveWindow.View = xlNormalView 'Affichage en mode normal
        dlg = .Range("A" & Rows.Count).End(xlUp).Row  'Calcul dernière ligne
        For i = 9 To dlg 'Pour chaque ligne
            .Rows(i).AutoFit 'Ajuster automatiquement la hauteur de ligne
            ht = Application.WorksheetFunction.RoundUp((.Rows(i).RowHeight / 15), 0) * 15 'Calcul valeur arrondie supérieur de la hauteur
            .Rows(i).RowHeight = ht 'Mettre la valeur de la hauteur à ht
        Next i
        For i = 10 To dlg + 10000 'Pour les lignes de 10 à la dernière +5000
            A = .Range("O" & i).Value 'Valeur de la variable
            e = .Range("O" & i - 1).Value 'Valeur de la variable
            If A = "" Then Exit For 'Sortir si vide
                If A <> e Or .Rows(i).PageBreak <> xlNone Then  'Si valeur a différente de valeur e ou saut de page présent
                    Sheets("ModAR").Rows("20:26").Copy 'Copier
                    .Rows(i).Insert shift:=xlDown 'Insérer
                    Application.CutCopyMode = False 'Fin du mode copier couper coller
                    Sheets("BD3 (2)").Select 'Activé onglet
                    .HPageBreaks.Add before:=Range("A" & i)  'Ajout saut de page
                    ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                    ActiveWindow.View = xlNormalView 'Affichage en mode normal
                    i = i + 7 'Ajout de lignes à la variable
                End If
        Next i
        dlg = .Range("A" & Rows.Count).End(xlUp).Row + 1 'Calcul dernière ligne
        .HPageBreaks.Add before:=Rows(dlg) 'Ajout saut de page
        For i = 1 To .HPageBreaks.Count 'Pour les sauts de page de l'onglet
            Valeur = Cells(.HPageBreaks(i).Location.Row - 1, 15) 'Valeur = cellule à l'intersection de la colonne M, ligne du saut de page -1
            Select Case i 'Selectionner le cas selon la valeur
                Case 1 ' I = 1
                    Set PLAGE = .Range(.Cells(1, 1), .Cells(.HPageBreaks(i).Location.Row - 1, 1)) 'PLAGE = B1:B & ligne saut de page -1
                Case .HPageBreaks.Count + 1 'I = Dernier saut de page
                    Set PLAGE = .Range(.Cells(.HPageBreaks(i).Location.Row, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)) 'PLAGE = B & Ligne dernier saut de page & B & dernière ligne
                Case Else 'Dans tous les autres cas
                    Set PLAGE = .Range(.Cells(.HPageBreaks(i - 1).Location.Row, 1), .Cells(.HPageBreaks(i).Location.Row - 1, 1)) 'PLAGE = B & saut de page I - 1 : B & Saut de page I - 1 ligne
            End Select
            For Each CEL In PLAGE 'Pour chaque cellule de la plage
                If CEL Like "*Numéro et nom*" Then 'Si contient numéro et nom
                    .Cells(CEL.Row, 6) = Valeur 'Si la cellule est égal "*Numéro et nom*" alors on attribue la valeur
                    If Len(.Range("G" & CEL.Row)) > 64 Then 'Si longueur de text supérieur à 64
                        ht = Application.WorksheetFunction.RoundUp((.Rows(CEL.Row).RowHeight), 0) * 1.5 'Calcul valeur arrondie supérieur de la hauteur
                        .Rows(CEL.Row).RowHeight = ht 'Mettre la valeur de la hauteur à ht
                        .Rows(CEL.Row + 1).RowHeight = 10 'Mettre valeur de hauteur à 10
                    End If
                End If
            Next CEL
            Valeur1 = Cells(.HPageBreaks(i).Location.Row, 1) 'Valeur = cellule à l'intersection de la colonne M, ligne du saut de page -1
            If Valeur1 = "" Then Exit For 'Si vide sortir
        Next i
        .Columns("O:O").Delete shift:=xlToLeft 'Suppression colonne
        Fin = .Range("A" & Rows.Count).End(xlUp).Row 'Calcul dernière ligne
    End With

    Worksheets("AR").Visible = True 'Afficher onglet

    With Sheets("AR") 'Dans la feuille AR
        Sheets("AR").Select 'Activer la feuille
        dlg = .Range("B" & Rows.Count).End(xlUp).Row + 2 'Calcul dernière ligne
        Sheets("BD3 (2)").Rows("1:" & Fin).Copy 'Copier
        .Rows(dlg).Insert shift:=xlDown 'Inserer
        Application.CutCopyMode = False 'Fin du mode copier couper coller
        For Each CEL In .Range("A10:A" & .UsedRange.Rows.Count) 'Pour chaque cellule de la colonne A
            If CEL.Value Like "*Titre du document*" Then 'Si la cellule contient Titre
                .HPageBreaks.Add before:=Rows(CEL.Row) 'Ajout saut de page
            End If
        Next CEL
        Application.DisplayAlerts = False 'Empecher affichage message d'erreur
        Sheets("BD3 (2)").Select 'Selectionner l'onglet BD2 (2)
        ActiveWindow.SelectedSheets.Delete 'Supprimer la selection
        Application.DisplayAlerts = True 'Remettre affichage message erreur
        Sheets("AR").Select 'Activer la feuille
        x = Sheets("AR").HPageBreaks.Count
        dlg = .Range("A" & Rows.Count).End(xlUp).Row + 2
        Sheets("ModAR").Rows("1:5").Copy Sheets("AR").Rows(dlg)
        y = Sheets("AR").HPageBreaks.Count
        If y > x Then
            Sheets("AR").Select 'Activer la feuille
            Sheets("ModAR").Rows("125:131").Copy
            .Rows(dlg - 2).Insert shift:=xlDown
            Fin = Sheets("PérimètreAR").Range("B" & Rows.Count).End(xlUp).Row
            .Range("F" & dlg + 1) = Sheets("PérimètreAR").Range("B" & Fin)
            If Len(.Range("G" & dlg + 1)) > 64 Then
                ht = Application.WorksheetFunction.RoundUp((.Rows(dlg + 1).RowHeight), 0) * 1.5
                .Rows(dlg + 1).RowHeight = ht
                .Rows(dlg + 2).RowHeight = 10
            End If
            .HPageBreaks.Add before:=Rows(dlg - 2)
        End If
        x = Sheets("AR").HPageBreaks.Count
        Do While y = x
            dlg = .Range("A" & Rows.Count).End(xlUp).Row - 4
            Sheets("AR").Rows(dlg).Select
            Selection.Insert shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            y = Sheets("AR").HPageBreaks.Count
        Loop

        Call PagAR 'Mise à jour pagination
    End With

    Call FTI 'Renvoie le code_partie41
    Call PagFTI 'Pagination FTI

    Call FTF 'Renvoie le code_partie42
    Call PagFTF 'Pagination FTF

    Application.ScreenUpdating = True
    Application.EnableEvents = True

    Worksheets("FTF").Visible = True 'Afficher onglet
    Worksheets("FTI").Visible = True 'Afficher onglet
    Worksheets("AR").Visible = True 'Afficher onglet
    Worksheets("PRT").Visible = True 'Afficher onglet
    Worksheets("BD3").Visible = False 'Masquer onglet
End Sub

Bien cordialement,

Mika

Hello,

Tu peux passer le calcul auto en manuel, puis le remettre en fin de procédure :

Application.Calculation = xlCalculationManual 

Mais pour moi ce qui te bouffes un paquet de temps, ce sont tes insert de ligne en boucle ....

Par exemple :

For i = 10 To dlg + 10000 'Pour les lignes de 10 à la dernière +5000
            A = .Range("O" & i).Value 'Valeur de la variable
            e = .Range("O" & i - 1).Value 'Valeur de la variable
            If A = "" Then Exit For 'Sortir si vide
                If A <> e Or .Rows(i).PageBreak <> xlNone Then  'Si valeur a différente de valeur e ou saut de page présent
                    Sheets("ModAR").Rows("20:26").Copy 'Copier
                    .Rows(i).Insert shift:=xlDown 'Insérer

Si tu dois ajouter 5000 lignes ...

Faut que tu revois ta méthodologie pour diminuer l'insertion des lignes.

bonjour, je ne comprend pas tout ces pagebreaks, ils servent à quoi, imprimer ? vers PDF ?

Le reste est trop complique pour lire et comprendre le but final. Vous n'avez pas un fichier avec une situation AVANT et APRES et une courte description.

Bonjour,

Merci pour vos retours,

@Rag02700 je suis entrain de revoir la méthodologie justement pour limiter le code mais c'est très compliqué.

@BsAlv Effectivement tout les pagebreaks sont la pour une mise en page (c'est une contrainte donnée dés le début, malheureusement pour moi). En ce qui concerne un fichier avant et après cela est compliqué mon fichier est trop volumineux ...

Bien cordialement,

Mika51

sauf pour imprimer, ces pagebreaks, ils servent à quelque chose ? Autrement, c'est plus facile de les créer (virtuellement) à ce moment. Imprimer, c'est PDF ou sur papier ?

Un fichier exemplaire, ce n'est qu'une 10-20 règles ou une courte description de tout ce que cette macro fait.

Voici a quoi ressemble l'onglet BD3

image

a partir de cette base de donné le but est de remplir plusieurs onglet qui ont chacun des contraintes de mises en page

en gros j'ai un titre a ajouter à toute les pages (ce titre n'est pas le meme)

donc comment gérer virtuellement c'est saut de page ?

par exemple ajuster l'hauteur, ceci est déjà une amélioration, mais pourquoi choisir une hauteur de 15 au lieu du standard 14.25 ?

une différence de +5 sec sur 1.000 lignes

La macro "teste" ajuste en une fois toutes les lignes 9:1000 et puis vérifie si l'hauteur doit être ajuster en haut vers un multiple de rh. (Attention ce multiple ne peut pas être supérieur à 409)

Sub teste()

     dlg = 1000
     With ActiveSheet
          rh = 14.25  'plus tard changer ce 14.25 en 15
          t = Timer
          .Rows("9:" & dlg).AutoFit    'en une fois, Ajuster automatiquement la hauteur de ligne
          For i = 9 To dlg     'Pour chaque ligne
               ht = Application.Min(409, WorksheetFunction.Ceiling_Math(.Rows(i).RowHeight, rh))    'Calcul valeur arrondie supérieur de la hauteur
               If ht > .Rows(i).RowHeight Then .Rows(i).RowHeight = ht    'seulement quand il est supérieur, Mettre la valeur de la hauteur à ht
          Next i
          MsgBox Format(Timer - t, "0.00")
     End With
End Sub

Bonjour,

Merci beaucoup.

Si vous avez d'autres types d'amélioration je suis preneur.

Bien cordialement,

bonjour,

c'est difficile a dire où vous gagnerez le max du temps, mais si vous savez au minimum la duréé de chaque partie de cette macro.

Vous pouvez ajouter ma macro MyTimers et les déclarations en haut et puis apres chaque partie faire un saute vers cette macro avec un numéro croissant.

Après l'execution, vous pouvez choisir le plus grand et cherchez à eliminer du temps ou me dire cette partie est à améliorer .

Vous pouvez déjà essayer avec la macro 'MaMacro", lancez-le, il y a 3 msgbox dedans, attendez un moment variable à chaque msgbox et voyez le résultat

Public Timers(1 To 100, 1 To 4), iT

Sub MaMacro()

     MesTimers 1, "début"

     MsgBox "maintenant la 1ière partie du macro"
     MesTimers 2, "après part1"

     MsgBox "maintenant la 2ière partie du macro"
     MesTimers 3, "après part2"

     MsgBox "maintenant la 3ieme partie du macro"
     MesTimers 4, "Fin"

     s = ""
     For i = LBound(Timers) To UBound(Timers)
          If Len(Timers(i, 4)) > 0 Then
               s = s & vbLf & Format(Timers(i, 2), "0.0\s") & "   " & Format(Timers(i, 3), "0.0\s") & "   " & Timers(i, 4)
          End If
     Next

     If Len(s) > 0 Then MsgBox Mid(s, 2)

End Sub

Sub MesTimers(Numéro, Texte)
     If LBound(Timers) <= Numéro And Numéro <= UBound(Timers) Then
          Timers(Numéro, 1) = Timer
          Timers(Numéro, 2) = Timer - Timers(1, 1)     'temps des le début
          If Numéro > 1 Then Timers(Numéro, 3) = Timer - Timers(Numéro - 1, 1) Else Timers(1, 3) = 0    'temps pour cet element
          Timers(Numéro, 4) = Texte
     Else
          MsgBox "mauvaise indexe " & Numéro, vbInformation
     End If
End Sub

Merci de ta réponse

Mais je ne vois pas comment utiliser ta macro, ou dois je mettre mon code ?

en annexe la macro initiale avec des lignes supplémentaires, x est un numéro croissant (de 1 à 100) et "Explication" est un texte qui explique ce que la partie précédente a fait.

MesTimers x, "Explication"

Après vous recevez un msgbox avec en première colonne le temps cumulatif, 2ième colonne le temps de cette partie et 3ième colonne l'explication. Maintenant cherchez le maximum dans la 2ième colonne, normallement on a une meilleur chance de gagner plus de temps avec celui-là.

Merci pour l'explication

timer 1 = 0s

timer 2 = 0.5 s

timer 3 = 36.9s

timer 4 = 30.5s

timer 5 = 0.8s

timer 6 = 1.6s

timer 7 = 393.9

timer 8 = 0.5s

timer 9 = 417s

timer 10 = 0.6s

timer 11 = 0.6s

Voila le temps

donc je pense que FTI et FTF sont à améliorer ...

Dim c&, d&, lig&, dlgTI&, y&, dlg&, x&, Fin&, alpha&, iota&, beta&, ht&, i& 'Déclarer variable
Dim CEL As Range 'Déclarer variable

Sub FTI()

        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '''''''Après avoir rempli les cellules de la feuille''''''''
        '''''''''''''''''''Cliquer sur le bouton''''''''''''''''''''
        '''''''Renvoie les valeurs de la feuille BD3 vers FTI'''''''
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
t = Timer
    With Sheets("FTI") 'Dans la feuille
        Worksheets("FTI").Visible = True 'Ouvrir onglet
        Worksheets("AR").Visible = False 'Masquer onglet
        c = 6 'Valeur variable
        d = 8 'Valeur variable
        lig = 0 'Valeur variable
        dlgTI = Sheets("TI").Range("B" & Rows.Count).End(xlUp).Row 'Calcul dernière ligne en TI
        y = dlgTI - 7 'Valeur variable
        If y <> 0 Then 'Si variable y différent de 0
            Sheets("ModFT").Rows("1:1").Copy 'Copier
            .Rows("1:1").PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
                    SkipBlanks:=False, Transpose:=False 'Collage spéciale largueur colonne
            Sheets("ModFT").Rows("1:5").Copy .Rows("1") 'Copier coller
            Application.CutCopyMode = False 'Fin du mode copier couper coller
            For x = 1 To y 'Pour toutes les valeurs de y allant de 1 à y
                Fin = .Range("F" & Rows.Count).End(xlUp).Row + 1 'Calcul dernière ligne
                Sheets("ModFT").Rows("6:9").Copy 'copier
                .Rows(Fin).Insert shift:=xlDown  'Insérer
                Application.CutCopyMode = False 'Fin du mode copier couper coller
                dlg = Sheets("BD3").Range("A" & Rows.Count).End(xlUp).Row  'Calcul dernière ligne
                For Each CEL In Sheets("BD3").Range("K9:K" & dlg) 'Pour toutes les cellules en colonne J de l'onglet BD3
                    If CEL.Value = Sheets("TI").Range("B" & d).Value Then 'Si la valeur de CEL est égal à celle de l'onglet TI
                    On Error Resume Next 'Si erreur passer à la suivante
                    lig = Sheets("FTI").Range("A1:A" & Fin).Find(CEL.Value, LookIn:=xlValues, lookat:=xlWhole).Row 'Recherche valeur CEL dans l'onglet FTI
                    alpha = Len(.Range("F" & c + 2).Value) 'Compter le nombre de caractère
                    iota = Len(.Range("C" & c + 2).Value) 'Compter le nombre de caractère
                        If alpha > iota Then 'Comparer nb de caractère
                            beta = alpha / 25 'Variable pour nombre de ligne dans une cellule
                        ElseIf iota > alpha Then 'Comparer nb de caractère
                            beta = iota / 25 'Variable pour nombre de ligne dans une cellule
                        End If
                        If beta > 14 Then ' Si variable supérieur à 15
                            Sheets("ModFT").Rows("25:26").Copy 'Copier
                            .Rows(c + 3).Insert shift:=xlDown  'Insérer
                            c = c + 2 'Incrémenter variable
                            alpha = 0 'Réinitialiser variable
                            iota = 0 'Réinitialiser variable
                            beta = 0 'Réinitialiser variable
                            Application.CutCopyMode = False 'Fin du mode copier couper coller
                        End If
                        Select Case lig 'Selectionner valeur lig
                            Case Is = 0 'Si valeur = 0
                                .Range("A" & c).Value = Sheets("TI").Range("B" & d).Value 'Renvoie valeur de TI vers FTI
                                .Range("B" & c).Value = "- " & Sheets("TI").Range("C" & d).Value 'Renvoie valeur de TI vers FTI
                                .Range("A" & c + 2).Value = Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                .Range("F" & c + 2).Value = Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                .Range("C" & c + 2).Value = Sheets("BD3").Range("Q" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                .Range("E" & c).Value = Sheets("BD3").Range("O" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTF
                            Case Else 'Autre valeur
                                If Sheets("BD3").Range("M" & CEL.Row).Value <> .Range("A" & c + 2).Value Then 'Si les deux valeurs sont différentes
                                    If alpha = 0 Then ' Si alpha = 0
                                        .Range("A" & c + 2).Value = Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                        .Range("F" & c + 2).Value = Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                        .Range("C" & c + 2).Value = Sheets("BD3").Range("Q" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                    Else 'Sinon
                                        .Range("A" & c + 2).Value = .Range("A" & c + 2).Value & Chr(10) & Chr(10) & Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                        .Range("F" & c + 2).Value = .Range("F" & c + 2).Value & Chr(10) & Chr(10) & Sheets("BD3").Range("P" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                        .Range("C" & c + 2).Value = .Range("C" & c + 2).Value & Chr(10) & Chr(10) & Sheets("BD3").Range("Q" & CEL.Row).Value 'Renvoie valeur de BD3 vers FTI
                                    End If
                                End If
                        End Select
                    End If
                lig = 0 'Valeur variable
                .Rows(c + 2).AutoFit 'Ajuster automatiquement la hauteur de ligne
                ht = Application.WorksheetFunction.RoundUp((.Rows(c + 2).RowHeight / 15), 0) * 15 'Calcul valeur arrondie supérieur de la hauteur
                    If ht < 45 Then 'Si hauteur inférieur à 45
                        .Rows(c + 2).RowHeight = 45 'Mettre hauteur de ligne à 45
                    Else 'Sinon
                        .Rows(c + 2).RowHeight = ht 'Mettre la valeur de la hauteur à ht
                    End If
                Next CEL
                c = c + 4 'Incrémenter la variable
                d = d + 1 'Incrémenter la variable
            Next x
        End If
        .Columns("F:F").ClearContents 'Effacer le contenu des cellules de la colonne F
        dlg = Sheets("BD3 (2)").Range("A" & Rows.Count).End(xlUp).Row * 4 'Calcul dernière ligne
        For i = 9 To dlg  'Pour chaque ligne de 9 à derniere ligne
            If .Rows(i).PageBreak <> xlNone Then 'Si presence saut de page
                If .Range("A" & i) Like "*TI*" Then 'Si la cellule contient TI
                    Sheets("ModFT").Rows("82:86").Copy 'Copier
                    .Rows(i).Insert shift:=xlDown 'Insérer
                    .HPageBreaks.Add before:=Range("A" & i)  'Ajout saut de page
                    Application.CutCopyMode = False 'Fin du mode copier couper coller
                    ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                    ActiveWindow.View = xlNormalView 'Affichage en mode normal
                    i = i + 4 'Incrémenter variable
                ElseIf .Range("A" & i) Like "*Scénario*" Then 'Si la cellule contient Scénario
                    If .Range("A" & i - 1) Like "*TI*" Then 'Si la cellule contient TI
                        Sheets("ModFT").Rows("82:86").Copy 'Copier
                        .Rows(i - 1).Insert shift:=xlDown 'Insérer
                        .HPageBreaks.Add before:=Range("A" & i - 1) 'Ajout saut de page
                        Application.CutCopyMode = False 'Fin du mode copier couper coller
                        ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                        ActiveWindow.View = xlNormalView 'Affichage en mode normal
                        i = i + 4 'Incrémenter variable
                    Else 'Sinon
                        Sheets("ModFT").Rows("82:86").Copy 'Copier
                        .Rows(i).Insert shift:=xlDown 'Insérer
                        .HPageBreaks.Add before:=Range("A" & i) 'Ajout saut de page
                        Application.CutCopyMode = False 'Fin du mode copier couper coller
                        ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                        ActiveWindow.View = xlNormalView 'Affichage en mode normal
                        i = i + 4 'Incrémenter variable
                    End If
                ElseIf .Range("A" & i) <> "" Then 'Si la cellule est non vide
                    If .Range("A" & i - 1) Like "*Scénario*" Then 'Si la cellule contient Scénario
                        If .Range("A" & i - 2) Like "*TI*" Then 'Si la cellule contient TI
                            Sheets("ModFT").Rows("82:86").Copy 'Copier
                            .Rows(i - 2).Insert shift:=xlDown 'Insérer
                            .HPageBreaks.Add before:=Range("A" & i - 2) 'Ajout saut de page
                            Application.CutCopyMode = False 'Fin du mode copier couper coller
                            ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                            ActiveWindow.View = xlNormalView 'Affichage en mode normal
                            i = i + 4 'Incrémenter variable
                        Else 'Sinon
                            Sheets("ModFT").Rows("82:86").Copy 'Copier
                            .Rows(i - 1).Insert shift:=xlDown 'Insérer
                            .HPageBreaks.Add before:=Range("A" & i - 1) 'Ajout saut de page
                            Application.CutCopyMode = False 'Fin du mode copier couper coller
                            ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                            ActiveWindow.View = xlNormalView 'Affichage en mode normal
                            i = i + 4 'Incrémenter variable
                        End If
                    End If
                Else 'Sinon
                    If .Range("A" & i + 1) Like "*TI*" Then 'Si la cellule contient TI
                        .Rows(i).Delete
                        Sheets("ModFT").Rows("82:86").Copy 'Copier
                        .Rows(i).Insert shift:=xlDown 'Insérer
                        .HPageBreaks.Add before:=Range("A" & i) 'Ajout saut de page
                        Application.CutCopyMode = False 'Fin du mode copier couper coller
                        ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
                        ActiveWindow.View = xlNormalView 'Affichage en mode normal
                        i = i + 4 'Incrémenter variable
                    End If
                End If
            End If
        Next i
        dlg = .Range("A" & Rows.Count).End(xlUp).Row + 2 'Calcul dernière ligne
        Sheets("ModFT").Rows("30:47").Copy 'Copier
        .Rows(dlg).Insert shift:=xlDown 'Insérer
        Application.CutCopyMode = False 'Fin du mode copier couper coller
        Sheets("FTI").HPageBreaks.Add before:=Range("A" & dlg) 'Ajout saut de page
        ActiveWindow.View = xlNormalView
        With ActiveSheet.PageSetup
            .LeftMargin = Application.InchesToPoints(0.098)
            .RightMargin = Application.InchesToPoints(0.098)
            .TopMargin = Application.InchesToPoints(0.118)
            .BottomMargin = Application.InchesToPoints(1)
            .HeaderMargin = Application.InchesToPoints(0.315)
            .FooterMargin = Application.InchesToPoints(0.315)
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 100
        End With
        ActiveWindow.View = xlPageLayoutView 'Affichage en mode Page
    End With
MsgBox Format(Timer - t, "0.00")
End Sub

la macro "MesTimers" est un petit peu modifié.

Puis dans la macro FTI, il y a aussi quelque lignes pour mesurer le temps et ils ont un numéro croissant à partir de 21. Un petit peu bizarre, je sais, cet outil, je l'ai écrit ce matin sans savoir ce que j'avais à mesurer. Faites le même truc que ce matin et maintenant à la fin de msgbox final il y aura 3 nouveau temps intermédiares et je suppose que le premier sera le plus grand.

La plage où vous ajustez les cellules, y-a-t-il des cellules avec de formules dedans ? Vous pouvez me joindre une sorte de copie (sans valeurs sensibles) ?

Bonjour,

C'est surtout la première partie qui prend du temps.

je n'arrive absolument pas a envoyer un petit fichier ... désolé

Mika

Rechercher des sujets similaires à "optimisation temps execution macro"