Excel code VBA trop lent
Bonjour,
J'ai fait une macro en VBA elle fonctionne mais je suis débutant et ce n'est pas optimiser donc beaucoup trop lent.
Seriez-vous optimiser mon code ? merci d'avance.
Sub Macro1()
'
' Macro1 Macro
Worksheets("cmd").Unprotect
Worksheets("cmd2").Unprotect
Worksheets("art").Unprotect
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
ActiveWorkbook.Worksheets("cmd").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("cmd").Sort.SortFields.Add2 Key:=Range("C1:C150"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("cmd").Sort
.SetRange Range("A2:BX78")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Sheets("filtre").Activate
Range("A20:B121").Select
Selection.Copy
Sheets("cmd").Select
Range("BY2").Select
ActiveSheet.Paste
Sheets("cmd").Activate
Columns("BY:BZ").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("BY:BY").Select
Selection.Replace What:="#N/A", Replacement:="La commande n'est pas lier à un", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Columns("BZ:BZ").Select
Selection.Replace What:="#N/A", Replacement:="projet !", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Sheets("cmd").Activate
Columns("H:H").Select
Selection.Replace What:="51822", Replacement:="CDA", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51882", Replacement:="Verrou", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51884", Replacement:="Stock", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="50049", Replacement:="Dépa", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51788", Replacement:="Intrusion", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51821", Replacement:="Incendie", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51823", Replacement:="Parlo", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51824", Replacement:="CCTV", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf17 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 12).Resize(dlf17).Copy .Cells(1, 80)
Set plf17 = .Cells(1, 80).Resize(dlf17)
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf27 = .Cells(Rows.Count, 1).End(xlUp).Row
For p = 1 To dlf27
plf17.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf1 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 6).Resize(dlf1).Copy .Cells(1, 79)
Set plf1 = .Cells(1, 79).Resize(dlf1)
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf2 = .Cells(Rows.Count, 1).End(xlUp).Row
For p = 1 To dlf2
plf1.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
Next p
End With
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
last_row = Worksheets("cmd").Cells(Rows.Count, 1).End(xlUp).Row
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)
For i = 2 To last_row
Sheets("cmd").Select
ref2 = Range("M" & i).Value
Achever3 = Range("CB" & i).Value
Date4 = Range("D" & i).Value
Commande5 = Range("C" & i).Value
Type6 = Range("H" & i).Value
Test1 = Range("BY" & i).Value
Projet0 = Range("BZ" & i).Value
frns8 = 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
Sheets("cmd").Select
Range("BX" & i - 0).Value = Mot
Next i
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
End Sub
Edit : merci de mettre le code entre balises avec le bouton </>
Bonjour,
Pas de soucis si tu avais un fichier même simplifié à soumettre.
Ce qu'il faut à mon sens pour accélérer, c'est
- travailler avec des arrays (absorber d'un coup les valeurs, les traiter et retourner d'un coup le résultat = pas d'allers/retours incessants et chronophages avc la feuille)
- éventuellement modifier les replace par des recherches dichotomiques ou l'utilisation du dictionnaire Scripting.Dictionary
Je vais regarder, pour faire une version simplifié parce qu'il y a pas mal de donné confidentiel. je vous envoie ça au plus vite
Voilà j'ai essayer de te faire une version démo, mon code fonctionne mais c'est loin d'être top. merci du coup de main.
Dit toi qu'en vrai il y a dans les trois première table +- 10000 lignes dans chaque
Bonjour Despekill, Steelson.
Je me permet d'intervenir car visiblement, notre bon vieux
Application.Screenupdating = False
[...]
Application.Screenupdating = True
à été oublié ! C'est toujours quelques secondes de gagnées...
Bonne fin de journée à vous
++
@despekill
Pour le début, si tu figes les valeurs du nombre de lignes dans le tri, cela ne peut pas fonctionner, j'ai introduit derL
, la dernière ligne
' 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
Etape suivante, remplace
Columns("H:H").Select
Selection.Replace What:="51822", Replacement:="CDA", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51882", Replacement:="Verrou", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51884", Replacement:="Stock", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="50049", Replacement:="Dépa", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51788", Replacement:="Intrusion", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51821", Replacement:="Incendie", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51823", Replacement:="Parlo", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="51824", Replacement:="CCTV", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
par
' 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
et dis moi si tu as déjà une (grosse) amélioration.
Je continuerai demain ...
Bonjour Gabin
Je me permet d'intervenir car visiblement, notre bon vieux
Application.Screenupdating = False [...] Application.Screenupdating = True
à été oublié ! C'est toujours quelques secondes de gagnées...
en effet ! MAIS, si tu veux gagner beaucoup, c'est du second ordre car si tu travailles avec des arrays tu travailles en mémoire vive sans faire d'allers/retours vers la feuille, et donc tu n'en a pas vraiment besoin.
Bonjour Steelson,
J'en déduit que tu as réussi a trouver le bug au lancement vue ton code. Merci pour ce que tu as déjà fait je vais essayer tout ça.
En gros je récupère 3 tables différente avec ODBC sur mon ERP, ce sont pour nos commandes fournisseurs j'ai besoin de récupérer et croiser c'est trois base pour avoir tout mes info comme tu as pue voir avec ma concaténation. (La première c'est la commande, la deuxième les articles lier a cette commande et la troisième le projet lier a cette commande)
le résultat souhaiter ce trouve dans vue, donc l'affichage des bonnes info a droite et a gauche plus les filtres sont le plus important.
Bonjour Steelson,
Pour les arrays j'aimerais bien mais je début et je n'y suis pas arriver. je ne comprenais pas bien
Bonjour Steelson,
Pour les arrays j'aimerais bien mais je début et je n'y suis pas arriver. je ne comprenais pas bien
un exemple qui devrait te faire gagner du temps est ceci :
' 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
je vais regarder la fin du code aussi où il y a beaucoup d'interactions avec la feuille
Légèrement, mais mon code est beaucoup mieux déjà. Sur mon pc ça va en 1 secondes mais sur les pc normal du bureau faut compter 7 - 8 secondes c'est trop. Sur le gros du code faudrait faire des arrays tu serais m'aider la dessus ? faudrait savoir a qu'elle moment ça consomme le plus. OK merci d'avance pour la fin du code
mon code est beaucoup mieux déjà. Sur mon pc ça va en 1 secondes
combien as-tu gagné ? de toute façon il faut aussi traiter la fin
faudrait savoir a qu'elle moment ça consomme le plus. OK merci d'avance pour la fin du code
depart = Timer
' ... ton code partie 1
Debug.Print Timer - depart
' ... ton code partie 2
Debug.Print Timer - depart
' ... ton code partie 3
Debug.Print Timer - depart
et je confirme que la dernière partie est aussi super lente
Pour la dernière partie ...
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
tu as donc ici une bonne démo de ce qu'il faut faire avec des arrays
je mets une copie de la feuille dans le tableau Data
last_row = Worksheets("cmd").Cells(Rows.Count, 1).End(xlUp).Row
Data = Sheets("cmd").Range(Cells(1, 1), Cells(last_row, 80))
je traite le tableau de la même façon que tu le faisais avec la feuille, j'ai laissé ton code en regard
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
je colle en retour le tableau dans la feuille en une seule fois
Sheets("cmd").Cells(1, 1).Resize(UBound(Data), UBound(Data, 2)) = Data
J'ai divisé le temps par 10 sur chaque phase traitée
Mais je remarque qu'il reste encore ceci à accélérer :
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf17 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 12).Resize(dlf17).Copy .Cells(1, 80)
Set plf17 = .Cells(1, 80).Resize(dlf17)
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf27 = .Cells(Rows.Count, 1).End(xlUp).Row
For p = 1 To dlf27
plf17.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf1 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 6).Resize(dlf1).Copy .Cells(1, 79)
Set plf1 = .Cells(1, 79).Resize(dlf1)
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf2 = .Cells(Rows.Count, 1).End(xlUp).Row
For p = 1 To dlf2
plf1.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
Next p
End With
qui représente maintenant 90% du temps
cette partie était la plus complexe pour suivre ton logigramme
je suis passé par 2 arrays : Data80 pour la colonne 80 et Data79 pour la colonne 79
j'ai travaillé sur ces arrays (au lieu de la feuille) et ensuite reporté les arrays à leur "place" dans la feuille
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf17 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 12).Resize(dlf17).Copy .Cells(1, 80)
Set plf17 = .Cells(1, 80).Resize(dlf17)
data80 = plf17.Value
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf27 = .Cells(Rows.Count, 1).End(xlUp).Row
datafrns = .Range(.Cells(1, 1), .Cells(dlf27, 2)).Value
For p = 1 To dlf27
'plf17.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
For x = 2 To UBound(data80)
data80(x, 1) = Replace(data80(x, 1), datafrns(p, 1), datafrns(p, 2))
Next
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
.Cells(1, 80).Resize(UBound(data80)) = Application.Transpose(data80)
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf1 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 6).Resize(dlf1).Copy .Cells(1, 79)
Set plf1 = .Cells(1, 79).Resize(dlf1)
data79 = plf1.Value
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf2 = .Cells(Rows.Count, 1).End(xlUp).Row
datafrns = .Range(.Cells(1, 1), .Cells(dlf2, 2)).Value
For p = 1 To dlf2
'plf1.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
For x = 2 To UBound(data80)
data79(x, 1) = Replace(data79(x, 1), datafrns(p, 1), datafrns(p, 2))
Next
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
.Cells(1, 79).Resize(UBound(data79)) = Application.Transpose(data79)
End With
La macro complète telle que je l'ai faite, en espérant ne pas avoir supprimé certaines instructions
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
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf17 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 12).Resize(dlf17).Copy .Cells(1, 80)
Set plf17 = .Cells(1, 80).Resize(dlf17)
data80 = plf17.Value
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf27 = .Cells(Rows.Count, 1).End(xlUp).Row
datafrns = .Range(.Cells(1, 1), .Cells(dlf27, 2)).Value
For p = 1 To dlf27
'plf17.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
For x = 2 To UBound(data80)
data80(x, 1) = Replace(data80(x, 1), datafrns(p, 1), datafrns(p, 2))
Next
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
.Cells(1, 80).Resize(UBound(data80)) = Application.Transpose(data80)
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
dlf1 = .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(1, 6).Resize(dlf1).Copy .Cells(1, 79)
Set plf1 = .Cells(1, 79).Resize(dlf1)
data79 = plf1.Value
End With
With Sheets("frns") '<- feuille contenant la liste des mots à remplacer et les mots de remplacement à adapter eventuellement
dlf2 = .Cells(Rows.Count, 1).End(xlUp).Row
datafrns = .Range(.Cells(1, 1), .Cells(dlf2, 2)).Value
For p = 1 To dlf2
'plf1.Replace .Cells(p, 1).Value, .Cells(p, 2).Value, xlPart
For x = 2 To UBound(data80)
data79(x, 1) = Replace(data79(x, 1), datafrns(p, 1), datafrns(p, 2))
Next
Next p
End With
With Sheets("cmd") '<- feuille contenant les phrases à modifier à adapter eventuellement
.Cells(1, 79).Resize(UBound(data79)) = Application.Transpose(data79)
End With
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
Merci pour ton code, je comprend mieux et j'ai adapter déjà par contre le dernier bout de code ne fonctionne pas. au lieu de mettre des bonne valeur c'est le nom de la colonne qui es répéter. Chez ta cela fonctionne regarde le résultat dan vue ?