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 :

Recherche rapide en vba


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
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut Recherche rapide en vba
    Bonjour,

    je voudrais savoir si quelqu'un connait une fonction permettant d'effectuer une recherche rapide d'un enregistrement en vba.

    En effet j'essaye de faire des recherches dans un fichier contenant 500 000 lignes. Lorsque j'utilise la fonction Find, cela prend énormément de temps pour parcourir le fichier.

    Cela fait même planter excel car le temps d’exécution est trop long. Est ce que quelqu'un connait une commande me permettant de trouver rapidement la cellule qui m’intéresse svp ?

    Ci dessous la commande que j'utilise : je parcours en fait la colonne E pour retrouver la cellule ayant pour valeur col_e dans la colonne E

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel = F1.Columns("E").Find(what:=col_e, LookIn:=xlValues, lookat:=xlWhole)
    merci pour votre aide, car je suis actuellement bloqué par rapport au temps d’exécution qui est interminable

    Bonne journée

  2. #2
    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
    commence par limiter la recherche a la plage utilisée plutot que la colonne entiere
    ensuite essaie autofilter
    cela dit un simple find meme pour beaucoup de lignes ne devrait pas te planter l'app
    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

  3. #3
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Bonjour
    commence par limiter la recherche a la plage utilisée plutot que la colonne entiere
    ensuite essaie autofilter
    cela dit un simple find meme pour beaucoup de lignes ne devrait pas te planter l'app
    merci pour ta réponse

    Quelle est la syntaxe de la fonction autofilter ? et comment je peux faire pour récupérer la ligne correspondante à ma recherche comme on l'a fait avec la fonction Find.

    En effet je recherche dans un onglet F1 la ligne ayant pour valeur col_e dans la colonne E. une fois trouvée, je vais pouvoir copier cette ligne dans un autre fichier.


    Merci encore pour ton retour.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si tu travailles avec des fichiers si gros de manière régulière abandonne Excel et passe sur une base de données.

    Philippe

  5. #5
    Membre averti
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2019
    Messages : 15
    Par défaut
    Citation Envoyé par Philippe JOCHMANS Voir le message
    Bonjour,

    Si tu travailles avec des fichiers si gros de manière régulière abandonne Excel et passe sur une base de données.

    Philippe
    Bonjour,

    en fait je suis entrain de mettre en place un comparateur de fichiers. qui va à partir d'un fichier csv stocké, vérifier la présence de numéro de dossiers dans l'onglet excel.
    C'est la raison pour laquelle j'utilise Excel pour cette comparaison.
    Le problème c'est que la recherche dans Excel est très lente et je ne sais plus quoi utiliser comme fonction pour les recherches.

    J'ai même déjà essayer de passer par une variable tableau pour stocker les données de la feuille F1 et comme ça parcourir directement le tableau à la recherche du numéro de dossier mais cela ne change rien aux temps d’exécution.
    Est ce que quelqu'un connait une fonction de recherche beaucoup plus rapide.

    Ou alors est ce que c'est possible de faire un "select * from TABLE where col_e=xxx" avec TABLE étant une variable tableau qui va stocker les données de la feuille F1.

    Ci dessous un extrait de mon code :

    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
     
    'on parcours le fichier ligne_fic pour verifier la présence des n° de dossiers dans l'onglet F1 du fichier excel
    For k = 1 To UBound(ligne_fic)
     
    colonne_fic = Split(ligne_fic(k), ";")
             For n = 0 To UBound(colonne_fic)
             'récupération des valeurs correspondantes aux colonnes du fichier FAUST
             col_a = colonne_fic(0)
             col_b = colonne_fic(1)
             col_c = colonne_fic(2)
             col_d = colonne_fic(3)
             col_e = colonne_fic(4)
             Next n
     
    'Recherche de l'enregistrement de FAUST dans ISIS
    Set Cel = F1.Columns("E").Find(what:=col_e, LookIn:=xlValues, lookat:=xlWhole)
     
    If Not Cel Is Nothing Then                          'Si enregistrement trouvé dans ISIS
    'Copie de la ligne FAUST
    Ligne1 = Ligne1 + 1
    F2.Range("A" & Ligne1) = col_a
    F2.Range("B" & Ligne1) = col_b
    F2.Range("C" & Ligne1) = col_c
    F2.Range("D" & Ligne1) = col_d
    F2.Range("E" & Ligne1) = col_e
     
    Else
     
    msgbox ("Dossier introuvable")
     
     
    End if
     
    Next k

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ancien Etudiant
    Inscrit en
    Janvier 2019
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ancien Etudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 152
    Par défaut
    Bonjour,

    bien que n'ayant pas eu de réponse dans cette discussion https://www.developpez.net/forums/d1...ode-vba-excel/

    avant la boucle for k..
    déclarer et alimenter un dictionary avec les éléments de la colonne E feuille F1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Dico, i As Long, T
    Set Dico = CreateObject("Scripting.Dictionary")
    With F1
    T = .Range("E1:E" & .Range("E" & Rows.Count).End(xlUp).Row)
    End With
    For i = LBound(T) To UBound(T)
        Dico(T(i, 1)) = ""
    Next
    Puis remplacer la partie entre
    'on parcours le fichier ligne_fic pour verifier la ....
    et
    Next k

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Dico.Exists(colonne_fic(4)) Then
        Ligne1 = Ligne1 + 1
        F2.Range("A" & Ligne1).Resize(1, UBound(colonne_fic)) = colonne_fic
    Else
        MsgBox ("Dossier " & colonne_fic(4) & " introuvable")
    End If
    Ca devraient déjà diminuer énormément le temps de traitement . Si ce n'était pas encore assez rapide, plutôt que d'écrire chaque ligne dans la feuille (très gourmand en temps) il faudrait écrire ces lignes dans un tableau (array) qui serait "collé" dans la feuille en fin de traitement.

    A+

Discussions similaires

  1. [VBA][XML] Recherche rapide
    Par DotNET74 dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/03/2007, 07h56
  2. Réponses: 7
    Dernier message: 15/02/2006, 12h52
  3. Recherche rapide dans un TDBGrid
    Par Dinytro dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/03/2005, 01h29
  4. Recherche rapide
    Par Pylz dans le forum C++Builder
    Réponses: 14
    Dernier message: 28/02/2005, 14h53
  5. [Kylix] Combobox recherche rapide
    Par litbos dans le forum EDI
    Réponses: 3
    Dernier message: 29/08/2003, 11h13

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