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

VBA Access Discussion :

Optimisation de VBA pour la recherche de valeurs dans une table [AC-2000]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut Optimisation de VBA pour la recherche de valeurs dans une table
    Bonjour à tous,

    Voila j'ai mon code VBA qui m'importe des données Excel vers ma BDD Access.
    J'ai différents tests de ce code qui se base sur une boucle.

    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
    Set rs = db.OpenRecordset("Equipment", dbOpenDynaset)
        With rs
            If .RecordCount <> 0 Then
                .MoveFirst
                trouve = False
                TrouveStatut = False
                Do While Not .EOF And Not trouve
    'If the fields IDEQUIPMENT = Cells(ID) in Excel File
                    If .Fields("IDEQUIPMENT") = Cells(i, ID) Then
                        trouve = True
                        IdEqOld = .Fields("IDEQUIPMENT")
    'Use this conditions to see if the equipment statut is achieved or not
                        If .Fields("Statut") = "X" Then
                            TrouveStatut = True
                        Else
                            TrouveStatut = False
                        End If
                    End If
                    .MoveNext
                Loop
            End If
        End With
    Cependant j'aimerai savoir si il y a une autre solution pour parcourir et récupéré ces valeurs.
    En effet, avec la taille des fichiers Excel et le nombre d'enregistrements de la table "Equipment", il me faut presque 30min d'éxécution.

    Merci d'avance
    Qui ne tente rien, ne tente rien !

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Hello! As-tu entendu parler de "recherche dichotomique"?
    Voici un lien qui en parle: http://www.developpez.com/recherche/...eloppez.com%2F

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Oui justement j'étais en train de me poser la question quand j'ai posté ici.
    Merci pour les liens, je reposterai demain dans la matinée pour dire ce que j'ai fait !

    Merci
    Qui ne tente rien, ne tente rien !

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

    Pourquoi ne pas passer par une requête au lieu de parcourir la table Equipement

    Le critère (Clause Where de la requête) sera la valeur de la cellule (Cells(i, ID)) ainsi que les données du champ Statut.

    Ce serait beaucoup plus rapide (à moins que je n'ai pas compris ce que tu souhaites).

    Philippe

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Citation Envoyé par Philippe JOCHMANS Voir le message
    Bonjour

    Pourquoi ne pas passer par une requête au lieu de parcourir la table Equipement

    Le critère (Clause Where de la requête) sera la valeur de la cellule (Cells(i, ID)) ainsi que les données du champ Statut.

    Ce serait beaucoup plus rapide (à moins que je n'ai pas compris ce que tu souhaites).

    Philippe
    Si tu as bien compris, c'est vrai que je ne sais pas pourquoi je n'ai pas utilisé de requete SQL pour recherché une valeur. Je test cela et je repost un message.
    Qui ne tente rien, ne tente rien !

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2010
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2010
    Messages : 149
    Points : 171
    Points
    171
    Par défaut
    Bon j'ai testé mon code avec la recherche dichotomique du lien envoyé par Koluche (et adapté à ma situation), et l'utilisation de requete SQL proposé par Phillipe.

    Cette derniere est un peu plus rapide dans mon cas.
    Voila ce que ça me donne :

    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
     
    Trouve = False
    TrouveStatut = False
    RechercheEq = ("Select Equipment.IDEQUIPMENT, Equipment.Statut From Equipment where Equipment.IDEQUIPMENT = '" & safeString(IdEq) & "'")
    Set RechercheE = CurrentDb.OpenRecordset(RechercheEq)
    If Not RechercheE.EOF Then
      RecEq = RechercheE.Fields("IDEQUIPMENT").Value
      RecStatut = RechercheE.Fields("Statut").Value
      If RecEq <> "" Then
        Trouve = True
      End If
      If RecStatut <> "" Then
        TrouveStatut = True
        IdEqOld = RecEq
      End If
    Else
      Trouve = False
      TrouveStatut = False
    End If
    Merci beaucoup pour vos réponses.
    Qui ne tente rien, ne tente rien !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/06/2011, 11h03
  2. [AC-2003] Recherche deux valeurs dans une table
    Par drakkar_agfa dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/09/2009, 16h03
  3. [Toutes versions] Amélioration : Recherche de valeur dans une table
    Par Victor1 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/08/2009, 15h21

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