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 :

Optimiser rapidité code


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut Optimiser rapidité code
    Bonjour,

    J'ai un planning et quand je navigue entre les semaines, chaque case se met à jour.

    Depuis que j'ai fait une fonction la navigation entre les semaines est lente.

    J'ai une première fonction qui est la suivante :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Private Sub Remplir_Planning(ByVal Datest As String, ByVal Idc As Integer, ByVal Chrono As String, ByVal Intitule As String, ByVal Rang As String, ByVal Datec As String)
     
    Dim db As Database
    Set db = CurrentDb
     
    Dim rqChrono As Recordset
    Dim Chro As Long
     
    Dim Datev As Date
    Dim Id As Integer
     
    Dim maDate As String
     
    Dim rqVisites As Recordset
    Dim Inti As String
    Dim Rg As String
    Dim Date_Contact As Date
     
    'récupère la date du planning
    maDate = Me.Controls(Datest).Value
    Datev = Left(maDate, 2) & Right(scrCDate, 8)
     
    'requête pour récupérer le chrono
    Set rqChrono = db.OpenRecordset("SELECT Chrono From CRP WHERE Date = #" & Datev & "# And ID_Employe = " & Idc)
     
    If rqChrono.EOF = False Then
        Chro = rqChrono(0)
    Else
        Chro = 0
    End If
     
    If (Chro <> 0) Then
        Set rqVisites = db.OpenRecordset("SELECT Intitule, Rang,Date_Prise_Contact FROM Visites WHERE Chrono = " & Chro)
        If rqVisites.EOF = False Then
            Inti = rqVisites(0)
            Rg = rqVisites(1)
            Date_Contact = rqVisites(2)
        Else
            Inti = ""
            Rg = ""
            Date_Contact = Null
        End If
        'insertion du chrono sur le planning
        Me.Controls(Chrono).Value = Chro
        Me.Controls(Intitule).Value = Inti
        Me.Controls(Rang).Value = Rg
        Me.Controls(Datec).Value = Date_Contact
    Else
        Me.Controls(Chrono).Value = Null
        Me.Controls(Intitule).Value = ""
        Me.Controls(Rang).Value = ""
        Me.Controls(Datec).Value = Null
    End If
     
    End Sub
    Elle me permet de mettre à jour chaque cellule de mon planning.

    J'ai la seconde fonction suivante qui utilise une boucle pour appeler autant de fois que nécessaire la fonction précedente.

    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
     
    Private Sub Boucle_Remplir_Planning()
     
    Dim CRP() As Variant
    Dim Compteur As Integer
    Dim nb_Ele As Integer
    Dim num_Colonne As Integer
    Dim Compteur3 As Integer
    Dim palier As Integer
     
    CRP = Array(36, 37, 39, 40, 41, 47) 'ID_employe de touys les CRP présents dans la table employe
    nb_Ele = UBound(CRP) + 1 'nombre d'élèment du tableau CRP
    Compteur = 0
    palier = 1
    Compteur3 = 1 'numéro de chaque case du planning  pour chaque crp
     
     
    'Permet de parcourir tous les élèments du tableau
    While Compteur < nb_Ele
        num_Colonne = 1
        palier = palier + 7
        While Compteur3 < palier
        Call Remplir_Planning("C" & Format(num_Colonne, "00"), CRP(Compteur), "Chrono" & Compteur3, "Intitule" & Compteur3, "Rang" & Compteur3, "Date" & Compteur3)
        num_Colonne = num_Colonne + 1 'de 1 à 7 à chaque boucle
        Compteur3 = Compteur3 + 1
        Wend
        Compteur = Compteur + 1
    Wend
    End Sub
    Si quelqu'un pourrait m'aider à rendre ce code plus rapide je l'en remercie beaucoup.

    Sinon ne serait-il pas mieux d'appeler la fonction autant de fois que nécessaire au lieu d'utiliser une boucle??

    merci beaucoup à ceux qui se pencheront sur mon problème.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 298
    Points : 67
    Points
    67
    Par défaut
    même un cours sur l'optimisation serait le bienvenue...

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Ah l'optimisation tout un sujet.

    Un excélent livre sur le sujet est Code Complete de Microsoft Press. Ce livre couvre tout les sujets de la programmation pas seulement l'optimisation. Il est de plus trans-langage, ce qu'il dit s'applique à n'importe quel langage de programmation du type VBA.

    Pour ce qui est de ton problème particluier.

    Tu pourrais sans doute remplacer tes Select en dur dans le code par des requêtes paramétrées. Le pb avec le SQL dans le code c'est que le moteur de la BD doit recalculer à chaque fois le plan d'éxécution ce qui est une oppération assez couteuse. Avec une requête paramétré le plan est enregistré une fois et réutiliser à chaque utilisation.

    Tu peux aussi vérifier tes indexs. Si tu as des jointures, il est conseillé d'ajouter des index sur les champs utilsés par la jointure.

    Dans ce but tu peux aussi lancer l'assistant d'analyse de la structure de ta BD (menu outil/anlyse/performance). Les sugestions qu'il fait sont généralement intéressantes.

    Si tes tables sont locales, c-à-d qu'elles sont dans la même base que tes formulaires, tu peux utuliser la méthode Seek des objet DAO.Recordset (ouvert en mode OpenTable) qui est généralement nettement plus rapide que les recherches SQL.

    Enfin ce qui est souvant le plus efficasse c'est de revoir complétement ton algorythme de parcour de données.

    Peux tu par exemple préremplir toutes tes données ? Ce qui ferais que tu ne lirai ta ou tes tables qu'une seule fois. Dans cette ligne de pensée, regarde à l'utilisation d'une table intermédiare temporaire locale. C'est une solution que j'ai utilisé dans une de mes applis et je suis passé de 24h de calcul à 5mn.

    A+

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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