Optimiser macro enregistrée
- Messages
- 668
- Excel
- 2010 - Gsheets
- Inscrit
- 14/08/2018
- Emploi
- responsable d'exploitation logistique
Hello
Je commence à me former aux macros mais ca reste très compliqué pour moi et suis obligé de passer par les macros enregistrées
C'est très pratique mais du tout optimisé
Voici une macro enregistrée que je souhaite optimiser.
Sur le fichier joint je donne très peu de lignes. En vrai il y a des milliers de lignes et beaucoup de colonnes si bien que la mcro met environ 10sec a tourner
Voici la macro enregistrée et j'ai ajouté du texte pour expliquer ce que je veux
Je n'ai pas mis de bouton pour la lancer, juste un raccourci clavier, ca me va amplement.
Sub projet_oops()
'
' projet_oops Macro
' ajoute une colonne OOPS aux magasins en question
'
' Touche de raccourci du clavier: Ctrl+Shift+O
'
'convertir en nombre la colonne A
Columns("A:A").Select
Application.CutCopyMode = False
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
' insérer une colonne B
Columns("B:B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'renommer le titre en OOPS?
Range("B1").Select
ActiveCell.FormulaR1C1 = "OOPS?"
'effectuer une recherche V dans la feuille 2 et l'appliquer à toute la colonne
Range("B2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],Feuil2!R1C1:R20C2,2,0)"
Range("B2").Select
Selection.AutoFill Destination:=Range("B2:B30284")
Range("B2:B30284").Select
'afficher un message comme quoi la macro a bien fonctionné
MsgBox "Magasins Oops identifiés"
End Sub
Y a t-il moyen de la faire aller plus vite en la faisant à la main? La macro enregistrée ne nomme pas les variables par exemple.
Le plus gros souci est que j'ai étendu ma recherche V jusque la ligne 30284 mais parfois j'aurai plus ou parfois moins en fonction des jours
SI j'ai moins ca va me faire des lignes #N/A inutiles mais surtout si j'en ai plus ma recherche V n'ira pas au bout.
Je pourrai mettre 50000 pour être tranquille mais quitte à optimiser, comment faire en sorte que la recherche V aille jusqu'à la dernière ligne?
Bonjour,
il faut savoir que les "select" ralentissent beaucoup l’exécution.
Range("B1").Select
ActiveCell.FormulaR1C1 = "OOPS?"
Il est plus intéressant de faire de cette manière par exemple
Range("B1").FormulaR1C1 = "OOPS?"
De plus je t'invite à consulter la fonction screenUpdating , il y a de bonne chance que cela améliore la rapidité de ton code.
- Messages
- 668
- Excel
- 2010 - Gsheets
- Inscrit
- 14/08/2018
- Emploi
- responsable d'exploitation logistique
Merci
J'ai enlevé les select. mais perso je n'ai pas vu d'amélioration notable sur le délai.
Le plus long est la recherche V appliqué à toutes mes lignes.
Mais le temps est peut-être normal vu le nb de lignes à traiter.
re,
et screenUpdating ?
Je n'utilise pas de formule (je ne sais pas plutôt
Cordialement.
bonjour,
essaie ceci
Sub projet_oops()
'
' projet_oops Macro
' ajoute une colonne OOPS aux magasins en question
'
' Touche de raccourci du clavier: Ctrl+Shift+O
'
'convertir en nombre la colonne A
Application.Calculation = xlCalculationManual
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
' insérer une colonne B
Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'renommer le titre en OOPS?
Range("B1").FormulaR1C1 = "OOPS?"
'effectuer une recherche V dans la feuille 2 et l'appliquer à toute la colonne
Range("B2").FormulaR1C1 = "=VLOOKUP(RC[-1],Feuil2!R1C1:R20C2,2,0)"
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 1).End(xlUp).Row)
'afficher un message comme quoi la macro a bien fonctionné
Application.Calculation = xlCalculationAutomatic
MsgBox "Magasins Oops identifiés"
End Sub
Bonjour tout le monde !
Autre proposition :
Sub projet_oops()
Dim DerLig As Long, Lig As Long 'Déclaration des variables
Application.Calculation = xlCalculationManual 'Désactive le recalcul auto de toutes le formules, le temps de la macro
With Sheets("MaFeuille") 'Nom feuille à adapter
DerLig = .Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne
.Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote 'convertir en nombre la colonne A
.Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'insérer une colonne B
.Range("B1") = "OOPS?" 'renommer le titre en OOPS?
For Lig = 2 To DerLig 'Parcourir les lignes
.Range("B" & Lig) = Application.VLookup(.Range("A" & Lig), Sheets("Feuil2").Range("A1:B20"), 2, 0) 'Inscrit le résultat de la recherche "en dur" (pas de formule dans la cellule)
Next Lig
MsgBox "Magasins Oops identifiés" 'afficher un message comme quoi la macro a bien fonctionné
End With
Application.Calculation = xlCalculationAutomatic 'Ré-active le recalcul auto de toutes le formules, le temps de la macro
End Sub
- Messages
- 668
- Excel
- 2010 - Gsheets
- Inscrit
- 14/08/2018
- Emploi
- responsable d'exploitation logistique
merci!
h2so4 j'ai un débogage sur cette ligne (erreur1004)
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row)
Je n'ai pas réussit à trouver l'erreur
Par contre celle de Pedro marche à merveille.
En terme de temps, c'est un peu plus rapide. Mais surtout ma recherche V s'applique bien en fonction de mon nombre de ligne.
C'est bien d'avoir mis en dur le résultat en plus
C'est parfait en comparant la macro enregistrée et la manuelle, ca me permet de comprendre les subtilités
Merci à vous!
merci!
h2so4 j'ai un débogage sur cette ligne (erreur1004)
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row)
Je pense que c'est une erreur d'inattention... A ce stade, la colonne 2 est incomplète, on ne peut donc pas l'utiliser pour déterminer la dernière ligne.
Il suffit de remplacer le dernier "2" par "1" (pour se baser sur la colonne 1) :
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 1).End(xlUp).Row)
Merci de ton retour concernant ma proposition. Je peux aussi te proposer une version avec variable tableau et sans RECHERCHEV.
bonjour,
merci!
h2so4 j'ai un débogage sur cette ligne (erreur1004)
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 2).End(xlUp).Row)
Je n'ai pas réussit à trouver l'erreur
je suppose qu'il fallait que je me base sur la colonne A et non la colonne B pour déterminer le nombre de lignes
Range("B2").AutoFill Destination:=Range("B2:B" & Cells(Rows.Count, 1).End(xlUp).Row)
- Messages
- 668
- Excel
- 2010 - Gsheets
- Inscrit
- 14/08/2018
- Emploi
- responsable d'exploitation logistique
Pour la forme (je n'ai pas testé le code) :
Option Base 1
Sub projet_oops()
Dim DerLig As Long, Lig As Long, DerLig2 As Long, Lig2 As Long, TabRes() As Variant, TabRech() As Variant 'Déclaration des variables
Application.Calculation = xlCalculationManual 'Désactive le recalcul auto de toutes le formules, le temps de la macro
With Sheets("MaFeuille") 'Nom feuille à adapter
DerLig = .Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne
DerLig2 = Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne du tableau de recherche
.Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote 'convertir en nombre la colonne A
.Columns("B:B").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'insérer une colonne B
TabRes = .Range("A2:B" & DerLig).Value 'Stocke les colonnes A et B dans une variable Tableau
TabRech = Sheets("Feuil2").Range("A2:B" & DerLig2).Value 'Stocke les colonnes A et B du tableau de recherche
.Range("B1") = "OOPS?" 'renommer le titre en OOPS?
For Lig = 1 To DerLig - 1 'Parcourir les lignes
For Lig2 = 1 To DerLig2 - 1 'Parcourir le tableau de recherche
If TabRes(Lig, 1) = TabRech(Lig2, 1) Then TabRes(Lig, 2) = TabRech(Lig2, 2) 'Recherche de correspondance
Next Lig2
Next Lig
.Range("A2:B" & DerLig).Value = TabRes
MsgBox "Magasins Oops identifiés" 'afficher un message comme quoi la macro a bien fonctionné
End With
Application.Calculation = xlCalculationAutomatic 'Ré-active le recalcul auto de toutes le formules, le temps de la macro
End Sub
- Messages
- 668
- Excel
- 2010 - Gsheets
- Inscrit
- 14/08/2018
- Emploi
- responsable d'exploitation logistique
Pour la forme j'ai testé puisque tu as pris du temps pour créer le code.
Ca a l'air d'être un jeu pour toi tout ce charabia
Ca marche aussi bien. C'est aussi rapide (enfin dur à évaluer, peut-être un poil mieux), par contre ca a le gros avantage de laisser vide les cellules au lieu d'avoir des #N/A pas très jolis.
Testé et approuvé
merci!