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

Spoiler

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

Spoiler

'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

Spoiler

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

Spoiler

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.

Rechercher des sujets similaires à "optimisation macro vba"