Exécution de la macro trop longue

Résolu
Bastien -  
 Bastien -
Bonjour,
j'ai créé une macro toute simple pour remplacer une cellule définie avec une formule par son résultat et faire ceci pour toutes les lignes de la colonne. Le problème que j'ai est qu'il y a près de 300 lignes pour l'instant est que le temps de calcul est trop long.

Je poste mon code ci-dessous:
Sub figer_index()
'
Range("S8").Select

Do While Not (IsEmpty(ActiveCell))
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Offset(1, 0).Select
Loop

End Sub

Si quelqu'un a une idée pour optimiser ce code je le remercie grandement par avance

2 réponses

  1. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

    Essaie comme cela
    Sub figer_index()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    With Range("S8:S" & Range("S" & Rows.Count).End(xlUp).Row)
    .Copy
    .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    End With
    Range("S1").Select
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub


    A+
    1
    1. Bastien
       
      Wow merci ça va nettement plus vite. Il te serait possible de m'expliquer un peu le détail de ton programme?
      En tout cas merci de ton aide
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Excuse moi Bastien de t'cvoir dérangé en voulant t'aider
      encore + rapide quand m^me
      Option Explicit
      Sub figer_index()
      Dim Derlig As Integer, Lig As Integer, Tablo
      Application.ScreenUpdating = False
      Derlig = Columns("S").Find("*", , , , , xlPrevious).Row
      Tablo = Application.Transpose(Range("S8:S" & Derlig))
      Range("S8:S" & Derlig) = Application.Transpose(Tablo)
      End Sub

      ecore 1 fois, mes excuses pour avoir oser te pr^ter main forte, mais ca ne se reproduira plus
      0
    3. Bastien > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
       
      merci pour ton aide michel, je travaille sur ce que tu m'as envoyé
      0
    4. Gyrus Messages postés 3360 Statut Membre 526 > Bastien
       
      En règle générale, pour limiter les lenteurs d'un code tu peux désactiver le rafraichissement d'écran avec Application.ScreenUpdating = False et empêcher le recalcul des formules pendant le traitement avec Application.Calculation = xlCalculationManual.

      Ensuite, j'ai opté pour un traitement direct de la plage à traiter (pas de boucle).
      Pour info, j'ai fais la manip en manuel sur 300 lignes (copie/collage spécial valeurs), le résultat est quasi immédiat.

      A+
      0
    5. Bastien
       
      le problème que j'ai avec ces programmes, c'est que ça ne s'arrete pas quand ils rencontrent une cellule vide et donc si je veux ajouter une ligne a mon tableau la cellule concernée ne se met pas a jour comme elle devrait
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    peut-^tre le + rapide
    Option Explicit
    Sub figer_index()
    Dim Derlig As Integer, Lig As Integer, T
    Application.ScreenUpdating = False
    Derlig = Columns("S").Find("*", , , , , xlPrevious).Row
    T = Application.Transpose(Range("S8:S" & Derlig))
    For Lig = 1 To UBound(T)
    T(Lig) = T(Lig)
    Next
    Range("S8:S" & Derlig) = Application.Transpose(T)
    End Sub

    1