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

Set Cel = F1.Columns("E").Find(what:=col_e, LookIn:=xlValues, lookat:=xlWhole)

merci pour votre aide, car je suis actuelement bloqué par rapport au temps d’exécution qui est interminable

Bonne journée

Bonjour,

Difficile de t'aider avec aussi peu d'éléments. On ne sait ni dans quel code, ni dans quel fichier ni même pour quel(s) objectif(s) s'utilise ton extrait de code ! On ne peut pas t'aider à l'aveugle...

Pour moi, un simple filtre sur ton critère pourrait faire l'affaire. Find doit fonctionner aussi mais il est possible d'accéléré l'exécution en désactivant l'affichage ou le recalcul auto des formules Excel le temps d’exécuter la macro.

Bonjour,

Difficile de t'aider avec aussi peu d'éléments. On ne sait ni dans quel code, ni dans quel fichier ni même pour quel(s) objectif(s) s'utilise ton extrait de code ! On ne peut pas t'aider à l'aveugle...

Pour moi, un simple filtre sur ton critère pourrait faire l'affaire. Find doit fonctionner aussi mais il est possible d'accéléré l'exécution en désactivant l'affichage ou le recalcul auto des formules Excel le temps d’exécuter la macro.

Bonjour,

voici ci dessous mon code. j'ai déjà désactiver les affichages et les recalculs, mais cela ne change rien au temps d'exécution.

En effet mon onglet execl F1 contenant environs 500000 lignes, je pense que le problème de lenteur vient de là.

Est ce qu'il existe un autre moyen de parcourir plus rapidement la feuille F1 ?

Merci pour ton aide.

'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

C'est mieux, mais ça reste toujours un extrait incomplet ! Tu peux aussi charger tes données dans une variable tableau et les parcourir à l'aide de boucles "For...Next" par exemple.

Aussi, ton instruction "Find" cherches sur toute la colonne "E", tu gagneras en performances en travaillant sur une plage finie, par exemple avec un code du type :

Range("E2:E" & DerLig)

C'est mieux, mais ça reste toujours un extrait incomplet ! Tu peux aussi charger tes données dans une variable tableau et les parcourir à l'aide de boucles "For...Next" par exemple.

Aussi, ton instruction "Find" cherches sur toute la colonne "E", tu gagneras en performances en travaillant sur une plage finie, par exemple avec un code du type :

Range("E2:E" & DerLig)

En ajoutant la plage dans le "Find", cela ne change rien au temps d'exécution qui est toujours aussi lent.

J'ai déjè testé en utilisant une variable tableau, et même en utilisant un tableau le temps d'exécution est toujours anormalement élevé.

Est ce que quelqu'un aurait une technique pour effectuer une recherche rapide sur un fichier de plus de 500 000 lignes svp ? car je ne sais plus quoi faire pour régler ce problème.

J'ai déjà tout essayer.

Merci encore pour votre aide

Ci dessous le code modifier avec le fichier chargé dans une variable tableau:

'Parcours du fichier FAUST

For k = 1 To UBound(ligne_fic)

a = a + 1
'c = ligne_fic(k) & "33"
'F1.Range("A" & k) = c
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
tem = False
For b = 0 To UBound(tab_isis, 2)
  If tab_isis(4, b) = col_e Then
     If tem = False Then
        isis_a = tab_isis(0, b)
        isis_b = tab_isis(1, b)
        isis_c = tab_isis(2, b)
        isis_d = tab_isis(3, b)
        isis_e = tab_isis(4, b)
        tem = True
      End If
  End If

Next b

if tem =true then
'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 "Aucun enregistrent trouvé"

End if

next k

Bonjour,

.Find est relativement rapide.

Regarde plutôt ta boucle For k = 1 To UBound(ligne_fic) qui fait 5 écritures individuelles sur feuille à chaque passage..

Si c'est ligne_fic qui fait 500000, lit en une fois F2.[A:E] (limité aux lignes nécessaires), modifie dans ta variable tableau, et écrit tout en une fois.

eric

Bonjour,

.Find est relativement rapide.

Regarde plutôt ta boucle For k = 1 To UBound(ligne_fic) qui fait 5 écritures individuelles sur feuille à chaque passage..

Si c'est ligne_fic qui fait 500000, lit en une fois F2.[A:E] (limité aux lignes nécessaires), modifie dans ta variable tableau, et écrit tout en une fois.

eric

Bonjour,

Je ne comprend pas tes préconisations. Est ce que tu peux être plus clair stp ?

Bonjour,

.Find est relativement rapide.

Regarde plutôt ta boucle For k = 1 To UBound(ligne_fic) qui fait 5 écritures individuelles sur feuille à chaque passage..

Si c'est ligne_fic qui fait 500000, lit en une fois F2.[A:E] (limité aux lignes nécessaires), modifie dans ta variable tableau, et écrit tout en une fois.

eric

Bonjour,

Je ne comprend pas tes préconisations. Est ce que tu peux être plus clair stp ?

En plus en mettant la commande : Set Cel = F1.Range("E2:E" & LastLig).Find(what:=col_e, LookIn:=xlValues, lookat:=xlWhole)

en commentaire.

on constate que le parcours dans la boucle For k = 1 To UBound(ligne_fic) se fait beaucoup plus rapidement. ce qui me fait penser que le problème vient de la commande Find.

Car la recherche se fait dans la feuille F1 qui contient près de 500 000 lignes.

IL n'y a pas un moyen plus rapide de faire cette recherche ?

Bonjour à tous,

Je me permets de proposer ma méthode perso.

Les données sont placées dans un tableau et on filtre en fonction de la valeur recherchée.

Ici dans l'exemple :

* en Feuil1 : 1800 lignes de données bidon

* en Feuil2 : 2 textbox, colonnes B et E dont la saisie filtre les données selon ces 2 colonnes, le résultat de la recherche s'affiche au dessous au fur et à mesure.

Dans le filtre on peut facilement ajouter d'autres colonnes de critères si besoin.

Il faudrait voir ce que ça donne avec 500 000 lignes.

Pierre

Je ne comprend pas tes préconisations. Est ce que tu peux être plus clair stp ?

Nojn. Je viens de voir que tu postes dans différents forums et je n'aime pas perdre mon temps.

C'est peut-être déjà expliqué ailleurs, cherche.

eric

Salut Spike_thebloody,

Salut l'équipe,

je m'y perds dans ton code...

Possible de nous faire un fichier non-protégé de quelques centaines de lignes avec explications ?

A+

Rechercher des sujets similaires à "recherche rapide vba"