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 optimisée dans un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut recherche optimisée dans un tableau
    Bonsoir,
    j'ai un tableau ( dans une feuille excel (feuil1)) ou il j'ai 38960 ligne ( code postaux) avec leur coordonnées.
    j'ai dans une deuxième feuille excel (feuil2) deux colonnes la première code postal départ la deuxième code postal arriver.
    je veux chercher les deux code postaux de la feuille 2 dans la feuille 1.

    j'ai essayé d'utliser des do while feuil2.colonne1 = feuille1.code puis par pour le deuxième.
    mais cette methode je trouve qui n'est pas optimisé car il faut parcourir le tableau meme si je trouve le code recherché au début de ligne ( il faut attendre qu'il parcour toutes les lignes 98960 pour avoir le resultat).
    y'a t'il un code plus optimisé pour trouver le resultat.

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonsoir,

    La méthode Find est plus appropriée pour ce genre d'acrobatie et le résultat sera quasi instantané.
    Jette un coup d'oeil dans l'aide de VBA, si tu n'arrives pas à l'utiliser fais nous signe

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    J'ai essayé ce code (avec l'utilisation de la methode FIND) mais le problème que je trouve est :

    j'ai deux critère de selection dep et arr, lorsque j'utilise le code il me donne dans le premier finc les deux ce qui fausse mes calculs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do While Feuil4.Cells(k, 1) <> "" And Feuil4.Cells(k, 2) <> ""
     
    dep = feuil4.cells(k,1) (depart)
    arrv=feuil4.cells(k,2) (arrv)
    la finalité du programme est de recupèrer les
    latdep = Feuil3.Cells(cdep, 5)
    londep = Feuil3.Cells(cdep, 6)
    latarrv = Feuil3.Cells(carr, 5)
    lonarrv = Feuil3.Cells(carr, 6)
    pour réaliser des calculs suivant

    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
    '-------------------------------------------------------------------------------------------
    
    'recherche la deuxième valeur, puis stocker les resultat dans latdep et londep
            For cdep = 2 To Feuil3.Cells(Rows.Count, 1).End(xlUp).Row
     
                If Feuil3.Cells(cdep, 1) <> "" Then
                    With Feuil4.Cells(k, 1)
                    Set dep = .Find(Feuil3.Cells(cdep, 2), LookIn:=xlValues, lookat:=xlWhole)
            
                        If Not dep Is Nothing Then
                            latdep = Feuil3.Cells(cdep, 5)
                            londep = Feuil3.Cells(cdep, 6)
                        End If
                    End With
                End If
            Next
            
            '---------------------------------------------------------------------------------------
    'recherche la première valeur, puis stocker les resultat dans latarrv et lonarrv
            For carr = 2 To Feuil3.Cells(Rows.Count, 1).End(xlUp).Row
                    If Feuil3.Cells(carr, 2) <> "" Then
                       With Feuil4.Cells(k, 2)
                        Set arrv = .Find(Feuil3.Cells(carr, 2), LookIn:=xlValues, lookat:=xlWhole)
           
                            If Not arrv Is Nothing Then
                                latarrv = Feuil3.Cells(carr, 5)
                                lonarrv = Feuil3.Cells(carr, 6)
                            End If
                        End With
                    End If
            Next
    
    k = k + 1
    Loop

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    oula...un chat n'y retrouverait pas ses jeunes

    Si j'ai bien compris, teste ceci stp
    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
    Sub test()
    Dim dep As Variant, arr As Variant
    Dim i As Integer, C1 As Range
     
    For i = 1 To Feuil4.Cells(Rows.Count, 1).End(xlUp).Row
        dep = Feuil4.Cells(i, 1)
        arr = Feuil4.Cells(i, 2)
     
        Set C1 = Feuil3.Range("B:B").Find(what:=dep, lookat:=xlWhole) '<-- recherche dans la colonne B (à vérifier)
        If Not C1 Is Nothing Then
            Feuil4.Cells(i, 3) = Feuil3.Cells(C1.Row, 5) '<-- latdep
            Feuil4.Cells(i, 4) = Feuil3.Cells(C1.Row, 6) '<-- londep
        Else
            MsgBox "le code postal " & dep & " n'a pas été trouvé !"
        End If
     
        Set C1 = Nothing
     
        Set C1 = Feuil3.Range("B:B").Find(what:=arr, lookat:=xlWhole) '<-- recherche dans la colonne B (à vérifier)
        If Not C1 Is Nothing Then
            Feuil4.Cells(i, 5) = Feuil3.Cells(C1.Row, 5) '<-- latarr
            Feuil4.Cells(i, 6) = Feuil3.Cells(C1.Row, 6) '<-- lonarr
        Else
            MsgBox "le code postal " & arr & " n'a pas été trouvé !"
        End If
     
        Set C1 = Nothing
    Next
     
    End Sub

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup Mister fring,

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/07/2008, 13h27
  2. Réponses: 6
    Dernier message: 28/06/2007, 11h17
  3. Recherche aléatoire dans un tableau
    Par Ykroxor dans le forum Excel
    Réponses: 1
    Dernier message: 11/04/2007, 09h58
  4. Réponses: 23
    Dernier message: 10/01/2006, 13h33
  5. Réponses: 6
    Dernier message: 05/01/2006, 14h23

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