Optimisation macro VBA
Bonjour à tous,
Créateur de code à mes heures perdues, je cherche désormais à simplifier et optimiser mes codes pour gagner en performance.
Notamment parce que les données sont de plus en plus nombreuses ou qu'elles sont sur des ressources réseaux.
Est-ce que quelqu'un pourrais jeter un coup d’œil à mon fichier en pj et regarder si la macro IMPORT DATA pourrait être optimisée? (très probablement)
merci pour votre aide précieuse
Bonjour,
Je ne suis pas pro en ça mais je vois déjà des bêtes noires en programmation, déjà tu devrais séparer tes programmes par thème pour t'y retrouver au lieu de tout mettre dans le même module
Ensuite je ferai par parties :
'vérification
Sheets("PARAM").Select
Dim test As String
test = Range("B20").Value
test = Worksheets("PARAM").Range("B20").Value
If test = 0 Then
MsgBox "Il faut supprimer les anciennes données avant de lancer un import"
Sheets("ACCUEIL").Select
Exit Sub
End If
Pas de select, préférer utiliser directement Sheets("PARAM").Range("B20").value, ou encore utiliser With sheets("PARAM").
tu as 2 lignes où tu changes la valeur de test, ces deux lignes font appel exactement à la même cellule, ne garder qu'une des 2.
Sheets("ACCUEIL").select est a supprimé, pas de select pour passer à param, donc pas besoin de select pour revenir à accueil
ça donnerait donc :
'vérification
with Sheets("PARAM")
Dim test As String
test = .Range("B20").Value
If test = 0 Then
MsgBox "Il faut supprimer les anciennes données avant de lancer un import"
Exit Sub
End If
end with
Autre chose, tu as des déclarations de variables partout dans ton programme, mieux vaut ne mettre les déclarations qu'en début de variable, je parle uniquement des Dim, pas des affectations de valeurs
Je continue à regarder tout ça
EDIT :
' Définit le dossier de traitement
encore un select qui n'a pas lieu d'être, tu as déjà ton With, ou déjà sélectionné ta feuille
' Définit le fichier en cours
idem ici
' Définit la source Extraction SIP400
idem ici aussi :p
Copier coller
'Copier données de source
Range("A1:AV" & DERLIGN2).Select
Selection.Copy
'Coller données vers DATA
Windows(Nom).Activate 'modifier le nom du fichier si necessaire
Sheets("DATA").Select
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
Encore des select, du copy paste... En général on préfère utiliser des tableaux en VBA plutôt que de faire des copy paste, c'est plus long à écrire mais aussi plus long à exécuter normalement, je te laisse voir les tableaux en VBA et tester par toi même
'mise à jour suivi suppression
on retrouve encore notre fameux select, tu sais ce que j'en pense :p
Range("B20").Select
ActiveCell.FormulaR1C1 = 0
ça peut s'écrire en une seule ligne :
Range("B20").FormulaR1C1 = 0
Je commence à croire que ça a été fait à l'enregistreur de macro vu le nombre de select
'Mise à jour formules toutes lignes data
Sheets("DATA").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "Support"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Support 2"
Range("A2").Select
ActiveCell.FormulaR1C1 = "=RC[19]"
Range("B2").Select
ActiveCell.FormulaR1C1 = "=RIGHT(RC[-1],7)+0"
bon ben...
with Sheets("DATA")
.Range("A1") = "Support"
.Range("B1") = "Support2"
.Range("A2").FormulaR1C1 = "=RC[19]"
.Range("B2").FormulaR1C1 = "=RIGHT(RC[-1],7)+0"
end with
'dérouler toutes les lignes
Range("A2:B2").Select
Selection.AutoFill Destination:=Range("A2:B" & DERLIGN2)
ça peut se faire avec une boucle for :
ValColA = range("A2")
ValColB = range("B2")
for i = 3 to DERLIGN2
cells(i,1) = ValColA
cells(i,2) = ValColB
next i
'retour accueil
Sheets("ACCUEIL").Select
Comme on a enlevé les select avant, pas besoin de revenir à cette feuille, on supprime les lignes
Voilà, j'ai dis ce que j'avais à dire sur ton looooong programme, tu devrais essayer de coder un peu plus, l'enregistreur de macro c'est pratique, mais ça te mets plein de lignes inutiles
top merci pour tes éléments.
Je vais regarder cela de près.
En effet, j'ai compilé des bouts et il y a des parties qui ont été faite via enregistreur il y a bien longtemps.
je te tiens au jus
Bonjour, Salut Ausecour !
Je ne suivrai pas Ausecour pour ce qui est de multiplier les modules, je pense que l'on perd du temps à disperser son code dans un grand nombre de modules et qu'ajouter un module standard doit être justifié par la nature du code que l'on entend y placer par rapport au tout venant (par exemple: stockage de valeur à renvoyer par des porcédures Property, ce qui rend les variables destinées à conserver les valeurs non accessibles d'autres modules ; déclarations d'API et fonctions les utilisant ; sous-programme que l'on souhaite pouvoir exporter de façon autonome ; etc.).
Par contre je le suis entièrement pour ce qui est d'expurger les scories laissées par l'enregistreur. Ton code est en outre difficile à lire parce que non indenté, avec beaucoup de lignes vides intercalées alors qu'il n'y en a pas séparant les procédures... Indenter correctement facilite le travail sur le code, de même que respecter les principales règles conventionnelles (qui de plus ont une raison d'être) : placer les procédures Function en tête de module, après les Déclarations, mais avant les Sub, placer les déclarations de variables locales en tête de procédure, avant tout code exécutable, et puis écrire le code sans s'inspirer de l'enregistreur qui l'allonge toujours inconsidérément et inutilement (passage systématique des arguments par noms, reprise systématique des paramètres laissés à leur valeur par défaut, etc.). L'enregistreur n'y peut rien, il ne fait qu'enregistrer des manipulations sans réfléchir...
Cordialement.