Optimisation de code - Délais d'exécution long

Bonjour à tous,

Voici un code que j'ai créé pour mettre la facture en attente, ce code est long à s'exécuter.

Y a-t-il moyen de réduite ce temps ?

Sub MettreenAttente()
Worksheets("Facturation").Unprotect "130781"

Dim madate As Date

   madate = Date

If MsgBox("Vous allez mettre la facture logistique " & Sheets("Facturation").Range("M4") & ", confirmez-vous ?", vbYesNo + vbExclamation, "Mise en attente") = vbYes Then

'---------------------------LANCEMENT DE LA PROCEDURE----------------------------------------------------
With Sheets("Facturation")

' EN TETE DES FACTURES
     If [TabAttente].Item(1, 1) <> "" Then n = [TabAttente].Rows.Count + 1 Else n = 1 ' ajouter ligne au tableau de Save
        [TabAttente].Item(n, 1) = .Range("K4")                                   ' TYPE
        [TabAttente].Item(n, 2) = .Range("M7")                                   ' DATE
        [TabAttente].Item(n, 3) = .Range("M4")                                   ' NUM FACT LOGISTIQUE
        [TabAttente].Item(n, 4) = .Range("M5")                                   ' LE MOIS
        [TabAttente].Item(n, 5) = .Range("M6")                                   ' ANNEE
        [TabAttente].Item(n, 6) = .Range("J71")                                  ' TAUX GO
        ' FACTURE 1
        [TabAttente].Item(n, 7) = .Range("L4")                                   ' NUM FACT COMPTA
        [TabAttente].Item(n, 8) = .Range("F12")                                  ' OBSERVATION
        'FACTURE 2
        [TabAttente].Item(n, 9) = .Range("V4")                                   ' NUM FACT COMPTA
        [TabAttente].Item(n, 10) = .Range("P12")                                  ' OBSERVATION
        'FACTURE 3
        [TabAttente].Item(n, 11) = .Range("AF4")                                   ' NUM FACT COMPTA
        [TabAttente].Item(n, 12) = .Range("Z12")                                  ' OBSERVATION
        'FACTURE4
        [TabAttente].Item(n, 13) = .Range("AP4")                                   ' NUM FACT COMPTA
        [TabAttente].Item(n, 14) = .Range("AJ12")                                  ' OBSERVATION
'CORP DES FACTURES - FACTURE 1
    For i = 16 To 68
        [TabAttente].Item(n, 15 + i - 16) = .Range("F" & i).Formula               ' OK Prestation Fact 1
        [TabAttente].Item(n, 68 + i - 16) = .Range("G" & i).Formula                ' OK ref 1 Fact 1
        [TabAttente].Item(n, 121 + i - 16) = .Range("H" & i).Formula               ' OK ref 2 Fact 1
        [TabAttente].Item(n, 174 + i - 16) = .Range("I" & i).Formula               ' OK ref 3 Fact
        [TabAttente].Item(n, 227 + i - 16) = .Range("J" & i).Formula               ' OK Qté Fact 1
    Next
'CORP DES FACTURES - FACTURE 2
    For i = 16 To 68
       [TabAttente].Item(n, 280 + i - 16) = .Range("P" & i).Formula               ' OK Prestation Fact 1
        [TabAttente].Item(n, 333 + i - 16) = .Range("Q" & i).Formula                ' OK ref 1 Fact 1
        [TabAttente].Item(n, 386 + i - 16) = .Range("R" & i).Formula               ' OK ref 2 Fact 1
        [TabAttente].Item(n, 439 + i - 16) = .Range("S" & i).Formula               ' OK ref 3 Fact 1
        [TabAttente].Item(n, 492 + i - 16) = .Range("T" & i).Formula               ' OK Qté Fact 1
    Next
'CORP DES FACTURES - FACTURE 3
    For i = 16 To 68
       [TabAttente].Item(n, 545 + i - 16) = .Range("P" & i).Formula               ' OK Prestation Fact 1
        [TabAttente].Item(n, 598 + i - 16) = .Range("Q" & i).Formula                ' OK ref 1 Fact 1
        [TabAttente].Item(n, 651 + i - 16) = .Range("R" & i).Formula               ' OK ref 2 Fact 1
        [TabAttente].Item(n, 704 + i - 16) = .Range("S" & i).Formula               ' OK ref 3 Fact 1
        [TabAttente].Item(n, 757 + i - 16) = .Range("T" & i).Formula               ' OK Qté Fact 1
    Next
'CORP DES FACTURES - FACTURE 4
    For i = 16 To 68
        [TabAttente].Item(n, 810 + i - 16) = .Range("P" & i).Formula              ' OK Prestation Fact 1
        [TabAttente].Item(n, 863 + i - 16) = .Range("Q" & i).Formula                ' OK ref 1 Fact 1
        [TabAttente].Item(n, 916 + i - 16) = .Range("R" & i).Formula               ' OK ref 2 Fact 1
        [TabAttente].Item(n, 969 + i - 16) = .Range("S" & i).Formula                ' OK ref 3 Fact 1
        [TabAttente].Item(n, 1022 + i - 16) = .Range("T" & i).Formula               ' OK Qté Fact 1
    Next
'SURFACES
    For i = 17 To 24
        [TabAttente].Item(n, 1075 + i - 17) = .Range("BM" & i).Formula              ' 80*1200
        [TabAttente].Item(n, 1083 + i - 17) = .Range("BN" & i).Formula              ' 100*120
        [TabAttente].Item(n, 1091 + i - 17) = .Range("BO" & i).Formula              ' 120*120
    Next
'CONSOMMABLES
    For i = 26 To 37
        [TabAttente].Item(n, 1099 + i - 26) = .Range("BN" & i).Formula              ' CONSOMMABLES
    Next
'SOUS-TRATANCES
    For i = 39 To 50
        [TabAttente].Item(n, 1111 + i - 39) = .Range("BP" & i).Formula              ' CONSOMMABLES
    Next
'MECANISATION
    For i = 52 To 53
        [TabAttente].Item(n, 1123 + i - 52) = .Range("BO" & i).Formula              ' CONSOMMABLES
    Next
'stock
    For i = 16 To 47
        [TabAttente].Item(n, 1125 + i - 16) = .Range("AU" & i).Formula               ' OK Prestation Fact 1
        [TabAttente].Item(n, 1157 + i - 16) = .Range("AV" & i).Formula                ' OK ref 1 Fact 1
        [TabAttente].Item(n, 1189 + i - 16) = .Range("AW" & i).Formula               ' OK ref 2 Fact 1
        [TabAttente].Item(n, 1221 + i - 16) = .Range("AX" & i).Formula                ' OK ref 3 Fact 1
        [TabAttente].Item(n, 1253 + i - 16) = .Range("AY" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1285 + i - 16) = .Range("BA" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1317 + i - 16) = .Range("BB" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1349 + i - 16) = .Range("BC" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1381 + i - 16) = .Range("BD" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1413 + i - 16) = .Range("BE" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1445 + i - 16) = .Range("BF" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1477 + i - 16) = .Range("BG" & i).Formula               ' OK Qté Fact 1
        [TabAttente].Item(n, 1509 + i - 16) = .Range("BH" & i).Formula               ' OK Qté Fact 1
    Next
    Reeinitialize
End With
MsgBox "Facture mise en attente !", vbInformation + vbOKOnly, "Mise en attente"

End If
End Sub
12factlogv3-04-test.zip (594.62 Ko)

Je vous joins également le fichier dans lequel il sera, à savoir que l'onglet "Facturation" est protégé par un MDP.

Merci pour vos retour,

RQ

Bonjour,

Question: Pourquoi récupérez-vous les formules? Si vous remplaciez "Formula" par "Value" ça irait peut-être déjà mieux.

Sinon, ajoutez cette ligne au début de la macro:

Application.Calculation = xlCalculationManual

et ceci à la fin:

Application.Calculation = xlCalculationAutomatic

Cdlt

Bonjour Arturo, Je peux fait le tri effectivement, mais il y a beaucoup de personne qui réalise une formule dans les cellules, et nous devons les voir si il y a des problèmes.

Bon, ok pour les formules mais, avez-vous copié les 2 lignes comme indiqué et fait le test de rapidité d'exécution?

Bonjour,

lire et écrire les cellules une par une est très chronophage, et mettre les données en ligne dans un tableau est logique mais demande pas mal de boulot.
Je procèderais autrement..

Faire une copie de la facture en nommant la feuille du n° de facture unique et la masquer.
Dans la feuille Attente juste mettre 3/4 données pour l'identifier facilement et gérer le rapatriement.

Pour son rappel copier-coller formules F2:BP78 dans la facture, une seule lecture écriture est presque instantanée.
Supprimer la feuille cachée.

Ca prendra un peu plus de place mais tu ne vas pas en avoir 10000 en attente non plus je pense.

Si tu préfères ton tableau en ligne il faut lire toute la plage de données en une fois dans une variable tableau et c'est dans celui-ci que tu iras lire une par une tes données pour les écrire dans un autre tableau en mémoire datas_fact(1,1124) que tu écriras en une fois sur la feuille.
Travailler en mémoire aussi pour faire la restitution en une fois.
Copier la feuille est quand même plus simple, et en cas d'évolution de la facture tu as juste à changer éventuellement sa taille...
eric

bonjour le fil,

moi, je pense que ce serait plus facile de créer un fichier supplémentaire, dans lequel on colle pour chaque "facture en attente" un copie de la feuille "Facturation" (100 lignes * colonnes). Les formules, bon, je ne comprends pas bien ce qu'on a comme formules, mais je les conservais comme formule demanière que ce sera possible de les réconstruire.

Rechercher des sujets similaires à "optimisation code delais execution long"