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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    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 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 683
    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 ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    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 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 624
    Billets dans le blog
    67
    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?
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    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 Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    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, 10h52
  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, 17h24
  3. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 15h02
  4. Couper une chaine trop longue ?
    Par ThitoO dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/03/2007, 10h40
  5. Réponses: 3
    Dernier message: 10/03/2007, 18h59

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