XL 2016 Optimisation MACROS

Michest

XLDnaute Occasionnel
Bonjour,

Je vous sollicite pour votre aide afin d'optimiser 3 fichiers, un fichier 'Interventions' (cf fichier joint) qui me permet d'extraire des données en brut.
Puis après une remise en forme de ces données, elles vont être exportées vers un logiciel tiers ( powerBI ).
Actuellement tout fonctionne mais une partie des macros ont été réalisées avec l'enregistreur de macros d'où des latences ...

Une optimisation sur optimisation sur partie codifié en gras :

module 1 pour le bouton RAZ
Sub RAZ()
Sheets("Extract_Inters").Range("A2:Z10000").ClearContents
Sheets("InterA").Range("A2:Z10000").ClearContents
Sheets("InterN").Range("A2:Z10000").ClearContents
Sheets("Extraction données INTER").Activate
Range("A2:M10000").ClearContents
Range("A1").Select
End Sub


module 2 la partie
'
' *** Niveau ARBO (fils vers père) ***
'
'Traitement colonne G
Columns("O:O").Select
Selection.ClearContents
Columns("G:G").Select
Selection.Copy
Columns("O:O").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Columns("P:p").Select
Application.CutCopyMode = False
Selection.Copy
Columns("G:G").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("O:O").Select
'Selection.ClearContents
Columns("G:G").EntireColumn.AutoFit


Module 4 ( optimisation complète )

Merci pour votre aide,

*******************************************************************************************
Eventuellement dans le même but j'ai 2 autres fichiers à optimiser 'DI' et 'Occupations'
optimisation sur partie codifié en gras
*******************************************************************************************

***Fichier 'DI'***
Module 1

Option Explicit

Dim w1 As Workbook, f1 As Worksheet, liste1, liste2
Dim i&, j&, lgn&, flag&
Sub RAZ()
Sheets("Extract_DI").Range("A2:Z10000").ClearContents
Sheets("Infos DI").Range("A2:H10000").ClearContents
End Sub


Sub Recuperer()
[Extract_DI!2:65536].EntireRow.Delete
flag = 0
For Each w1 In Workbooks
For Each f1 In w1.Worksheets
If w1.Name <> ActiveWorkbook.Name Then
If f1.Range("A1") = "Destinataire de la DI" Then
liste1 = Array(6, 3, 7, 13, 4, 1, 18)
liste2 = Array(1, 2, 3, 4, 5, 6, 7)

For i = 2 To f1.Range("A" & Rows.Count).End(xlUp).Row
lgn = Range("A" & Rows.Count).End(xlUp)(2).Row
For j = 0 To 6
If j = 0 Then
Cells(lgn, liste2(j)).Value = CDate(f1.Cells(i, liste1(j)).Value)
Else
Cells(lgn, liste2(j)).Value = f1.Cells(i, liste1(j)).Value
End If
Cells(lgn, 1).NumberFormat = "[$-fr-FR]mmm-yy;@"
Next j
Next i
flag = 1
End If

End If
Next f1
Next w1
If flag = 0 Then
MsgBox "Le fichier source doit être ouvert.", 16
Exit Sub
End If

'
' Traitement A - HA
'

'
Sheets("A-HA").Select
Range("A2").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Columns("A:B").Select
Selection.Copy
Sheets("Extract_DI").Select
Columns("L:M").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select

'
' TRI numéros interventions A-Z colonne B et L
'

'
Range("B2").Select
ActiveWorkbook.Worksheets("Extract_DI").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Extract_DI").Sort.SortFields.Add Key:=Range( _
"B2:B303"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Extract_DI").Sort
.SetRange Range("A1:H10000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("L1:M1").Select
Selection.AutoFilter
Selection.AutoFilter
ActiveWorkbook.Worksheets("Extract_DI").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Extract_DI").AutoFilter.Sort.SortFields.Add Key:= _
Range("L1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Extract_DI").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1").Select

'
' Copie Astreinte colonne M vers colonne H
'

'
Columns("M:M").Select
Selection.Copy
Columns("H:H").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub


Module 2 ->ok

Module 3
Sub PowerBI_DI()
'
' PowerBI_DI Macro
'

'
Cells.Select
Selection.Copy
Sheets("Infos DI").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Cells.EntireColumn.AutoFit
Range("A1").Select
Sheets("Extract_DI").Select
Range("A1").Select
Application.CutCopyMode = False

Columns("A:A").Select
Selection.Copy
Sheets("Infos DI").Select
Columns("A:A").Select
ActiveSheet.Paste
Sheets("Extract_DI").Select
Range("A1").Select
Application.CutCopyMode = False
End Sub



***Fichier 'Occupations'***
Module 1

Option Explicit

Dim w As Workbook
Dim flag&, colA, colB, l&
Sub RAZ()
Sheets("Extraction données OCCU").Range("A2:Z10000").ClearContents
Sheets("OccuN").Range("A2:H10000").ClearContents
Sheets("OccuA").Range("A2:H10000").ClearContents
End Sub

Sub Importer()

flag = 0
Range("A1").CurrentRegion.Offset(1, 0).ClearContents
For Each w In Workbooks
If w.Sheets(1).Range("B1") = "Libellé" Then
colA = Array(10, 15, 8, 3, 17, 2, 5)
colB = Array(1, 2, 3, 4, 5, 6, 7)
With w.Sheets(1)
For l = 0 To 6
.Range(.Columns(colA(l)), .Columns(colA(l))).Copy Cells(1, colB(l))
Next l
End With
flag = 1
Exit For
End If
Next w
If flag = 0 Then
MsgBox "Le fichier source doit être ouvert.", 16
End If

'
' RAZ_OccuA_HA Macro
'

'
Sheets("OccuA").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
Sheets("OccuN").Select
Cells.Select
Selection.ClearContents
Range("A1").Select
Sheets("Extraction données OCCU").Select


End Sub

Module 2 -> ok

Module 3
Sub OccuA()
'
' OccuA Macro
'

'
ActiveSheet.Range("$A$1:$G$65536").AutoFilter Field:=3, Criteria1:=Array( _
"ASTR_DIST_PAYE", "ASTR_DIST_RECUP", "ASTR_SPLACE_PAYE", "ASTR_SPLACE_RECUP"), _
Operator:=xlFilterValues
Cells.Select
Selection.Copy
Sheets("OccuA").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Sheets("Extraction données OCCU").Select
ActiveSheet.Range("$A$1:$G$65536").AutoFilter Field:=3
Range("A1").Select
'Application.CutCopyMode = False
End Sub
Sub OccuHA()
'
' OccuHA Macro
'

'
ActiveSheet.Range("$A$1:$G$65536").AutoFilter Field:=3, Criteria1:=Array( _
"NORMAL", "SUPP_PAYE", "SUPP_RECUPE"), Operator:=xlFilterValues
Cells.Select
Selection.Copy
Sheets("OccuN").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
Columns("F:F").EntireColumn.AutoFit

Range("A1").Select
Sheets("Extraction données OCCU").Select
ActiveSheet.Range("$A$1:$G$65536").AutoFilter Field:=3
Range("A1").Select
Application.CutCopyMode = False
End Sub
 

Pièces jointes

  • Interventions.xlsm
    957.6 KB · Affichages: 15
Solution
Bonjour Michest, bonjour le forum,

Bon... On va y aller par étapes....

• Module1
je ne vois rien à modifier

• Module 2
Règle d'or VBA : éviter autant que possible les Select/Activate qui ne font que ralentir l'exécution du code et sont source de plantages :


Code:
Dim OE As Worksheet

Set OE = Worksheets("Extraction données INTER")
OE.Columns("O:O").ClearContents
OE.Columns("G:G").Copy
OE.Columns("O:O").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
OE.Columns("P:P").Copy
OE.Columns("G:G").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
OE.Columns("G:G").AutoFit
...

Staple1600

XLDnaute Barbatruc
Re

Euh, moi, je parlais juste du post où tu disais que cela ne fonctionnait pas ;)

Mais il reste un mystère à lever concernant le module 2
(voir ma proposition dans le message#20)
Car dans le code d'origine, il y a un truc bizarre, non?
On copie d'abord des formules et plus tard on fait un collage spécial valeurs
D'où mon code raccourci
 

Michest

XLDnaute Occasionnel
Re @Michest

Oui j'ai Oublier de desactiver la Msgbox
MsgBox ObjRaz.ClearContents ---- Replacer par ----->> ObjRaz.ClearContents

J'ai créer une procédure pour effacer bien plus rapides :
[{"Extract_Inters","A2:Z10000"}]
Nom de la Feuille Excel = "Extract_Inters"
Plage a effacer = "A2:Z10000"
Il suffit juste de remplire dans la variable tableau T pour chacunes des feuilles la plage a effacer :
Exemple 1 : Pour la Feuille excel (Nom F1)
T = Array([{"F1","A2:C40"}], [{"F1","W3:Z1087"}], [{"F1","E32:J80"}],
Exemple 1 : Pour la Feuille excel (Nom F1 et F2 et F3)
T = Array([{"F1","A2:C40"}], [{"F2","W3:Z1087"}], [{"F3","E32:J80"}],
La procédure de la boucle la variable i est instancier a Byte soit 0 à 255
255 Plage c'est déjà pas mal ! une plage de la Feuil c'est l'adresse : "A2:C40"
A tester est adaptable à convenance.

module 1 pour le bouton RAZ
VB:
Sub RAZ()
Dim T As Variant
T = Array([{"Extract_Inters","A2:Z10000"}], [{"InterA","A2:Z10000"}], [{"InterN","A2:Z10000"}], [{"Extraction données INTER","A2:M10000"}])
RAZSelect T
'Sheets("Extract_Inters").Range("A2:Z10000").ClearContents
'Sheets("InterA").Range("A2:Z10000").ClearContents
'Sheets("InterN").Range("A2:Z10000").ClearContents
'Sheets("Extraction données INTER").Activate
'Range("A2:M10000").ClearContents
'Range("A1").Select
End Sub
'
et
'
VB:
Sub RAZ()
Dim T As Variant
T = Array([{"Extract_DI","A2:Z10000"}], [{"Infos DI","A2:H10000}])
RAZSelect T
'Sheets("Extract_DI").Range("A2:Z10000").ClearContents
'Sheets("Infos DI").Range("A2:H10000").ClearContents
End Sub
'
et
'
VB:
Sub RAZ()
Dim T As Variant
T = Array([{"Extraction données OCCU","A2:H10000"}], [{"OccuA","A2:H10000}])
RAZSelect T
'Sheets("Extraction données OCCU").Range("A2:Z10000").ClearContents
'Sheets("OccuN").Range("A2:H10000").ClearContents
'Sheets("OccuA").Range("A2:H10000").ClearContents
End Sub
'
' Procédure RAZSelect
'
' Crer une Fonction
VB:
Sub RAZSelect(ByRef T As Variant)
Dim F As Worksheet
Dim ObjRaz As Range
Dim i As Byte
    For i = LBound(T) To UBound(T)
        Set F = Worksheets(CStr(T(i)(1)))
        Set ObjRaz = F.Range(CStr(T(i)(2)))
        ObjRaz.ClearContents
    Next i
End Sub

Re

Ne pas oublier que mon code sent la pomme (enfin mapomme ;))

Il te reste plus qu'à effacer ton précédent message qui contient de la fake news comme dirait Donald ;)
Bon merci pour tout ces retours c'est très gentil mais je suis partis d'un problème d'optimisation de macro qui fonctionne pas terrible mais qui fonctionne avec de la prog. faite par l'enregistreur et la je part sur des tests de routine vba ou cela n'est vraiment mon domaine et cela hé bien dommage donc le mieux c'est que je vais regarder tout ces retours à tête reposé car j'avoue qu'après une journée de travail j'en perd les pédales...
En tout les mercis je donnerais suite de tute
 

Michest

XLDnaute Occasionnel
Re @Staple1600
je vais regarder le Module 2
C'est gentil à toi,

Pour le module 1 j'ai simplement fait le test
1610051671042.png

et direct cette erreur. Après une journée bien remplie je pense reprendre tout ces retours avec les idées plus fraiches, car le vba ce n'est vraiment mon domaine même si cela m'intéresse et je commence à en perdre les pédales.
En fait à la base pour ma demande d'optimisation Robert me dit que pour lui RAS pour le module 1. Moi le plus gros de la routine est le module 4 qui mouline pas mal ... en tout les cas merci
Je te ferais des retours de ton aide.
Merci à toi
 

Michest

XLDnaute Occasionnel
Bonsoir

=>Michest

C'est par là que nous sommes tous passés au départ
C'est une très bonne école ;)
Bonjour,
Bonsoir le fil,


Effectivement, il y avait un petit souci
Ci-dessous, une macro juste explicative (A TESTER SUR UN CLASSEUR VIERGE, avec 3 feuilles: Feuil1, Feuil2 et Feuil3)
Juste pour voir comment cela fonctionne
Il faut d'abord lancer la macro Créér_Test()
NB: J'espère que les commentaires sont suffisamment claires.
VB:
Dim f As Workbook
Sub Créer_TEST()
Feuil1.Range("A1:C10") = "=ADDRESS(ROW(),COLUMN(),4)"
Feuil1.Range("A1:C3").Interior.ColorIndex = 20
Feuil2.Range("A1:C25") = "=COS(COLUMN()+ROW())"
Feuil2.Range("A1:B5").Interior.ColorIndex = 12
Feuil3.Range("A1:E10") = "=ROW()^COLUMN()"
Feuil3.Range("A1:C3").Interior.ColorIndex = 6
End Sub
Sub RAZ()
'ici on effacera la plage A1:C3 des feuilles Feuil1 et Feuil3
Effacer "A1:C3", "Feuil1", "Feuil3"
'ici on effacera la plage A1:B5 de la feuille Feuil2
Effacer "A1:B5", "Feuil2"
End Sub

Private Sub Effacer(r As String, ParamArray vF() As Variant)
Set f = ThisWorkbook
If UBound(vF) < 0 Then Exit Sub
f.Sheets(vF).Select: Range(r).Select: Selection.ClearContents: f.Sheets(vF(0)).Select
End Sub
Bonsoir le fil,


Effectivement, il y avait un petit souci
Ci-dessous, une macro juste explicative (A TESTER SUR UN CLASSEUR VIERGE, avec 3 feuilles: Feuil1, Feuil2 et Feuil3)
Juste pour voir comment cela fonctionne
Il faut d'abord lancer la macro Créér_Test()
NB: J'espère que les commentaires sont suffisamment claires.
VB:
Dim f As Workbook
Sub Créer_TEST()
Feuil1.Range("A1:C10") = "=ADDRESS(ROW(),COLUMN(),4)"
Feuil1.Range("A1:C3").Interior.ColorIndex = 20
Feuil2.Range("A1:C25") = "=COS(COLUMN()+ROW())"
Feuil2.Range("A1:B5").Interior.ColorIndex = 12
Feuil3.Range("A1:E10") = "=ROW()^COLUMN()"
Feuil3.Range("A1:C3").Interior.ColorIndex = 6
End Sub
Sub RAZ()
'ici on effacera la plage A1:C3 des feuilles Feuil1 et Feuil3
Effacer "A1:C3", "Feuil1", "Feuil3"
'ici on effacera la plage A1:B5 de la feuille Feuil2
Effacer "A1:B5", "Feuil2"
End Sub

Private Sub Effacer(r As String, ParamArray vF() As Variant)
Set f = ThisWorkbook
If UBound(vF) < 0 Then Exit Sub
f.Sheets(vF).Select: Range(r).Select: Selection.ClearContents: f.Sheets(vF(0)).Select
End Sub
Bonjour Staple1600,

J'ai tester ton exemple f1,f2,f3 avec zone colorée à effacer cela fonctionne.
Maintenant à voir dans mon classeur...Il faut que j'adapte sachant que dans ma prog. ce n'est pas la partie la plus ralentissant.
 

Michest

XLDnaute Occasionnel
Bonjour @Michest
Module 1
VB:
Sub RAZ()
Dim T() As Variant
Dim ObjRaz As Range
Dim i As Byte
    T = Array("Extract_Inters", "InterA", "InterN", "Extraction données INTER")
    For i = LBound(T) To UBound(T)
        Set T(i) = Worksheets(T(i))
        If i < 3 Then
            Set ObjRaz = T(i).Range("A2:Z10000"): ObjRaz.ClearContents
        Else
            Set ObjRaz = T(i).Range("A2:M10000"): ObjRaz.ClearContents
        End If
    Next i
End Sub
Module 2
VB:
'   Traitement colonne G
    Dim RgnOO As Range
        Set RgnOO = Range("O:O")
    Dim RgnGG As Range
        Set RgnGG = Range("G:G")
    Dim RgnPP As Range
        Set RgnPP = Range("P:P")
    RgnOO.ClearContents
    RgnGG.Copy: RgnOO.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
    RgnPP.Copy: RgnGG.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
    RgnGG.EntireColumn.AutoFit
    Application.CutCopyMode = False

Le sous détaille de la modification du module 2 :
avec cela vous pouvez déjà en optimisé d'autres passage de votre Projet VBA

VB:
'Traitement colonne G
dim RgnOO as range
    set RgnOO = Range("O:O")
dim RgnGG as range
    set RgnGG = Range("G:G")
dim RgnPP as range
    set RgnPP = Range("P:P")
'
'Columns("O:O").Select :Selection.ClearContents
    RgnOO.ClearContents
'Columns("G:G").Select :Selection.Copy
'Columns("O:O").Select
'Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
'SkipBlanks:=False, Transpose:=False
    RgnGG.Copy :RgnOO.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
'Columns("P:p").Select
'Application.CutCopyMode = False
'Selection.Copy
'Columns("G:G").Select
'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
':=False, Transpose:=False
    RgnPP.Copy :RgnGG.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
'Columns("O:O").Select
'Selection.ClearContents

VB:
[B]' Copie Astreinte colonne M vers colonne H[/B]
dim RgnMM as range
    set RgnMM = Range("M:M")
dim RgnHH as range
    set RgnHH = Range("H:H")
    RgnMM.Copy :RgnHH.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
               SkipBlanks:=False, Transpose:=False
Columns("G:G").EntireColumn.AutoFit
RgnGG.EntireColumn.AutoFit
Bonjour Laurent950,

Après tes retours et celui de staple1600 voila ou j'en suis...
Soucis module 1(bouton RAZ)
Module 1 (bouton import ) ok
Module ok (Bouton purger)
1610091449072.png

Le fichier brut d'export est trop lourd en octets ...

Par contre la latence du programme est lié au bouton rouge PowerBI (module 4)
Merci...
 

Pièces jointes

  • Interventions TEST.xlsm
    707.2 KB · Affichages: 2

laurent950

XLDnaute Accro
Bonjour @Michest
Le code produit par l'enregistreur de Macro VBA est correcte, il faut interprété le code et le récrire mais pour cela il faut des connaissance en VBA ce que j'ai mais aussi des connaissance métier (ce que vous avez) et je ne serais pas écrire le code VBA Optimisé pour arriver à votre résultat. Donc c'est de repartir du Poste 1 et faire la Macro en Pas à Pas pour comprendre les données d'entrées et le chemin jusqu'au donnée de sortie (puis écrire le Code avec : Variables Tableaux, pour les doublons (Utilisé une classe Collection ou un dictionnaire "scripting.dictionary" puis pour la gestion des tries utiliser une fonction QuickShort, ect.
 

Michest

XLDnaute Occasionnel
Bonjour @Michest
Le code produit par l'enregistreur de Macro VBA est correcte, il faut interprété le code et le récrire mais pour cela il faut des connaissance en VBA ce que j'ai mais aussi des connaissance métier (ce que vous avez) et je ne serais pas écrire le code VBA Optimisé pour arriver à votre résultat. Donc c'est de repartir du Poste 1 et faire la Macro en Pas à Pas pour comprendre les données d'entrées et le chemin jusqu'au donnée de sortie (puis écrire le Code avec : Variables Tableaux, pour les doublons (Utilisé une classe Collection ou un dictionnaire "scripting.dictionary" puis pour la gestion des tries utiliser une fonction QuickShort, ect.
Bon Merci Laurent950 pour ta réponse c'est sympa de ta part mais comme tu dis chacun son métier. Etant dans la maintenance Excel me sert à créer des outils (Cahier de maintenance, Gestion et maj schéma sous autocad, restructuration arbo avec supervision, extraction données brut de gmao pour export dans powerBI, et merci excel pour tous ces projets) le problème c'est le vba ou je le gère comme une personne qui va à la pêche aux infos et qui recolle bout à bout) Je vais devoir me mettre au chinois ;) !

Concernant ce fameux module 4 y'a moyen de l'optimiser ou pas ? Scroll, sélection de zones, copier , coller,... afin que celui-ci est mois de latence sinon tant-pis.
 

Michest

XLDnaute Occasionnel
Bonjour,


Bonjour Staple1600,

J'ai tester ton exemple f1,f2,f3 avec zone colorée à effacer cela fonctionne.
Maintenant à voir dans mon classeur...Il faut que j'adapte sachant que dans ma prog. ce n'est pas la partie la plus ralentissant.
Re,

J'ai applique le bout de code VBA dans mon classeur. Parfait!
1610103326861.png

Pour résumé :
Module 1 et 2 ok
Module 4 lié au bouton 3-POWER BI pas optimisé et c'est lui qui ralentit le plus le programme.
En tout les cas merci
 

Discussions similaires

Réponses
9
Affichages
377
Haut Bas