améliorer mon code VBA

Y compris Power BI, Power Query et toute autre question en lien avec Excel
o
oyé
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 6 décembre 2018
Version d'Excel : 2013 FR

Message par oyé » 6 décembre 2018, 12:15

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 !!!
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'203
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 6 décembre 2018, 12:44

Bonjour,

Pas compliqué ! :mrgreen: D'abord il convient de mettre le code sous balises Code, et qu'il soit indenté, ça conditions pour que je lise...

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. :wink:
o
oyé
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 6 décembre 2018
Version d'Excel : 2013 FR

Message par oyé » 6 décembre 2018, 12:51

::( ::( ::( :lole: :lole: :lole:
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..
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 2'134
Appréciations reçues : 222
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 6 décembre 2018, 13:54

oyé a écrit :
6 décembre 2018, 12:51
::( ::( ::( :lole: :lole: :lole:
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.
1 membre du forum aime ce message.
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'203
Appréciations reçues : 445
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 6 décembre 2018, 13:57

Pedro |k)
1 membre du forum aime ce message.
o
oyé
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 6 décembre 2018
Version d'Excel : 2013 FR

Message par oyé » 6 décembre 2018, 13:59

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
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 2'134
Appréciations reçues : 222
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 6 décembre 2018, 14:02

Un exemple :
Range("AA19:Ak40").Select
Selection.ClearContents
S'écrit simplement :
Range("AA19:Ak40").ClearContents
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message