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 dans un gros fichier excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut Recherche rapide dans un gros fichier excel
    Bounjour,
    j'ai un "gros" fichier excel (40000 lignes) et je dois faire une recherche dedans, je trouve que ça prends beaucoup de temps (35s par recherche)avec ce 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
    '--------------------------------------------------------------------------
     If CODINSE <> "" Then
        Count = 2
        Do
    If CODINSE = Workbooks("Application_usage.xls").Sheets("Liste_code_Insee").Range("B" & Count).Value Then
    val1 = Workbooks("Application_usage.xls").Sheets("Liste_code_Insee").Range("C" & Count).Value
     
    val2 = Workbooks("Application_usage.xls").Sheets("Liste_code_Insee").Range("D" & Count).Value
     
    val3 = Workbooks("Application_usage.xls").Sheets("Liste_code_Insee").Range("E" & Count).Value
        Exit Do
     
            Else: Count = Count + 1
        End If
        Loop Until (Count > Workbooks("Application_usage.xls").Sheets("Liste_code_Insee").Range("B1").End(xlDown).Row)
    -------------------------------------------------------------------------
    Je voudrais savoir s'il y a une fonction pour optimiser la vitesse de recherche dans une feuille excel.

    Merci d'avance.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim Plage1 as variant
    Dim Plage2 As Range
    Dim c As Range
    Plage1 = Range("A2:A5").Value
    Set Plage2 = Range("A10:A74")
        With Plage2
            Set c = .Find(Plage1)
            If Not c Is Nothing Then
                MsgBox c.Address
            End If
    End With
    End Sub
    Je crée une instance de la plage où chercher et j'utilise value pour trouver Plage1 dans Plage2
    Tu dis si tu as un pb pour adapter
    A+

    PS - Dans cet exemple, je cherche dans la même feuille... tu adaptes
    Edit
    c.address donne l'adresse de la première cellule de la plage trouvée.
    Si tu veux avoir la plage, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            nbLigne = Range("A2:A5").Rows.Count 'après Plage1 = ....
            'et dans le with
            If Not c Is Nothing Then
                MsgBox c.Address & ":" & c.Offset(NbLignes, 0).Address
            End If

  3. #3
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour ouskel’nor


    Chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plage1 = Range("A2:A5").Value
    Ne prend que la valeur en A2

    Si ma valeur recherchée est en A10 et A14 l’adresse est celle de la cellule A14

    Est un problème de version ?
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Testé, ok.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim Plage1 As Variant, NbLig As Integer
    Dim Plage2 As Range
    Dim c As Range
        Plage1 = Range("A2:B5").Value
        NbLig = Range("A2:B5").Rows.Count
        Set Plage2 = Range("A10:B74")
        With Plage2
            Set c = .Find(Plage1)
            If Not c Is Nothing Then
                MsgBox c.Address & ":" & c.Offset(NbLig, 1).Address
            End If
        End With
    End Sub

  5. #5
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Je ne comprend pas ce qu'on cherche à trouver.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim Plage1 As Variant, NbLig As Integer
    Dim Plage2 As Range
    Dim c As Range
        Plage1 = Range("A2:B5").Value
        NbLig = Range("A2:B5").Rows.Count ' ????
        Set Plage2 = Range("A10:B74")
        With Plage2
            Set c = .Find(Plage1)
            If Not c Is Nothing Then
                MsgBox c.Address & ":" & c.Offset(NbLig, 1).Address ' Pourquoi NbLig        End If
        End With
    End Sub

    Si non j'ai toujours le même problème
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Testé, ok.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim Plage1 As Variant, NbLig As Integer
    Dim Plage2 As Range
    Dim c As Range
        Plage1 = Range("A2:B5").Value
        NbLig = Range("A2:B5").Rows.Count
        Set Plage2 = Range("A10:B74")
        With Plage2
            Set c = .Find(Plage1)
            If Not c Is Nothing Then
                MsgBox c.Address & ":" & c.Offset(NbLig, 1).Address
            End If
        End With
    End Sub
    Désolé je suis débutant en VBA et je n'ai pas compris cette solution, je ne sais pas comment je pourrais l'adapter à mon code ci-dessus.
    Ce que je veux c'est qu j'ai une valeur (CODINSE) déjà renseigner, et je voudrais la chercher dans une plage "B2:B40000" une fois trouvée je veux prendre les valeurs des lignes qui lui correspond. C-à-d
    par exemple: si la valeur CODINSE est trouver en B5 alors :
    val1=valeur de C5
    val2=valeur de D5
    val3=valeur de E5

    et encore MERCI pour toutes vos aides.


  7. #7
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour,

    La Valeur CODINSE est unique ds "B2:B40000"?
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  8. #8
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    A adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Plage2 As Range
    Dim c As Range
    Dim c1 As Range
    Set Plage2 = Range("B2:B40000")
     
        For Each c In Plage2
             If c.Value = CODINSE Then
             Set c1 = c
                Val1 = c1.Offset(0, 1)
                Val2 = c1.Offset(0, 2)
                Val3 = c1.Offset(0, 3)
            End If
        Next
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Jean-Pierre49 Voir le message
    Bonjour,

    La Valeur CODINSE est unique ds "B2:B40000"?
    Oui elle est unique.

  10. #10
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Alors ça devrait fonctionner
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Et une adaptation simplifiée du code de Ouskelnor ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
     
    Dim c As Range
     
    Set c = Sheets(1).Range("B:B").Find(what:=CODINSE, lookat:=xlWhole)
    If Not c Is Nothing Then
                Val1 = c.Offset(0, 1)
                Val2 = c.Offset(0, 2)
                Val3 = c.Offset(0, 3)
     
    End If
     
    End Sub
    Pas testé...

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Jean-Pierre49 Voir le message
    Alors ça devrait fonctionner
    Hélas les " c1.Offset(0, 1), c1.Offset(0, 2), c1.Offset(0, 3)" ne retourne aucune valeur!!

  13. #13
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour neupont

    Testé : ça marche aussi
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    En effet, il y a plus simple pour chercher une valeur dans une plage.
    Ton code laissait penser que tu cherchais la correspondance d'une PLAGE de cellules dans une autre, non d'une valeur.
    Et pour ça, tu avais un exemple dans l'aide en ligne à Find... (repris et adapté par Jean-Pierre et Neupont)
    Mais encore fallait-il connaître "Find"
    Bonne journée

  15. #15
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Redonne le code complet

    Chez moi ça renvoi bien des valeurs aussi que le ciode de neupont
    Jean-Pierre Pensez à Voter pour les réponses qui vous ont aidés, d'avance merci
    ---------Et n'oubliez pas de mettre : ..quand c'est le cas !---------

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    ça marche!!!
    Merci à TOUS

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par Jean-Pierre49 Voir le message
    Chez moi ça renvoi bien des valeurs aussi que le code de neupont
    Malheureusement ça se vend moins bien que le Da Vinci code...

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

Discussions similaires

  1. [XL-2007] Erreur 1004, recherche d'une cellule dans un autre fichier excel
    Par bodd984 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/08/2010, 18h12
  2. [XL-2003] Recherche un mot dans un autre fichier excel avec vba
    Par alaoui_nizar dans le forum Excel
    Réponses: 5
    Dernier message: 19/04/2010, 17h37
  3. import gros fichier excel (>17000 lignes)
    Par samuelsiffert dans le forum Access
    Réponses: 12
    Dernier message: 05/07/2006, 08h48
  4. Réponses: 7
    Dernier message: 15/02/2006, 11h52
  5. Recherche rapide dans un TDBGrid
    Par Dinytro dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/03/2005, 00h29

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