Probleme performance sur copie cellule
Bonjour,
j'ai une macro qui copie des cellules d'un onglet vers un autre onglet. je trouve cette macro tres lente et ne comprends pas pourquoi.
500 lignes pour 1min23.
quelqu'un a t'il une idée?
Worksheets("AQP").Range("Debug_deb_moe").Value = Time ' Heure début mise en forme
Application.ScreenUpdating = False ' On masque l'affichage des feuilles pendant l'execution de la macro
On Error Resume Next
'New
Set wsfica = Worksheets("Avancement Homologation") ' Nom de la feuille de calcul
Set wsfic_moe = Worksheets("moe") ' Nom de la feuille de calcul moe
wsfica.Select
nblig_Avanc1 = wsfica.UsedRange.Rows.Count ' NB lignes de l'onglet Avancement Homologation
Set maplage = wsfica.Range("A2:CH" & nblig_Avanc1).SpecialCells(xlCellTypeVisible)
'New
nblig_moe = wsfic_moe.UsedRange.Rows.Count ' NB lignes de l'onglet moe
'MsgBox " Nb lig avancement " & nblig_Avanc1 & " Nb lig moe " & nblig_moe
J = 0
For Each Ligne In maplage.Rows
I = Ligne.Row
Set c = wsfic_moe.Range("A2:A" & nblig_moe).Find(wsfica.Range("A" & I).Value) ' Recherche ligne dans onglet MOE
J = c.Row
'MsgBox " Trace1 mef_MOE -- Projet: " & wsfica.Range("A" & I).Value & Chr(10) & " N° ligne dans onglet MOE: " & therow & "-- Indice J: " & J
If (J > 0) Then
ActiveSheet.Range("Q" & I).Value = wsfic_moe.Cells(J, 19).Value
ActiveSheet.Range("s" & I).Value = wsfic_moe.Cells(J, 20).Value
ActiveSheet.Range("AH" & I).Value = wsfic_moe.Cells(J, 22).Value
ActiveSheet.Range("AK" & I).Value = wsfic_moe.Cells(J, 25).Value
ActiveSheet.Range("AM" & I).Value = wsfic_moe.Cells(J, 27).Value
ActiveSheet.Range("AN" & I).Value = wsfic_moe.Cells(J, 28).Value
ActiveSheet.Range("AO" & I).Value = wsfic_moe.Cells(J, 29).Value
ActiveSheet.Range("AP" & I).Value = wsfic_moe.Cells(J, 30).Value
ActiveSheet.Range("AQ" & I).Value = wsfic_moe.Cells(J, 31).Value
ActiveSheet.Range("AR" & I).Value = wsfic_moe.Cells(J, 32).Value
ActiveSheet.Range("AS" & I).Value = " "
End If
I = I + 1
Next
Worksheets("AQP").Range("Debug_fin_moe").Value = Time ' Heure fin mise en forme
End Sub Bonjour,
normal car boucler sur des cellules est ce qu'il y a de plus lent, surtout en écriture cellule par cellule au lieu d'en grouper !
Envisager un filtre et des variables de type tableau en lecture comme en écriture …
Bonjour
Sans garantie mais essaie une variante, en simplifiant les codes.
Remplace les instructions telles que :
ActiveSheet.Range("Q" & I).Value = wsfic_moe.Cells(J, 19).Value par :
wsfic_moe.Cells(J, 19).copy Range("Q" & I).Value Quel est le résultat ?
Heu, t'es sûr que cela marche .Value en destination de Copy ? …
Vaudrait mieux commencer par grouper les cellules contigües en écriture :
ActiveSheet.Cells(I, "AM").Resize(, 6).Value = wsfic_moe.Cells(J, 27).Resize(, 6).Value …
Marc L a écrit :Heu, t'es sûr que cela marche .Value en destination de Copy ? …
Tu as raison. J'ai oublié d'enlever le ''.copy''
Mais je suis sûr que ta solution est bonne. Je la retiens. Merci.
Heu, plutôt Value à supprimer ?
Sinon je ne suis sûr de rien vu la présentation légère et sans classeur …
Je n'ai pas détaillé le bout de code car dès la deuxième ligne avec On Error cela n'augure rien de bon !
Si déboguer est l’art de corriger les bogues, alors programmer est l’art d’en faire !
Marc L a écrit :vu la présentation légère et sans classeur …
Moi aussi, je préfère travailler sur un classeur joint par le demandeur.
Cela permet de tester les solutions avant de les proposer. Dans le cas présent, cela m'aurait éviter les bourdes que tu as relevées.
Mais je constate que les nouveaux venus semblent éviter de joindre un fichier. Sans doute parce qu’un autre forum le déconseille explicitement, et l’interdit même lors d’un premier message.
Dommage !
Il faut relancer !
Bye ! et merci encore !