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 :

Acceleration et Optimisation de code


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable en logistique
    Inscrit en
    Mai 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable en logistique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 39
    Par défaut Acceleration et Optimisation de code
    Bonjour à tous,

    J'ai crée un code avec plusieurs USF qui m'affiche des infos a partir d'une BDD. Tous fonctionne trés bien. Mon seul soucis c'est que les infos sont récuperées sur une BDD de plus de 46000 lignes et donc cela prend du temps. J'imagine que le code que j'ai écris doit pouvoir être modifié, optimisé de maniére a fonctionner plus rapidement.

    Je souhaite avoir des conseils de personnes experimentées pour m'orienter sur la maniére de pouvoir reduire le temps de fonctionnment des macro.


    Je transmet en PJ le fichier excel. Les données de bases etant confidentielles, je l'ai ai donc remplacer. (Le classeur n'est plus trop comprehensible du coup lol). J'ai du reduire la BDD a 20000 lignes pour pouvoir le transferer sur le forum. Mais le fichier tourne sur plus de 46000.

    Je ne souhaite pas de solution "clé en main" comme on a pu me le reprocher sur d'autre demande d'aide. Je souhaite des conseils et des orientations pour avancer.


    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Citation Envoyé par stephb084 Voir le message
    Je ne souhaite pas de solution "clé en main" comme on a pu me le reprocher sur d'autre demande d'aide. Je souhaite des conseils et des orientations pour avancer.
    Bon j'ai survolé ton code et je pense que pour l’accélérer, il faudrait passer par des tableaux mémoire, au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        For Each Cell In Sheets("BDD").Range("C1:C" & i)
            'Stocke les données dans une collection
            '(La collection n'accepte que des données uniques et permet donc
            ' de filtrer facilement les doublons).
            If ListBox1.Text = Cell.Offset(0, -1) And Cell.Offset(0, 1) = "En cours" And Cell.Offset(0, 2) < Date Then
             Unique.Add Cell, CStr(Cell) 
    End If
    Next Cell
    par exemple mettre un code dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        tbd = Sheets("BDD").UsedRange.Cell(1, 1).Resize(Cells(Rows.Count, 3).End(xlUp).Row, Sheets("BDD").UsedRange.Columns.Count)
        For i = 1 To UBound(tbd)
            If ListBox1.Text = tbd(i, 2) And tbd(i, 4) = "En cours" And tbd(i, 5) < Date Then
                Unique.Add Cell, CStr(Cell)
            End If
        Next i
    Ainsi tu supprimes les adressages feuille qui sont bien plus longs

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir anasecu

    relis ce que tu a proposé Svp!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tbd = Sheets("BDD").UsedRange.Cell(1, 1).Resize(Cells(Rows.Count, 3).End(xlUp).Row, Sheets("BDD").UsedRange.Columns.Count)
        For i = 1 To UBound(tbd)
            If ListBox1.Text = tbd(i, 2) And tbd(i, 4) = "En cours" And tbd(i, 5) < Date Then
                Unique.Add Cell, CStr(Cell)
            End If
        Next i
    dans ta boucle c'est quoi "cell" !!!!!??????

    et ceci est dangereux et faux 'erreur 438"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tbd = Sheets("BDD").UsedRange.Cell(1, 1).Resize(Cells(Rows.Count, 3).End(xlUp).Row, Sheets("BDD").UsedRange.Columns.Count)
    et meme suposont que ca marche et que je veux la plage c1:d10 :10 etant la derniere ligne utilisée sur une feuille rempli jusque colonne F par exemple

    voyons voir ta ligne devrait me donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("BDD").UsedRange.Cell(1, 1).Resize(10, 6) on est loin de la plage C1:Cx
    tu vois le chmilblick
    resizer avec le columns.count oui!! sauf !!! si la plage ne commence pas en colonne A

    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonsoir Patrick,

    Tu as raison j'ai recopié la ligne qui aurait dû être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Unique.Add tbd(i, 3), CStr(tbd(i, 3))
    on est loin de la plage C1:Cx
    Oui mais là c'est tout à fait normal car il faut plus que la colonne C pour tester ! ;-)

    Comme je n'avais pas testé (honte à moi) il manquait aussi un 's'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        tbd = Sheets("BDD").Cells(1, 1).Resize(Cells(Rows.Count, 3).End(xlUp).Row, Sheets("BDD").UsedRange.Columns.Count).Value
    Merci de ta rectification mais elle était partielle...

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    reste que ceci n'est pas bon pour 2 raisons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tbd = Sheets("BDD").UsedRange.Cell(1, 1).Resize(Cells(Rows.Count, 3).End(xlUp).Row, Sheets("BDD").UsedRange.Columns.Count)
    veux tu savoir pourquoi?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    tien c'est pour toi annasecu
    c'est ce qui est voulu je crois il me semble
    rempli quelque ligne sur un sheets("BDD") en metant au moins une cellule pleine en colonne A et va jusqu'a a F ou plus copmme tu veux

    apres teste ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub testx1()
        With Sheets("BDD")
            'Set tbd = .UsedRange.Cell(1, 1).Resize(.Cells(Rows.Count, 3).End(xlUp).Row, .UsedRange.Columns.Count)
         Set tbd = .Range([c3], .Range([A3], .UsedRange)).Columns("C:C")
        MsgBox tbd.Address
        End With
    End Sub
    ou ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub testx2()
        With Sheets("BDD")
            'Set tbd = .UsedRange.Cell(1, 1).Resize(.Cells(Rows.Count, 3).End(xlUp).Row, .UsedRange.Columns.Count)
         Set tbd = .Range([c3], .UsedRange).Columns("C:C")
        MsgBox tbd.Address
        End With
    End Sub
    ou ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub testx3()
        With Sheets("BDD")
            'Set tbd = .UsedRange.Cell(1, 1).Resize(.Cells(Rows.Count, 3).End(xlUp).Row, .UsedRange.Columns.Count)
         Set tbd = .Range([c3], .Range([A3], .UsedRange)).Columns("C:C")
        MsgBox tbd.Address
        End With
    End Sub
    ou ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub testx4()
        With Sheets("BDD")
            'Set tbd = .UsedRange.Cell(1, 1).Resize(.Cells(Rows.Count, 3).End(xlUp).Row, .UsedRange.Columns.Count)
         Set tbd = .Range([A3], .UsedRange).Columns("C:C")
        MsgBox tbd.Address
        End With
    End Sub
    maintenant vide la colonne A et reteste surprise surprise

    le dernier exemple etant explicite de part l'address de colonne en string (et pourtant!!... comme dit la chanson)

    perso le cells(rows.count,y) .end(xlup) reste le plus sur

    et pour en revenir a steph comme elle boucle sur les valeurs sans selectionner c'est pas la qu'elle va gagner en velocité
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il y a plusieurs solutions. Les filtres avancés proposés par Patrick () en sont une, probablement très rapide.

    Question que je me pose: Pourquoi remplir une collection puis vider la collection dans la listbox? Pourquoi ne pas directement alimenter la listbox au moment du test?

    Autre solution, qui dépend de ta version d'Excel (il faut au moins la 2010). Utiliser PowerQuery qui ferait un peu office de filtre avancé mais qui ne nécessite comme programmation qu'une actualisation de la table produite par PowerQuery.

    Autre chose: Savoir ce que tu souhaites réaliser pour te proposer, peut-être, une meilleure conception de ton classeur et de ton code.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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