Création VBA Excel
Bonjour, je cherche sur Excel à réaliser une macro qui permette de copier-coller les valeurs d'un grand nombre de plages simultanément afin de rompre les formules qui permettaient de trouver les données présentes dans ces plages. Je suis parvenu à un code, cependant, le souci est que l'exécution du code est très longue, car Excel copie et colle les plages une par une et non simultanément. Si quelqu'un a une solution au problème, je suis preneur. Je mets en lien le code auquel je suis parvenu jusqu'à présent.
Sub OptimiserCode()
Dim plages As Variant
Dim i As Integer
plages = Array("C12:E13", "C15:E16", "C19:E19", "C22:E23", "C29:E29", "C38:D39", "C41:D42", _
"C45:D45", "C48:D49", "C55:D55", "F38:H39", "F41:H42", "F45:H45", "F48:H49", _
"F55:H55", "J38:L39", "J41:L42", "J45:L45", "J48:L49", "J55:L55", "N38:P39", _
"N41:P42", "N45:P45", "N48:P49", "N55:P55", "R38:T39", "R41:T42", "R45:T45", _
"R48:T49", "R55:T55", "V38:X39", "V41:X42", "V45:X45", "V48:X49", "V55:X55", _
"Z38:Z39", "Z41:Z42", "Z45:Z45", "Z48:Z49", "Z55:Z55", "C64:I65", "C67:I69", _
"C71:I71", "C74:I75", "C81:I81", "K64:M65", "K67:M68", "K71:M71", "K74:M75", _
"K81:M81", "C90:AB91", "C93:AB94", "C97:AB97", "C100:AB101", "C107:AB107", _
"C116:D117", "C119:D120", "C123:D123", "C126:D127", "C133:D133", "F116:H117", _
"F119:H120", "F123:H123", "F126:H127", "F133:H133")
Application.ScreenUpdating = False
For i = LBound(plages) To UBound(plages)
With ActiveSheet.Range(plages(i))
.Value = .Value
End With
Next i
Application.ScreenUpdating = True
End SubBonjour,
Faites une union des plages :
Sub OptimiserCode()
Dim plages As Variant
Dim i As Long
plages = Array("C12:E13", "C15:E16", "C19:E19", "C22:E23", "C29:E29", "C38:D39", "C41:D42", _
"C45:D45", "C48:D49", "C55:D55", "F38:H39", "F41:H42", "F45:H45", "F48:H49", _
"F55:H55", "J38:L39", "J41:L42", "J45:L45", "J48:L49", "J55:L55", "N38:P39", _
"N41:P42", "N45:P45", "N48:P49", "N55:P55", "R38:T39", "R41:T42", "R45:T45", _
"R48:T49", "R55:T55", "V38:X39", "V41:X42", "V45:X45", "V48:X49", "V55:X55", _
"Z38:Z39", "Z41:Z42", "Z45:Z45", "Z48:Z49", "Z55:Z55", "C64:I65", "C67:I69", _
"C71:I71", "C74:I75", "C81:I81", "K64:M65", "K67:M68", "K71:M71", "K74:M75", _
"K81:M81", "C90:AB91", "C93:AB94", "C97:AB97", "C100:AB101", "C107:AB107", _
"C116:D117", "C119:D120", "C123:D123", "C126:D127", "C133:D133", "F116:H117", _
"F119:H120", "F123:H123", "F126:H127", "F133:H133")
Application.ScreenUpdating = False
Dim finalRange As Range
Set finalRange = ActiveSheet.Range(plages(0))
For i = 1 To UBound(plages)
Set finalRange = Union(finalRange, ActiveSheet.Range(plages(i)))
Next i
finalRange.Value2 = finalRange.Value2
Application.ScreenUpdating = True
End SubBonjour à vous,
Sauf si je n'ai pas compris et que la feuille contient d'autres formules qu'on ne veut pas écraser,
pourquoi ne pas faire
Cells.Copy
Cells.PasteSpecial Paste:=xlPasteValuesCordialement
La question est d'augmenter la vitesse or le copier / coller cellule par cellule prend plus de temps que de changer les valeurs directement.
J'ai bien compris la question, ma réponse est la méthode plus rapide
Bonjour Etienne Pernelle, Salut JExcel2fr, Saboh12617
comme ceci ???? (environ 20-30 millisecondes) (égal à Saboh2617)
Sub OptimiserCode1()
'***************************************
'première fois = créer la plage nommée "Etienne"
'***************************************
Dim plages As Variant, UN As Range, c
Dim i As Long
' t = Timer
Application.ScreenUpdating = False
plages = Array("C12:E13", "C15:E16", "C19:E19", "C22:E23", "C29:E29", "C38:D39", "C41:D42", _
"C45:D45", "C48:D49", "C55:D55", "F38:H39", "F41:H42", "F45:H45", "F48:H49", _
"F55:H55", "J38:L39", "J41:L42", "J45:L45", "J48:L49", "J55:L55", "N38:P39", _
"N41:P42", "N45:P45", "N48:P49", "N55:P55", "R38:T39", "R41:T42", "R45:T45", _
"R48:T49", "R55:T55", "V38:X39", "V41:X42", "V45:X45", "V48:X49", "V55:X55", _
"Z38:Z39", "Z41:Z42", "Z45:Z45", "Z48:Z49", "Z55:Z55", "C64:I65", "C67:I69", _
"C71:I71", "C74:I75", "C81:I81", "K64:M65", "K67:M68", "K71:M71", "K74:M75", _
"K81:M81", "C90:AB91", "C93:AB94", "C97:AB97", "C100:AB101", "C107:AB107", _
"C116:D117", "C119:D120", "C123:D123", "C126:D127", "C133:D133", "F116:H117", _
"F119:H120", "F123:H123", "F126:H127", "F133:H133")
s = Join(plages, ",")
Do While Len(s) > 0
i = IIf(Len(s) < 255, 255, InStrRev(s, ",", 255))
Set c = Range(Left(s, i - 1))
Set UN = Union(IIf(UN Is Nothing, c, UN), c)
s = Mid(s, i + 1)
Loop
UN.Name = "Etienne" 'éventuellement, si plus tard, vous voulez de nouveau faire quelque chose avec cette plage, on peut le faire directement
UN.Value = Now 'changer la valeur des cellules
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub
Sub OptimiserCode2()
'*******************************
'plus tard, un utilise directement "Etienne"
'*******************************
t = Timer
Range("Etienne").Value = Now
MsgBox Timer - t
End Sub