Voici un essai avec le blocage de la mise à jour écran (comme suggéré par Gabin) et le calcul mis en mode manuel le temps de l'exécution. J'ai enlevé les 2 .select de fin de code. Sinon, je ne pense pas qu'on gagnera beaucoup de temps. J'ai fait le pari de ne prendre que la colonne 78 en me disant qu'alimenter un tableau de 80 colonnes pourrait prendre un petit peu de temps mais je ne sais pas. Il faudra peut-être rechanger ça.
Il y a tout de même des petites opérations (tri, filtres, protection, ...) dont la durée est incompressible (enfin les protections et déprotections surtout). Je me dis qu'utiliser des tableaux structurés pourrait quand même faciliter les choses (le code déjà) et probablement abréger la durée d'exécution.
Sub MacroNew()
Dim Data, dico As Object
Dim Mot$, sepr$
Dim i As Integer
depart = Timer
application.screenupdating = false
application.calculation = xlCalculationManual
Worksheets(array("cmd", "cmd2", "art")).Unprotect
' recopie et tri des cmd_frns dans cmd
Worksheets("cmd").Range("A1:CC1000").ClearContents
Sheets("cmd_frns").Cells.AdvancedFilter Action:=xlFilterCopy, CriteriaRange _
:=Sheets("filtre").Rows("1:2"), CopyToRange:=Sheets("cmd").Range("A1"), Unique:=False
derL = Sheets("cmd").Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Worksheets("cmd").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("cmd").Sort.SortFields.Add Key:=Range("C2:C" & derL), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("cmd").Sort
.SetRange Range("A1:BW" & derL)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Debug.Print 1, Timer - depart
' remplacement des termes '<<<<<<< partie à voir !
Data = Sheets("cmd").Range("H2:H" & derL)
Set dico = CreateObject("Scripting.Dictionary")
dico(51822) = "CDA"
dico(51882) = "Verrou"
dico(51884) = "Stock"
dico(50049) = "Dépa"
dico(51788) = "Intrusion"
dico(51821) = "Incendie"
On Error Resume Next
For x = 1 To UBound(Data)
Data(x, 1) = dico(Data(x, 1))
Next
On Error GoTo 0
Sheets("cmd").Range("H2").Resize(UBound(Data), 1) = Data
Debug.Print 2, Timer - depart
'**************ICI******************
Remplacement "cmd", 12, 80 '<<<<
Remplacement "cmd", 6, 79 '<<<<
'***********************************
Debug.Print 3, Timer - depart
Worksheets("art").Range("A1:BK1000").ClearContents
Sheets("art_cmd").Cells.AdvancedFilter Action:=xlFilterCopy, CriteriaRange _
:=Sheets("filtre").Rows("4:5"), CopyToRange:=Sheets("art").Range("A1"), Unique:=False
Debug.Print 4, Timer - depart
sepr = Chr(10)
with Sheets("cmd")
last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
Data = .Cells(1, 78), resize(last_row).value
For i = 2 To UBound(Data)
Mot = "Projet : " & .cells(i, 77).value & " " & .cells(i, 78).value & sepr _
& "Article commander le " & .cells(i, 4).value & sepr _
& "Nom : " & .cells(i, 13).value & sepr _
& "N° de commande : " & .cells(i, 3).value & " " & "Achever : " & .cells(i, 80).value & sepr _
& "Type : " & .cells(i, 8).value & " " & "Fournisseur : " & .cells(i, 79).value
Data(i, 1) = Mot
Next i
.Cells(1, 78).Resize(UBound(Data)) = Data
end with
Sheets("vue").Range("F2:F3").ClearContents
Worksheets(array("cmd", "cmd2", "art")).protect DrawingObjects:=True, Contents:=True, Scenarios:=True
application.calculation = xlCalculationAutomatic
application.screenupdating = true
Debug.Print 5, Timer - depart
End Sub