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 :

Optimiser code recherche sur plus de 1000 000 lignes [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 226
    Par défaut Optimiser code recherche sur plus de 1000 000 lignes
    Bonjour,

    J'ai effectué une macro qui recherche, le codes des ports maritimes dans tous les pays du monde, j'ai une base de 104 986 lignes. Le résultat est affiché dans une listebox.

    Le code ci-dessous fonctionne, en revanche pour 104 986 lignes c'est long et fait bugger le fichier. Pourtant j'ai un pc correct I3 dernière génération et 8 go de ram avec ssd , je pense pas que mon pc soit en cause. lol

    Pensez-vous qu'un code plus optimisé permettrait d’accélérer la recherche?

    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
     
    Option Compare Text
     
    Private Sub TextBox1_Change()
     
        Application.ScreenUpdating = False
     
    ' ActiveSheet.Unprotect
     
        ListBox1.Clear
     
        If TextBox1 <> "" Then
            For ligne = 2 To 104986
                If Cells(ligne, 1) Like "*" & TextBox1 & "*" Then
                    ListBox1.AddItem Cells(ligne, 1)
                End If
            Next
        End If
     
    'ActiveSheet.Protect
     
    End Sub
    Merci d'avance.

  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
    Bonjour,

    je pose la question a toute fin utile :
    pourquoi ne pas passer par Access ?


    Sinon, a la place de faire un traitement ligne a ligne, pourquoi ne passes-tu pas par un filtre Excel ? La decomposition du code se ferait en 3 etapes :
    - application du filtre sur tes donnees
    - vidage d'une zone recipient, copie/collage des donnees filtrees
    - alimentation a partir de la zone recipient avec la propriete RowSource
    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
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 226
    Par défaut
    Salut les gars,

    En effet Menhir je suis d'accord mais j'ai que excel de dispo.

    Ben c'est vrai qu'avec 2013 on à quand même pas mal de place pour placer des données. Mais la c'est too much.

    Pense que je vais restreindre les données par utilisateur. Etant donnée que pas tous le monde à besoin des chercher sur les 1000 000 de lignes.

    @Jean-Philippe André tu as des exmples de code qui permet de filtrer?

    Merci

  4. #4
    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
    Bien sur, issu de l'enregistreur de macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("A1").AutoFilter
    ActiveSheet.Range("$A$1:$A$8").AutoFilter Field:=1, Criteria1:="=*I*", _
            Operator:=xlAnd
    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

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par nonesofar Voir le message
    En effet Menhir je suis d'accord mais j'ai que excel de dispo.
    Juste pour info et sans vouloir insister lourdement, Open Base et Libre Base sont gratuits.
    http://www.openoffice.org/fr/
    http://fr.libreoffice.org/
    Je conseille plutôt le premier.

  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
    Bonjour
    c'est un vrai casse tete chinois ces filtres tout du moins l'utilisation des resultat

    depuis tout a l'heure je suis en traine d'essayer de mettre la plage obtenu dans la liste box et rien ne fait j'ai des erreurs complètement incohérentes
    la plage obtenue directement dans list marche pas
    alors
    tant pis on copie la plage dans une autre colonne et on récupère le tableau le tableau est bon sur le sheets mais... ben ca marche pas

    rien mais alors rien ne marche c'est un truc qui me fait monter la tentions depuis tout a l'heure


    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
    Private Sub CommandButton1_Click()
        Dim tableau
        With ActiveSheet   ' plage a adapter
            .Range("$A$1:$A$" & Rows.Count).AutoFilter Field:=1, Criteria1:="=*" & TextBox1 & "*"  'mot recherché a adapter
            'pour connaitre l'adress des cellules concernées par le filtre sans les cellules adgacentes
            'plage =.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Address' j'ai bien les bonne cellules non contiguës dans l'addresse
            .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Destination:=[c1]c'est bien copié dans la colonne C 
            Application.Wait (Now + TimeValue("0:00:02"))' on fait une pose café au cas ou 
            derlig = .Cells(Rows.Count, 3).End(xlUp).Row récupération de la derniere ligne de C 
            tableau = .Range(.Cells(1, 3), .Cells(derlig, 3)).Value tableau est remplie 
            .Range("$A$1:$A$" & Rows.Count).AutoFilter    ' stop le filtre
            MsgBox derlig
            ListBox1.List = tableau
        End With
    End Sub
    un truc de fou je vous dis moi
    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
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    le coup du SpecialCells(XlCellTypeVisible) qui tape au mauvais endroit (récupération des lignes non visibles ou arrêt de la plage à la première ligne masquée), je rencontre parfois également des surprises.

    En gros, la sélection s'effectue sur le premier Areas de la zone, et ensuite il s'arrête on dirait


    Du coup, je procède différemment maintenant :

    - filtre avancé avec fonction d'export dans une autre feuille
    - mise sous Array du résultat
    - injection du Array dans la listbox

  8. #8
    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,
    je me permets de m'auto-citer
    Citation Envoyé par Jean-Philippe André Voir le message


    - application du filtre sur tes donnees
    - vidage d'une zone recipient, copie/collage des donnees filtrees
    - alimentation a partir de la zone recipient avec la propriete RowSource
    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

  9. #9
    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
    Salut,
    je me permets de m'auto-citer

    Envoyé par Jean-Philippe André


    - application du filtre sur tes donnees
    - vidage d'une zone recipient, copie/collage des donnees filtrees
    - alimentation a partir de la zone recipient avec la propriete RowSource



    ou ".list"
    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

  10. #10
    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
    aurais tu la possibilité de nous faire parvenir un exemple de fichier avec un centaine de ligne au moins en xlx(sans macro)
    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

  11. #11
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Perso, je pense que tu est en train d'utiliser un couteau de cuisine pour visser des vis cruciformes.
    Plus clairement, tu n'utilises pas le bon outil.

    Excel est conçu pour faire des calculs.
    Là, tu fais de la gestion de base de données.
    Donc, tu devrais utiliser un logiciel de gestion de base de données comme Access, Open Base ou Libre Base (ou autres) qui sont bien plus adaptés à ton besoin.

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

Discussions similaires

  1. Optimisation requête avec Group BY sur 600 000 lignes
    Par kimaidou dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/03/2011, 13h01
  2. comme optimiser cette requête sur 12.000 enr.
    Par chapeau_melon dans le forum WinDev
    Réponses: 2
    Dernier message: 22/03/2008, 19h36
  3. Réponses: 3
    Dernier message: 09/05/2006, 19h06
  4. Experts Mysql : Optimiser une requete sur codes postaux
    Par El Riiico dans le forum Requêtes
    Réponses: 6
    Dernier message: 20/01/2006, 18h00

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