Excel Downloads
Forum

Précédent   Excel Downloads Forums > Excel > Forum Excel


Réponse
 
LinkBack Outils de la discussion
Vieux 03/08/2007, 17h27   #1 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut [Résolu]Problème temps exécution

Bonjour,


J'ai 2 fichiers excel, un contient une liste de données avec pour chaque ligne un identifiant et des données quelconques, et l autre une liste de données avec pour chaque ligne un identifiant et une valeur X.

Mon but est de parcourir le premier et d'aller chercher pour chaque ligne la valeur X correspondante au meme identifiant de l'autre fichier. Et vu que mon 2 ème fichier contient à peu près 10 000 identifiants (lignes), il en résulte un traitement très long.

Alors au début j'allais chercher la valeur X en comparant l'identifiant de chaque ligne à l'aide d'une boucle, et si il y avait correspondance je renvoyais la valeur X.

Ensuite j'ai essayé d'appliquer un autofilter en espérant gagner du temps mais cela n'a rien changé...

Comment faire pour gagner du temps d'exécution?

PS: A chaque ligne de mon fichier 1 je fais donc un filtre sur le fichier2 pour un identifiant donné. Donc à chaque ligne je vois le résultat du filtrage pendant l'exécution du programme. Est-il possible de mettre le fichier invisible pour gagner le temps d'affichage?

Merci,

Laurent

Dernière modification par viscere ; 06/08/2007 à 13h07.
viscere est déconnecté   Réponse avec citation
ANNONCES
Vieux 03/08/2007, 17h32   #2 (permalink)
XLDnaute Barbatruc
 
Avatar de BrunoM45
 
Date d'inscription: avril 2005
Localisation: MONTARGIS (la Venise du Gâtinais)
Version Excel : Excel 2003 (PC)
Messages: 2 571
Lightbulb Re : Problème temps exécution

Salut,

Pourquoi ne pas utiliser la fonction "Find" d'Excel !
Voilà ce que j'utilise dans mes macros :
Code:
 
Function LigFind(Feuil As String, NumCol As Integer, Quoi)
  On Error Resume Next
  With Sheets(Feuil).Columns(NumCol)
      ' On recherche une valeur
      LigFind = .Find(What:=Quoi, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False).Row
  End With
  On Error GoTo 0
End Function
Cela me retourne le numéro de la ligne trouvée et 0 si rien trouvé

A adapter selon les besoins
__________________
Cordi@lement.

La politesse est comme le zéro, qui, sans avoir de valeur en soi, en ajoute à toutes choses.

VBA, vous ne savez pas comment faire ... Pensez à l'enregistreur de macro !
Menu -> Outils -> Macro -> Nouvelle macro

Si vous souhaitez rejoindre le club des Supporters d'XLD ... c'est ICI

Petite citation : C'est en XLDant que l'on devient XLDnaute Barbatruc ...
BrunoM45 est déconnecté   Réponse avec citation
Vieux 03/08/2007, 18h29   #3 (permalink)
XLDnaute Accro
 
Avatar de Gael
 
Date d'inscription: mai 2005
Localisation: Inzinzac-Lochrist
Version Excel : Excel 2000 (PC)
Messages: 1 778
Par défaut Re : Problème temps exécution

Bonjour Viscere, bonjour Bruno,

Pourquoi ne pas utiliser les tables en mémoire qui sont très simple à mettre en oeuvre et avec des temps de traitement extremement rapides.

Par exemple:

Code:
Dim Tablo as variant
Tablo = Sheets("Feuil1").Range("a3").CurrentRegion
Ce code crée un tableau à 2 dimensions qui contient toute la plage de données correspondante de "Feuil1".

Après, tu travaille avec Tablo(i,j) dans des boucles et les recherches seront beaucoup plus rapides.

@+

Gael
Gael est déconnecté   Réponse avec citation
Vieux 06/08/2007, 10h23   #4 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Merci pour ces astuces. Pour le tableau si je veux plus d'une colonne par exemple je voudrais la colonne A et B c'est possible?
viscere est déconnecté   Réponse avec citation
Vieux 06/08/2007, 10h46   #5 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Bon je gagne pas mal de temps avec la solution du tableau mais c'est pas encore ca!! Je vais tester le find.
viscere est déconnecté   Réponse avec citation
Vieux 06/08/2007, 11h35   #6 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Bon résultat des courses ca va largement plus vite avec Find. Néanmoins je n'arrive pas à chercher par valeur et non par chaine de caractère.

Je m'explique mon champs de recherche peut etre soit de la forme :

000025458487
soit 25458487

Avant quand je comparais dans ma boucle je pouvais faire

if Val(X) = Val(Quoi) then .....

Mais dans la fonction Find comment puis je faire?
viscere est déconnecté   Réponse avec citation
Vieux 06/08/2007, 13h06   #7 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

C'est bon il fallait juste que je mette le paramètre lookAt à XlPart et non XlWhole.

Donc pour résumer

méthode Find = 12 sec
méthode Tableau 55 sec
boucles (non calculée mais encore plus long)

Merci à tous
viscere est déconnecté   Réponse avec citation
Vieux 06/08/2007, 13h59   #8 (permalink)
XLDnaute Barbatruc
 
Avatar de BrunoM45
 
Date d'inscription: avril 2005
Localisation: MONTARGIS (la Venise du Gâtinais)
Version Excel : Excel 2003 (PC)
Messages: 2 571
Lightbulb Re : Problème temps exécution

Salut Viscere,

La fonction ".Find" est en fait la méthode "Rechercher" d'Excel, donc ultra rapide !

Tous les autres codes font des recherches séquentielles, donc forcément plus long

A+
__________________
Cordi@lement.

La politesse est comme le zéro, qui, sans avoir de valeur en soi, en ajoute à toutes choses.

VBA, vous ne savez pas comment faire ... Pensez à l'enregistreur de macro !
Menu -> Outils -> Macro -> Nouvelle macro

Si vous souhaitez rejoindre le club des Supporters d'XLD ... c'est ICI

Petite citation : C'est en XLDant que l'on devient XLDnaute Barbatruc ...
BrunoM45 est déconnecté   Réponse avec citation
Vieux 06/08/2007, 15h26   #9 (permalink)
XLDnaute Accro
 
Avatar de Gael
 
Date d'inscription: mai 2005
Localisation: Inzinzac-Lochrist
Version Excel : Excel 2000 (PC)
Messages: 1 778
Par défaut Re : Problème temps exécution

Bonjour à tous,

Je ne pensais pas que la fonction Find était plus rapide, pourtant je l'utilise de temps en temps. du coup j'ai récupéré le code de Bruno qui me paraît plus simple que mon code (merci Bruno!).

Par contre, Viscere, si tu pouvais joindre les codes de tests que tu as réalisé, ce serait sympa.

Merci et @+

Gael
Gael est déconnecté   Réponse avec citation
Vieux 06/08/2007, 15h34   #10 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Code:
Set Cellule = ListeExhauWorkBook.Sheets("Liste").Range("A2")
Set CelluleTemp = FeuilleTemp.Range("A1")

Dim i As Integer
i = 0

Do While Cellule.Offset(i) <> ""
       
    CelluleTemp.Offset(i, 9) = RenvoieDonneeEta1(Cellule.Offset(i, 7), Eta1Workbook, "B")     i = i + 1
    
Loop
Code:
Function RenvoieDonneeEta1(NumSej As String, Eta1Workbook As Workbook, IdCell As String) As String

    Dim i As Integer
    
    i = 0
    
    i = LigFind("eta1", 1, NumSej)
    
    If (i <> 0) Then
    
        RenvoieDonneeEta1 = Eta1Workbook.Sheets("eta1").Range(IdCell & i)
        Exit Function
    
    End If
    
    RenvoieDonneeEta1 = ""

End Function
j'ai effacé les versions boucles et tableau mais c tout simple. tu parcours ta feuille (ou ton tableau) et tu test si la valeur recherché est présente dans la case voulue.
viscere est déconnecté   Réponse avec citation
Vieux 06/08/2007, 22h11   #11 (permalink)
XLDnaute Accro
 
Avatar de Gael
 
Date d'inscription: mai 2005
Localisation: Inzinzac-Lochrist
Version Excel : Excel 2000 (PC)
Messages: 1 778
Par défaut Re : Problème temps exécution

Rebonjour à tous,

J'ai fait quelques essais de vitesse de recherche et de mise à jour que tu trouveras dans le fichier joint. Il est limité à 1000 références pour que sa taille soit en dessous de 50k mais tu peux le compléter.

Je l'ai créé de la façon suivante:

1 - Création d'une suite de 1000 références de A1000 à A2000 en Feuil1 colonne A
2 - Copie de ces 1000 références en Feuil2 colonne A
3 - Création de 1000 valeurs aléatoires en feuil1 colonne B
4 - Copier collage valeurs pour supprimer la fonction aléatoire
5 - Tri de la feuil1 par valeurs pour que les références soient dans un ordre quelconque.

Les 2 procédures font la même chose, l'une avec des tables mémoire et l'autre avec l'instruction Find:

Recherche de chaque code de la feuil 2 dans la feuille 1, récupération da la valeur correspondante et mise à jour en feuil 2 colonne B ou C selon la procédure (avec enregistrement des heures début et fin)

Sur 1000 références, les 2 procédures s'exécutent en 1 seconde environ mais sur 20000 enregistrements, l'utilisation de tables est nettement plus rapide qu'avec .find.

Par ailleurs on peut bien sûr optimiser les temps de réponse en triant les tables et en créant des index intermédiaires.

Qu'en penses-tu et cela ressemble-t-il à ton problème?

@+

Gael
Fichiers attachés
Type de fichier : zip Rech_Find_V1.zip (42,2 Ko, 8 affichages)
Gael est déconnecté   Réponse avec citation
Vieux 07/08/2007, 10h41   #12 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Merci gael pour cet exemple de test complet. J'ai essayé avec un fichier de 14000 lignes de code.

tab 7s
find 8s

Mon find dans mon programme 12s

Vu qu'à chaque itération de ma première boucle je vais récupérer une dizaine de valeur et non une et surtout que ma première boucle je la fais du style

Code:
Do While Cellule.Offset(i) <> ""
, la différence est peut être là.

Je vais tester en mettant mon premier fichier dans un tableau et en bouclant sur des find...

En tout cas merci.

Laurent
viscere est déconnecté   Réponse avec citation
Vieux 07/08/2007, 11h28   #13 (permalink)
XLDnaute Nouveau
 
Date d'inscription: août 2007
Messages: 40
Par défaut Re : Problème temps exécution

Bon ben pour mon cas ca marche mieux avec Find je met 12 s contre 27 sec en travaillant avec 2 tableaux.

Merci à tous!
viscere est déconnecté   Réponse avec citation
ANNONCES
Réponse

Liens sociaux

Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui

Discussions similaires
Discussion Auteur Forum Réponses Dernier message
Probléme de double éxécution? Mouchty85 Forum Excel 2 12/11/2006 16h12
Problème de temps de traitement de saisie de l'information brocbroc Forum Excel 0 16/10/2006 15h29
Problème dans exécution de macro. Mouchty85 Forum Excel 2 08/09/2006 08h17
Probleme d\'execution d\'une macro alami65 Forum Excel 1 16/12/2005 16h28
problème de plage exécution macro d'export access vers excel sony Forum Excel Downloads - Archives 1 11/02/2004 21h51


Fuseau horaire GMT +2. Il est actuellement 19h45.


(C) 2006 Excel Downloads