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 :

Optimisation macro et fichier


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Comptable
    Inscrit en
    Novembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Novembre 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Optimisation macro et fichier
    Bonsoir,

    Afin de gérer le travail de plusieurs collaborateurs, je suis en train de développer un fichier de gestion de travail de groupe.

    Je me retrouve face à 2 problèmes.

    1] Optimisation d'un macro : Afin de traiter ma BDD dans plusieurs onglet, j'ai crée la macro mentionné ci-dessous. Le soucis est que son exécution prend trop de temps.
    2] Si en cours d'année, j'insère une nouvelle ligne dans l'onglet liste, les informations saisies dans les onglet suivant ne correspondent plus au bon dossier >

    Je suis ouvert à tout piste, merci de votre collaboration.

    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
    Private Sub Worksheet_Activate()
    Feuil4.[C5:C99].ClearContents
    With Feuil2
    'Reprise des informations de l'onglet LISTE
    i = 5
    For lig = 5 To .[D65000].End(3).Row
    If .Cells(lig, 20) = "X" Then
    Feuil4.Cells(i, 3) = .Cells(lig, 3)
    Feuil4.Cells(i, 4) = .Cells(lig, 6)
    Feuil4.Cells(i, 5) = .Cells(lig, 8): i = i + 1
    End If
    Next
    End With
     
    With Feuil4
    'Masquer les lignes vides
    For i = 5 To 99  'Numéro des lignes concerné
     
    If Range("C" & i) = "" Then ' je test si la cellule C est vide
    Rows(i).Select  'Selectionne la ligne
        Selection.EntireRow.Hidden = True
        Else
    Rows(i).Select  'Selectionne la ligne
        Selection.EntireRow.Hidden = False
        End If
        Next i
     
    End With
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    1)
    With Feuil2
    'Reprise des informations de l'onglet LISTE
    i = 5
    For lig = 5 To .[D65000].End(3).Row
    If .Cells(lig, 20) = "X" Then
    Feuil4.Cells(i, 3) = .Cells(lig, 3)
    Feuil4.Cells(i, 4) = .Cells(lig, 6)
    Feuil4.Cells(i, 5) = .Cells(lig, 8): i = i + 1
    End If
    Next
    End With
    euh ..

    A quoi te sert donc ce compteur i, qui finit par avoir la valeur lig ???? -->> à rien, finalement i = lig !
    2) tu irais beaucoup plus vite de cette manière :
    - constitution de la plage des cellules à copier -->> ouvre ton aide interne VBA à la rubrique Application.Union, méthode et applique-la
    - copy d'un seul coup de toute cette plage dans la feuille de destination --->> ouvre ton aide VBA à la rubrique Range.Copy, méthode et applique-la
    Ce ne sera pas deux ou trois fois plus rapide, mais beaucoup plus !

    Commence par cela.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Bonjour,

    En réponse et complément de la réponse de @unparia:

    1) @unparia, sa variable i ne vaut pas lig, il suffit par exemple que les lignes 5 à 10 ne contiennent pas "X", i vaut alors toujours 5 tandis que lig vaut 10, et je ne vois pas vraiment comment l'optimiser.

    Par contre, @Yoann1979
    Pour optimiser les temps d'exécution, tu peux :
    - Stocker tes feuilles dans des variables
    - Masquer les lignes sans les sélectionner
    - Transformer tes "Range" en "cells" quand la plage n'est que d'une seule cellule (ex : Range("C" & i) )
    - Simplifier tes conditions de masquage des lignes (déclarer un booléen par avance à false, vérifier si la ligne doit être masquée, si oui, passer le booléen à false, et dans tous les cas utiliser le booléen pour gérer la propriété .hidden)

    Pour rendre ton classeur plus adapté à toutes les versions d'Excel tu peux :
    - Utiliser ".Cells(Rows.Count, 4)" à la place de ".[D65000]"

    Et pour rendre ton code plus propre, je recommande fortement :
    - D'utiliser "Option explicit" pour obliger la déclaration de toutes tes variables
    - D'utiliser le "With" sur ta feuil4 tout le long
    - D'indiquer le ".value" à la fin de tes cellules (permet également d'éviter des bêtises)
    - Ton "With Feui4" était inutile, tu travailles sur les "Range" de ta dernière feuille active car tu avais oublié le "."
    - De remplacer ".End(3).Row" par ".End(xlUp).Row"

    Ce qui
    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
     
    Option Explicit
     
    Private Sub Worksheet_Activate()
        Dim i As Long, lig As Long
        Dim mask As Boolean
        ''''''Pour améliorer les temps de calcul, stocker les objets "Feuil" dans des variables :
        Dim feui2 As Worksheet, feui4 As Worksheet
     
        With ThisWorkbook
            Set feui2 = .Sheets("Feuil2")
            Set feui4 = .Sheets("Feuil4")
        End With
     
        With feui4
            i = 5
     
            For lig = 5 To feui2.Cells(Rows.Count, 4).End(xlUp).Row ''''''Equivalent à "For lig = 5 To .[D65000].End(3).Row" en plus performant, plus adaptatif et plus propre
                If feui2.Cells(lig, 20).value = "X" Then
                    .Cells(i, 3).value = feui2.Cells(lig, 3).value
                    .Cells(i, 4).value = feui2.Cells(lig, 6).value
                    .Cells(i, 5).value = feui2.Cells(lig, 8).value
                    i = i + 1 ''''''Plus lisible de séparer cette instruction de la précédente
                End If
            Next lig
     
            'Masquer les lignes vides
            For i = 5 To 99  'Numéro des lignes concernées
     
                mask = False 'On considère initialement que la ligne doit être visible
                If .Cells(i, 3).value = "" Then mask = True 'Test si cellule Ci est vide, si c'est le cas, on masquera la ligne
     
                .Rows(i).EntireRow.Hidden = mask 'Masquer ou non la ligne selon le test précédent
            Next i
        End With
    End Sub
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

Discussions similaires

  1. [XL-2013] optimisation macro recherche dans un fichier texte
    Par n.elamari dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/09/2017, 12h44
  2. optimisation macro de traitement d'un fichier de données
    Par jalinn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2008, 20h00
  3. [VBA][Excel]Exécution macro avec fichiers source
    Par ouezon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/12/2005, 00h00
  4. [SAX] [Optimisation] Découper un fichier XML
    Par ujoodha dans le forum Format d'échange (XML, JSON...)
    Réponses: 14
    Dernier message: 27/10/2005, 17h02
  5. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 14h30

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