IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Aide à l'optimisation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de sisopetron
    Homme Profil pro
    amateur
    Inscrit en
    Novembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Novembre 2016
    Messages : 35
    Par défaut Aide à l'optimisation
    Bonjour à tous,

    D'un journal comptable, j'essaie d'extraire les extraits de comptes (bancaire et caisse). Mais le code que j'ai écrit est lent, très lent, malgré que le recalcul et la mise à jour de l'affichage aient été stoppés.

    Voici une image vous montrant la structure du journal comptable :
    Nom : journal.png
Affichages : 165
Taille : 38,4 Ko

    Et voici la présentation des extraits à laquelle j'arrive :
    Nom : extraits.png
Affichages : 157
Taille : 49,3 Ko

    Enfin le code que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    For i = 18 To derniere_ligne_journal
     
            If Sheets("Journal").Range("F" & i) = compte_financier And Left(Sheets("Journal").Range("E" & i), 7) = "Extrait" Then
                Range("B" & ligne_insertion) = Sheets("Journal").Range("E" & i)
                Range("C" & ligne_insertion) = Sheets("Journal").Range("C" & i)
                Range("C" & ligne_insertion).NumberFormat = "dd/mm/yyyy;@"
                Range("C" & ligne_insertion).HorizontalAlignment = xlCenter
                If Sheets("Journal").Range("D" & i) = "" Then
                    Range("D" & ligne_insertion) = "*** Dépot cash ***"
                Else
                    Range("D" & ligne_insertion) = Sheets("Journal").Range("D" & i)
                End If
                Range("E" & ligne_insertion) = Sheets("Journal").Range("L" & i)
                Range("F" & ligne_insertion) = Sheets("Journal").Range("J" & i)
                Range("F" & ligne_insertion).NumberFormat = "0.00"
     
                ligne_insertion = ligne_insertion + 1
            End If
     
            If Sheets("Journal").Range("H" & i) = compte_financier And Left(Sheets("Journal").Range("E" & i), 7) = "Extrait" Then
                Range("B" & ligne_insertion) = Sheets("Journal").Range("E" & i)
                Range("C" & ligne_insertion) = Sheets("Journal").Range("C" & i)
                Range("C" & ligne_insertion).NumberFormat = "dd/mm/yyyy;@"
                Range("C" & ligne_insertion).HorizontalAlignment = xlCenter
                If Sheets("Journal").Range("D" & i) = "" Then
                    Range("D" & ligne_insertion) = "*** Retrait cash ***"
                Else
                    Range("D" & ligne_insertion) = Sheets("Journal").Range("D" & i)
                End If
                Range("E" & ligne_insertion) = Sheets("Journal").Range("L" & i)
                Range("F" & ligne_insertion) = 0 - Sheets("Journal").Range("J" & i)
                Range("F" & ligne_insertion).NumberFormat = "0.00"
     
                ligne_insertion = ligne_insertion + 1
            End If
     
        Next
     
        ' mise en forme de la feuille
     
        compteur_lignes = Range("B10").End(xlDown).Row     'nombre de lignes dans le tableau après mise en forme (insertion lignes)
        If compteur_lignes = 1048576 Then compteur_lignes = 10
     
        derligne = Range("B10").End(xlDown).Row
        If derligne = 1048576 Then derligne = 10
     
        Range("B10").Font.Color = RGB(255, 0, 0) 'rouge
     
        For i = derligne + 1 To 11 Step -1
     
            If Range("B" & i) = Range("B" & i - 1) Then
                Range("B" & i) = ""
                Range("C" & i) = ""
            Else
                Range("B" & i & ":" & "F" & i).Borders(xlEdgeTop).LineStyle = xlContinuous
                Range("B" & i).Font.Color = RGB(255, 0, 0) 'rouge
                Range("B" & i).Font.Color = RGB(255, 0, 0) 'rouge
                Range("G" & i).EntireRow.Insert
                compteur_lignes = compteur_lignes + 1
                Range("G" & i).EntireRow.Insert
                compteur_lignes = compteur_lignes + 1
                Range("G" & i).EntireRow.Insert
                compteur_lignes = compteur_lignes + 1
                Range("E" & i + 1) = "Solde de l'extrait : "
                Range("E" & i + 1).Font.Italic = True
                Range("E" & i + 1).Font.Bold = True
                Range("E" & i + 1).HorizontalAlignment = xlRight
            End If
     
        Next
     
        ' calcul du solde
     
        Dim solde As Double
        Dim montant As Double
     
        solde = Range("F8").Value
     
        For i = 10 To compteur_lignes
     
            If Range("F" & i) <> "" Then
                montant = montant + Range("F" & i).Value
            Else
                solde = solde + montant
                Range("F" & i + 1) = solde
                Range("F" & i + 1).Font.Italic = True
                Range("F" & i + 1).Font.Bold = True
                Range("F" & i + 1).Borders.Weight = 2
                Range("F" & i + 1).Borders.Color = RGB(255, 0, 0) 'rouge
                montant = 0
                i = i + 2
            End If
     
        Next
    Pourriez-vous m'aider à optimiser tout ça. Je précise que je suis sous excel mac 2016.

    Merci mille fois.

    siso

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    de quel type d'optimisation parles-tu ici ?

    optimisation de la syntaxe de code (moins de ligne ou plus simple a lire) ou bien une optimisation de performance ?

    deja tu as certaines lignes qui sont dupliquees pour rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("B" & i).Font.Color = RGB(255, 0, 0) 'rouge
                Range("B" & i).Font.Color = RGB(255, 0, 0) 'rouge

    Ensuite cote simplification du code, tu peux passer par exemple de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("E" & i + 1) = "Solde de l'extrait : "
                Range("E" & i + 1).Font.Italic = True
                Range("E" & i + 1).Font.Bold = True
                Range("E" & i + 1).HorizontalAlignment = xlRight
    a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With Range("E" & i + 1)
        .Value = "Solde de l'extrait : "
        With .Font
            .Italic = True
            .Bold = True
        End With
        .HorizontalAlignment = xlRight
    End With
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonjour
    Aussi comptable et débutant en VBA et pour exploiter un journal et sur la base des directives de ce super site je travail avec les tableaux...c'est plus rapide et plus performant
    voila un exemple comment déclarer un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub calcul_solde()
    Dim Tablo
    Dim i As Long
    Tablo = Sheets("BLABLABLA").Range("A3", "I" & Sheets("Mouvement").Range("I" & Rows.Count).End(xlUp).Row)
    For i = LBound(Tablo, 1) To UBound(Tablo, 1)
        If Tablo(i, 1) = "B T" Then
            resultat = resultat + Tablo(i, 9)
        End If
    Next i
    Sheets("Mouvement").Range("E4") = resultat
    Bonne continuationv

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 705
    Par défaut
    Bonjour,

    Tu peux aussi découper ton code pour avoir des sous-procedures. En particuliers, si tu fais toujours le même type d'opération sur différents blocs de cellules.
    Supposons que tu dois traiter une certain nombre de ligne de la même façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub opeSurUneLigne(i As Long)
        '...
         'tout ce qu'il y a à faire sur la ligne i
        '...
    End Sub
     
    Sub opeSurTout()
        Dim i As Long
        For i From 1 To 100
            Call opeSurUneLigne(i)
        Next i
    End Sub
    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub opeSurTout()
        Dim i As Long
        For i From 1 To 100
            '...
            'ce qu'il y a à faire sur la ligne i
            '...
        Next i
    End Sub
    C'est toujours mieux de découper son code en sous-routine et de faire appel à ces sous-routines dans une routine principale.

  5. #5
    Membre averti Avatar de sisopetron
    Homme Profil pro
    amateur
    Inscrit en
    Novembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Novembre 2016
    Messages : 35
    Par défaut
    A Jean-Philippe André : optimisation de code mais aussi et surtout en temps d'exécution : pour peu que dans mon compte il y ait 100 extraits courts (1 ou deux opération par extrait), les différentes boucles prennent presque 1 minute. C'est trop long.

    A BENNASR : c'est vrai que je ne suis pas familier avec les tableaux. Je vais étudier ça de près.

    A riaolle : J'ai déjà remarqué que mes routines étaient longues comparées aux routines qu'on trouve sur ce forum. Je vais travailler dans ce sens.

    Merci à vous trois pour ces idées. Je vais les mettre en pratique.

    Il me reste une interrogation : pour ce qui est de la "mise en page" que je désire obtenir, est-ce que je m'y prends bien ou y a-t-il un moyen moins lourd en temps pour obtenir le même résultat ?

  6. #6
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonjour
    et si tu fais directement sur la feuille choisie la mise en page de tes cellules qui vont recevoir les données sans passer par macro?? je crois que c'est mieux et tu évite tout ce traitement et chaque fois tu lance ton macro il va rien changer de ta mise en forme initiale

  7. #7
    Membre averti Avatar de sisopetron
    Homme Profil pro
    amateur
    Inscrit en
    Novembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Novembre 2016
    Messages : 35
    Par défaut
    C'est une option effectivement sauf que je ne sais pas combien d'opérations il y aura par extraits. C'est pour cette raison que j'ai choisi d'automatiser le tout.

Discussions similaires

  1. Besoin d'aide pour optimiser du code
    Par scaleo dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2007, 13h56
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  3. Aide pour optimiser une requete
    Par Akanath dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 11h05
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. aide pour optimisation
    Par iwio dans le forum C
    Réponses: 17
    Dernier message: 14/07/2005, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo