Bonjour à tous,
@Steelson : J'ai suivi le sujet. Le code était long, c'est pas évident d'arriver à l'optimiser comme tu l'as fait. Bravo !
@despekill : Je crois que le problème vient juste du application.transpose. En l'enlevant, ça marchera certainement. Je propose de factoriser la dernière partie du code (j'essaie de m'adonner à ce petit exercice ces derniers temps). Ca ne rendra pas forcément le code plus rapide mais peut-être plus clair.
Voici donc un essai en espérant avoir compris :
Sub Remplacement(NomFeuille$, colSource&, colDest&)
'ALIMENTATION TABLEAU REMPLACEMENT - MOTS A REMPLACER EN A, NOUVEAUX MOTS EN B
With Sheets("frns") '<<< en dur
dl = .Cells(.Rows.Count, 1).End(xlUp).Row
arrRmplt = .Range("A1:B" & dl).Value '<<< en dur
End With
'POUR EVITER LES REMPLACEMENTS INDESIRABLES
for i = lbound(arrRmplt) to ubound(arrRmplt)
t(i, 1) = "_" & t(i, 1) & "_"
next i
'Alimentation tableau données (colonne source) - Boucle de remplacement sur chaque item - Collage (colonne destination)
With Sheets(NomFeuille)
dl = .Cells(.Rows.Count, 1).End(xlUp).Row
arrData = .Cells(1, colSource).Resize(dl).Value
For x = LBound(arrData) + 1 To UBound(arrData)
For p = LBound(arrRmplt) To UBound(arrRmplt)
arrData(x, 1) = Replace("_" & arrData(x, 1) & "_", arrRmplt(p, 1), arrRmplt(p, 2))
Next p
Next x
.Cells(1, colDest).Resize(UBound(arrData)) = arrData
End With
End Sub
Cette macro paramétrée est alors à utiliser (exécuter) ainsi :
Sub MacroNew()
depart = Timer
Worksheets("cmd").Unprotect
Worksheets("cmd2").Unprotect
Worksheets("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
Dim Data, dico As Object
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
Dim Mot, Achever3, Test1, Date4, Commande5, Type6 As String
Dim Projet0 As String * 55
Dim ref2 As String * 30
Dim frns8 As String * 15
Dim i As Integer
Dim sepr As String
sepr = Chr(10)
Sheets("cmd").Select
last_row = Worksheets("cmd").Cells(Rows.Count, 1).End(xlUp).Row
Data = Sheets("cmd").Range(Cells(1, 1), Cells(last_row, 80))
For i = 2 To UBound(Data)
ref2 = Data(i, 13) 'Range("M" & i).Value
Achever3 = Data(i, 80) 'Range("CB" & i).Value
Date4 = Data(i, 4) 'Range("D" & i).Value
Commande5 = Data(i, 3) 'Range("C" & i).Value
Type6 = Data(i, 8) 'Range("H" & i).Value
Test1 = Data(i, 77) 'Range("BY" & i).Value
Projet0 = Data(i, 78) 'Range("BZ" & i).Value
frns8 = Data(i, 79) 'Range("CA" & i).Value
Mot = "Projet : " & Test1 & " " & Projet0 & sepr & "Article commander le " & Date4 & sepr & "Nom : " & ref2 & sepr & "N° de commande : " & Commande5 & " " & " " & " " & "Achever : " & Achever3 & sepr & "Type : " & Type6 & " " & "Fournisseur : " & frns8
Data(i, 78) = Mot 'Range("BX" & i).Value = Mot
Next i
Sheets("cmd").Cells(1, 1).Resize(UBound(Data), UBound(Data, 2)) = Data
Sheets("vue").Activate
Range("F2:F3").Select
Selection.ClearContents
Worksheets("cmd").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Worksheets("cmd2").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Worksheets("art").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Debug.Print 5, Timer - depart
End Sub
Je pense qu'il est possible de le faire aussi pour la partie Dico juste avant... Il y a encore des éléments en dur dans la macro Remplacement. L'idéal serait d'avoir "que" des variables pour qu'elle soit facilement réutilisable.
Il pourrait être pratique d'avoir une macro pour le tri aussi, on crée ainsi des sous-parties de l'exécution qui rendent le tout plus lisible et plus facilement maintenable.
Cdlt,