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 :

Tuer une macro trop longue à s'exécuter


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Tuer une macro trop longue à s'exécuter
    Bonjour,

    je développe actuellement une petite base access qui fait tourner tous les jours une série de macros indépendantes les unes des autres. Certaines de ces macros font appel à des bases ODBC, et il arrive que les bases étant surchargées en trafic, les macros prennent beaucoup de temps à s'exécuter.

    Les macros s'exécutent à la suite, ce qui fait que si une macro en particulier prend beaucoup de temps, les autres ne s'exécutent pas à l'heure voulue.

    Je voudrais savoir s'il est possible de tuer "en direct" l'exécution d'une macro qui prend trop de temps (par rapport à un laps de temps que j'aurai défini), afin de passer à la suivante.

    Je gère déjà les erreurs d'une macro avec des lignes du type "on error", mais une exécution trop longue ne resort pas comme une erreur...

    Merci d'avance pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 653
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 653
    Points : 34 368
    Points
    34 368
    Par défaut
    salut,
    tu peux éventuellement combiner la fonction DoEvents et les Timer à ta disposition.
    Reste à définir à quelle durée on souhaite sortir de la macro en cours...

    Est-ce une piste que tu trouves acceptable ?

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut,

    oui, j'imagine que c'est quelque chose dans ce genre qu'il faut utiliser, mais je suis novice en ce qui concerne les events et les timer. En fait, je ne vois pas trop comment on peut mettre une instruction qui ne s'exécute pas à la fin mais "pendant" une macro :

    si je mets :

    do
    macro(i)
    if macro(i) trop longue, stop,

    ça n'exécute la dernière ligne que quand la macro est finie ???

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 394
    Points : 19 816
    Points
    19 816
    Billets dans le blog
    66
    Par défaut
    Salut,

    Peux-tu nous donner le détail des commandes de tes macros ?

    Peux tu traduire ces macros en code VBA et ainsi intégrer les Timer et DoEvents pour éventuellement sortir du code si le temps dépasse un certain seuil?

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut,

    alors voici comment marchent mes bases.

    Une base principale "Calcul" stock dans une table les chemins d'accès aux autres bases ainsi que les macros à lancer dans chacune de ces bases.

    Ensuite, je parcours enregistrement par enregistrement cette table grâce à une petite boucle, et pour chaque enregistrement j'ouvre la base correspondante et exécute la macro grâce à cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Function Executer(CheminBase As String, NomMacro As String)
     Executer = 2
     On Error GoTo erreur
     Dim MonAccess As New Access.Application
     MonAccess.OpenCurrentDatabase CheminBase
     MonAccess.DoCmd.RunMacro NomMacro
     Executer = 1
     GoTo fin
    erreur:
     Executer = 0
    fin:
     MonAccess.Quit acQuitSavePrompt
     Set MonAccess = Nothing
    End Function
    Le retour de la valeur "Executer" me permet juste de contrôler s'il y a une erreur, mais il n'y a pas d'erreur lorsque par exemple la macro à laquelle je fais appel attend un mot de passe (c'est juste en attente indéfiniment).

    Pour la boucle, voilà à quoi ça ressemble :

    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
    rsBases.MoveFirst
     
        For i = 1 To N
            Check = 3
            ddebut = Now
            Check = Executer(rsBases.Fields("CheminBase"), rsBases.Fields("NomMacro"))
            dfin = Now
            With rsLog
                .AddNew
                !Tache = rsBases.Fields("NomTache")
                !DateDebut = ddebut
                !DateFin = dfin
                !Check = Check
                If Check = 1 Then
                    !OK = 1
                    Else
                    !OK = 0
                End If
                .Update
            End With
            rsBases.MoveNext
        Next i
    rsBases est la fameuse table qui contient la liste de mes bases et macros à exécuter.
    Les valeurs dfin et ddebut sont juste des heures de début et de fin d'exécution pour mettre dans le log rsLog.
    Check permet de signaler les erreurs.

    J'aimerais garder cette structure de table répertoriant mes macros à exécuter, car elle est beaucoup plus souple pour moi (je peux ajouter / supprimer très facilement).

    Auparavant, j'avais une tâche planifiée windows par macro, ce qui ne permettait pas d'optimiser le temps d'exécution (j'étais obligé de laisser des intervalles entre chaque tâche). En plus à chaque fois que les mots de passes devaient changer, je devais les retaper dans chacune des tâches.
    Maintenant, plus qu'un mot de passe à changer, et j'ai gagné 70 % de temps d'exécution par rapport à avant.

  6. #6
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,

    C'est plus simple dans une boucle
    au debut de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    temps = Timer      'en ms
    duree = 600 000   'pour 10 mn
    et quelque part dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If temps + duree < Timer Then Exit For
    on sort de la boucle quand les 10mn sont passées

Discussions similaires

  1. [MySQL] Exécution d'une requête trop longue
    Par Smip99 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/06/2008, 09h52
  2. [AJAX] Avec IE, une string trop longue ne passe pas
    Par cels dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/10/2007, 16h24
  3. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 14h02
  4. Couper une chaine trop longue ?
    Par ThitoO dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/03/2007, 09h40
  5. Réponses: 3
    Dernier message: 10/03/2007, 17h59

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