Améliorer mon code VBA
Bonjour à tous,
j'ai mis en place un code vba mais vue l'utilisation que je doit en faire, je trouve que l'exécution de la macro prend du temps (une dizaine de secondes). n'étant pas expert en vba, j'ai quand même lu sur le net que la déclaration des variables pouvait également améliorer l'exécution de la macro, mais vu la longueur de ma macro, je suis coincé. quelqu'un peut-il me l'améliorer s'il vous plait ?
Sub Valider_ticket()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ActiveSheet.Unprotect
Dim ligin As Long, ligai As Long
ligai = 40
Select Case MsgBox("Confirmer la validation du ticket", vbOKCancel, "Valider le ticket")
Case vbOK
Range("AA4:Ak18").Select
Selection.Copy
Range("AA19").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Copy
Sheets("recettes").Visible = True
Sheets("Recettes").Select
Range("A2").Select
Selection.Insert Shift:=xlDown
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Columns("l:v").Select
Selection.Copy
Columns("A:k").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("A:k").EntireColumn.AutoFit
For ligin = ligai To 1 Step -1
If Worksheets("Recettes").Cells(ligin, 1).Value = "" Then
Rows(ligin).Delete
End If
Next
Range("A1").Select
Sheets("recettes").Visible = False
Sheets("Cdes").Select
Application.CutCopyMode = False
Range("K29:K50,q10:q80,N26").Select
Range("q10").Activate
Selection.ClearContents
Sheets("prix").Visible = True
Sheets("prix").Select
ActiveSheet.PivotTables("Tableau crois? dynamique1").PivotCache.Refresh
Sheets("prix").Visible = False
Sheets("Cdes").Select
Range("k26").Select
Case vbCancel
Range("k26").Select
End Select
Range("AA19:Ak40").Select
Selection.ClearContents
Range("K26").Select
Application.EnableEvents = True
Application.ActiveWorkbook.Save
Application.DisplayAlerts = True
ActiveSheet.Protect
End Sub
Grand merci d'avance !!!
Bonjour,
Pas compliqué !
Ensuite pour améliorer : commencer par faire disparaître tout Select, Activate, Selection, etc. dans un premier temps, dans un second temps éliminer les copier-coller au profit d'affectations de valeurs, et dans un troisième temps éliminer les autres commandes inutiles issues de l'enregistreur.
mon cerveau c'est déconnecté dès la première phrase...
ce code je l'ai conçu en y mettant plusieurs codes bout à bout celon ce que je voulais obtenir. donc je ne sais pas faire un tel code en entier. pleaaaaase, c'est possible que tu me le fasses, ainsi je pourrais m'en inspirer la porichaine fois pour d'autres codes que je créerais..
mon cerveau c'est déconnecté dès la première phrase...
ce code je l'ai conçu en y mettant plusieurs codes bout à bout celon ce que je voulais obtenir. donc je ne sais pas faire un tel code en entier. pleaaaaase, c'est possible que tu me le fasses, ainsi je pourrais m'en inspirer la porichaine fois pour d'autres codes que je créerais..
Bonjour,
Le forum dispose de fonctionnalités pour rendre le code lisible lorsque tu le post, pour peu que tu prennes la peine de les utiliser... Il s'agit du bouton : </>
Ensuite, ton code est très certainement issu de l'enregistreur automatique de macro. Cette fonction permet d'apprendre certaines instructions, mais certainement pas de produire un code propre et fiable. En effet, l'enregistreur ne sait pas à l'avance ce que tu veux faire et ne réfléchit donc pas, comme tu devrais le faire, à la structure du code.
Il se contente de reproduire bêtement chacune de tes actions. Or, VBA, à la différence d'un utilisateur, n'a pas besoin de sélectionner les éléments (plages, cellules...) pour travailler dessus, par exemple. Il suffit de préciser les références complètes des objets.
Je t'invite donc a aller faire un tour du côté des cours VBA pour commencer.
merci pour la réponse.
mais toujours dans le sujet, je poste le code :
Attribute VB_Name = "Module5"
Sub Valider_ticket()
Attribute Valider_ticket.VB_ProcData.VB_Invoke_Func = " \n14"
'
' Valider_ticket Macro
'
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ActiveSheet.Unprotect
Dim ligin As Long, ligai As Long
ligai = 40
Select Case MsgBox("Confirmer la validation du ticket", vbOKCancel, "Valider le ticket")
Case vbOK
Range("AA4:Ak18").Select
Selection.Copy
Range("AA19").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Copy
Sheets("recettes").Visible = True
Sheets("Recettes").Select
Range("A2").Select
Selection.Insert Shift:=xlDown
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Columns("l:v").Select
Selection.Copy
Columns("A:k").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns("A:k").EntireColumn.AutoFit
For ligin = ligai To 1 Step -1
If Worksheets("Recettes").Cells(ligin, 1).Value = "" Then
Rows(ligin).Delete
End If
Next
Range("A1").Select
Sheets("recettes").Visible = False
Sheets("Cdes").Select
Application.CutCopyMode = False
Range("K29:K50,q10:q80,N26").Select
Range("q10").Activate
Selection.ClearContents
Sheets("prix").Visible = True
Sheets("prix").Select
ActiveSheet.PivotTables("Tableau crois� dynamique1").PivotCache.Refresh
Sheets("prix").Visible = False
Sheets("Cdes").Select
Range("k26").Select
Case vbCancel
Range("k26").Select
End Select
Range("AA19:Ak40").Select
Selection.ClearContents
Range("K26").Select
Application.EnableEvents = True
Application.ActiveWorkbook.Save
Application.DisplayAlerts = True
ActiveSheet.Protect
End Sub
Un exemple :
Range("AA19:Ak40").Select
Selection.ClearContents
S'écrit simplement :
Range("AA19:Ak40").ClearContents