Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Optimisation MACROS

Michest94

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").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").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: 54
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

Pour le reste suivre la règle...

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
 

Michest94

XLDnaute Occasionnel

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
 

Michest94

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

Pour le module 1 j'ai simplement fait le test

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
 

Michest94

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,
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.
 

Michest94

XLDnaute Occasionnel
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)

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: 5

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.
 

Michest94

XLDnaute Occasionnel
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.
 

Michest94

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!

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
2
Affichages
124
Réponses
3
Affichages
588
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…