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 :

Insertion d'une pause non bloquante dans une macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut Insertion d'une pause non bloquante dans une macro
    Bonjour à tous !
    J'ai un projet où je vais devoir gérer des mouvements de matériel. Sur chacun, se trouve un QR code que je pourrais flasher. Les buts de ma macro :
    1. Avoir une feuille (appelée AMouvements) enregistrant tous les mouvements de matériel (à terme je rajouterai un petit morceau de code concernant la personne, le lieu et si c'est une entrée ou une sortie)
    2. Avoir une feuille par matériel (appelée du n° chronologique du matériel) récapitulant les mouvements de ce matériel précis.

    Je trouve que j'ai plutôt bien réussi MAIS il y a une fonctionnalité importante que je ne parviens pas à ajouter. Une personne prendra en charge entre 1 et 30 matériels en même temps. Je souhaite que ma macro se lance à chaque scan de QR code puis à la fin attende 2 minutes. Si dans ce délai de 2 minutes il n'y a eu aucune modification, la macro enregistre et s'arrête (le but étant par la suite de déconnecter la personne qui flashe) ; s'il y a une modification, la macro se relance depuis le début et de nouveau à la fin patiente 2 minutes et ainsi de suite.
    Toutes les solutions que j'ai testé (OnTime, Wait, While), bloque la macro empêchant toute modification donc forcément on arrive au bout du temps définit et la macro s'arrête. J'ai cherché et essayé pendant une bonne partie de la journée sans succès.

    Dans le code que vous trouverez, j'ai essayé de commenter pour que ce soit clair et vous trouverez 2 fonctions que j'ai récupéré telles que sur internet. Vous verrez aussi que mon code est clairement à l'état de projet.

    Si en plus de ça vous avez des idées pour optimiser tout ça je suis preneur (je veux juste comprendre comment ça marche pour le reproduire).

    Merci beaucoup pour votre aide en tout cas.

    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut re
    Hello,

    Tout d abord suis entrain d apprendre le vba donc mon aide ne te sera peut-être pas d une grande utilité mais pour mon faible niveau je pense la méthode la plus efficace.

    Selon moi le ontime est bien la fonction a utiliser

    Mais je ne l utiliserais pas dans ton code de traitement mais sur la feuille qui est modifiée par ton code via sa méthode change


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.OnTime Now + TimeValue
    ("00:05:00"), "FermerFichier" 'Se ferme après 5 min sans modifier de la page
    End Sub
     
    Sub FermerFichier()
    ActiveWorkbook.Close
    End Sub

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à voir http://<font color="#0000FF">https:/...d-excel</font> ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  4. #4
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut
    Merci pour vos réponses !

    Citation Envoyé par mfoxy Voir le message
    Hello,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.OnTime Now + TimeValue
    ("00:05:00"), "FermerFichier" 'Se ferme après 5 min sans modifier de la page
    End Sub
     
    Sub FermerFichier()
    ActiveWorkbook.Close
    End Sub
    Le problème avec ce code c'est que je laisse à l'utilisateur 5 minutes pour enregistrer tous ses mouvements. Ca peut être trop long ou trop court (selon le nombre de mouvements et selon l'utilisateur). De plus les utilisateurs doivent pouvoir se succéder les uns les autres sans forcément attendre. D'où ma recherche pour un code qui attend sans empêcher l'ajout de nouveaux mouvements.

    Citation Envoyé par kiki29 Voir le message
    Salut, à voir http://<font color="#0000FF">https:/...d-excel</font> ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    La fonction Wait empêche la modification (de ce que j'ai lu et essayé en tout cas). Quant à ta ligne de code je ne vois pas quoi faire avec.

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je n'ai pas ouvert ton classeur (je n'ouvre jamais un classeur tiers)
    Je vais me contenter de te proposer la stratégie qui me vient à l'esprit -->>
    - Une feuille "gardien"
    - A chaque évènement change de chacune de tes feuilles "matériel" -->>
    --- on regarde si l'adresse (nom_feuille & adresse cellule) de la cellule concernée figure déjà en colonne A de la feuille "gardien" et --->>
    ----- si n'y figure pas : on rajoute en dernière ligne remplie + 1 de la feuille "gardien" : en colonne A l'adresse complète de la cellule et en colonne B l'heure (Now) de la modif
    ----- si y figure déjà :
    ------------------ on modifie la valeur en colonne B (heure de la modif précédente)

    - A chaque évènement selectionchange de chacune de tes feuilles "matériel"
    -- on supprime de la feuille "gardien" toutes les lignes qui, en colonne B contiennent une valeur <= Now - 2 minutes

    Voilà là une idée de mécanisme. Elle est à compléter par ce à quoi fait allusion :
    la macro enregistre et s'arrête
    dont je ne perçois pas très clairement ce à quoi cela correspond

  6. #6
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut
    Bonjour,
    Je mettrai ci dessous le code pour pouvoir le consulter mais ça fera un message un peu long.
    Par "enregistre et s’arrête je veux que la macro exécute ThisWorkbook.Save et End Sub ce qui par la suite correspondra à une déconnexion du compte de l'utilisateur. Ta stratégie est effectivement intéressante et ressemblante à celle que j'ai mise en place. La suppression des lignes de la feuille "gardien" ne m'interesse pas car je veux conserver cet historique sur cette feuille mais je peux tester sur la dernière ligne remplie. Mon problème se situe dans la manière de faire attendre l'application de façon à permettre l'ajout d'un matériel et que si dans la temps imparti (2 min) il n'y a pas eu de modification alors la macro s'arrête mais s'il y a eu modification le temps imparti reprend à 2 minutes.

    Ci dessous pour ceux qui souhaiteraient, le code (désolé pour le pavé)

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    Function Extraction(ChaineSource As String, Optional LimiteAvant As String = "", Optional LimiteApres As String = "")
    'par: Excel-Malin.com ( http://excel-malin.com )
     
    On Error GoTo FunctionErreur
    If InStr(1, ChaineSource, LimiteAvant) = 0 Then
        Extraction = CVErr(xlErrNA)
        Exit Function
    Else
        ExtraitPositionDebut = InStr(1, ChaineSource, LimiteAvant) + Len(LimiteAvant)
    End If
     
    If LimiteApres = "" Then
        ExtraitPositionFin = Len(ChaineSource)
    Else
        ExtraitPositionFin = InStr(1, ChaineSource, LimiteApres) - 1
    End If
    Extraction = Mid(ChaineSource, ExtraitPositionDebut, ExtraitPositionFin - ExtraitPositionDebut + 1)
    Exit Function
     
    FunctionErreur:
        Extraction = CVErr(xlErrNA)
        'Extraction = ""
    End Function
     
    Public Function Triage()
    'par: http://excel-malin.com
     
    On Error GoTo FonctionErreur
    Dim j As Integer
    Dim i As Integer
    Dim PremiereFeuille As Integer
    Dim DerniereFeuille As Integer
     
        PremiereFeuille = 1
        DerniereFeuille = ActiveWorkbook.Worksheets.Count
     
        For i = PremiereFeuille To DerniereFeuille
            For j = i To DerniereFeuille
                If OrdreDescendant = True Then
                    If UCase(Worksheets(j).Name) > UCase(Worksheets(i).Name) Then
                        Worksheets(j).Move Before:=Worksheets(i)
                    End If
                Else
                    If UCase(Worksheets(j).Name) < UCase(Worksheets(i).Name) Then
                        Worksheets(j).Move Before:=Worksheets(i)
                    End If
                End If
            Next j
        Next i
     
    Exit Function
    FonctionErreur:
     
    End Function
     
    Sub Numerotation()
     
    ''Désactive les evénements de la feuille
    ''Sinon à chaque mise à jour de cellule la macro se lance
     
    Dim heure As Date
    Dim flash As String
    Dim chrono As String
    Dim serie As String
    Dim existant As Boolean
    Dim n As Integer
    Dim lieu As String
    Dim qui As String
     
    Application.EnableEvents = False
     
    flash = "Entreprise    Serial Number: GCJVKPA    AssetNumber: ESTS0144"
    Exist = False
     
    ''Extraction est une fonction copiée d'internet
    chrono = Extraction(flash, "AssetNumber: ", "")
    serie = Extraction(flash, "Serial Number: ", "Asset")
    serie = Replace(serie, " ", "")
    Sheets("AMouvements").Cells(1, 1) = chrono
    Sheets("AMouvements").Cells(1, 2) = serie
     
    ''Collage de l'heure et insertion de ligne
    Sheets("AMouvements").Cells(1, 3) = Now
    Sheets("AMouvements").Range("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
     
    ''Test si une page pour cette tablette existe
    For n = 1 To Sheets.Count
        If Application.Sheets(n).Name = chrono Then existant = True: Exit For
    Next n
     
    ''Création de la page si elle n'existe pas, Triage est une fonction récupérée d'internet
    If existant = False Then
        Sheets.Add: ActiveSheet.Name = chrono: Triage
    End If
     
    Sheets(chrono).Select
     
    ''Remplissage de la page
    Cells(1, 1) = Now
    'Cells(1, 2) = lieu
    'Cells(1, 3) = qui
    Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").EntireColumn.AutoFit
    Columns("C:C").EntireColumn.AutoFit
    Range("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
     
    Sheets("AMouvements").Select
     
    ''Réactivition des evenements puis tempo de 2 minutes pour déconnexion et réinitalisation du lieu et du qui
    ''Réactivation des evenements avant pour pouvoir couper la tempo si flash avant la fin
    ''Pas d'utilisation de application.wait car ça bloque excel
    Application.EnableEvents = True
    heure = Now + TimeValue("00:00:10")
     
    '' C'EST ICI QUE JE SOUHAITERAIS METTRE LA TEMPORISATION
     
    End Sub
     
    Sub Attente_et_fermeture()
    MsgBox ("fin")
    'qui = ""
    'lieu = ""
    'Application.ThisWorkbook.Save
     
    End Sub
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    Call Numerotation
     
    End Sub

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    La suppression des lignes de la feuille "gardien" ne m'interesse pas car je veux conserver cet historique
    C'est la première fois que tu nous parles de ta volonté de conserver un "historique".
    Et dans quoi le conservais-tu alors auparavant ?
    La feuille "gardien" (ajoutée, donc) n'a aucun autre rôle que celui de jouer au "chef d'orchestre". Aucun autre.
    Je maintiens l'idée du mécanisme que je t'ai proposé.
    Quant à la sauvegarde et ton End Sub --->> il suffit de mettre tes instructions
    1) à cette étape :
    -- on supprime de la feuille "gardien" toutes les lignes qui, en colonne B contiennent une valeur <= Now - 2 minutes
    et
    2) en sortant de l'application.
    Bien. Je te laisse maintenant.

  8. #8
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut
    Je souhaitais conserver l'historique dans la feuille AMouvements. Je n'avais pas compris le rôle de la feuille "gardien". En fait je ne comprends pas en quoi l'enregistrement de now -2 minutes résout mon problème d'attente.

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    cette manière d'utiliser le doevents soulage sans aucun doute le processeur.
    Le mécanisme que j'ai suggéré plus haut participe, lui, d'une autre "philosophie" dans laquelle aucune attente n'intervient.

  10. #10
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour Jacques,

    Je plussoies ton mécanisme.
    Je ne réponds qu'à la question de "elwinner08" qui souhaite, si j'ai bien compris :
    1. Lancement de sa procédure ==> ok pour lui
    2. Une attente d'un éventuel "mouvement" (saisie) sur son fichier (durée 2 minutes?) ==> c'est ce à quoi je réponds
    3. Si pas de "mouvement" sur son fichier en fin de durée d'attente ==> on ferme tout
    4. Si "mouvement" pendant la durée d'attente : retour au 1.

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    A Franck
    Je comprends ce que tu veux dire
    Ceci dit : je ne comprends pas l'idée(finalité) même de ce tremplin d' "attente" sur lequel insiste elwinner08
    Ma réponse (solution) eût été totalement différente si elwinner08 nous précisait que ce passage :
    le but étant par la suite de déconnecter la personne qui flashe
    signifiait que la seule chose qui comptait pour lui (le seul but, donc) était de déconnecter (après sauvegarde) l'utilisateur resté non actif pendant au moins deux minutes.
    (je n'ai pas mis en exergue par hasard les deux adjectifs mis en rouge)

  12. #12
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour,

    Voici un code qui m'avait été donné il y a quelque temps, toutes mes excuses auprès de l'auteur dont j'ai oublié le nom.Ferme un classeur inactif(2).doc - Ferme un classeur inactif.doc

    Ces codes permettent de fermer le classeur après un lapse de temps d'inactivité. Ce code est à modifier selon tes besoins.

    Cordialement

  13. #13
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut
    Bonjour à tous !
    Je suis désolé pour le délai de réponse.
    Je suis désolé d'avoir été trop vague, cela dit unparia a très bien explicité ma pensée. Je regarde vos solutions et vous tiens au courant

  14. #14
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 17
    Par défaut
    Bonjour !
    La solution avec DoEvents me plait beaucoup mais je ne comprends pas comment elle fonctionne. L'aide en ligne ne me dit pas ce que je veux donc je vous demande à vous.
    Dans le code suivant (qui vient de l'aide en ligne), à quoi sert et comment fonctionne DoEvents ? Je veux dire, je comprends que c'est pour rendre la main au système mais je ne comprends pas l'utilité spécifiquement dans ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Create a variable to hold number of Visual Basic forms loaded 
    ' and visible.
    Dim I, OpenForms
    For I = 1 To 150000    ' Start loop.
        If I Mod 1000 = 0 Then     ' If loop has repeated 1000 times.
            OpenForms = DoEvents    ' Yield to operating system.
        End If
    Next I    ' Increment loop counter.
    Merci beaucoup !

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  2. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  3. Réponses: 20
    Dernier message: 21/06/2006, 20h44
  4. Réponses: 4
    Dernier message: 14/02/2005, 19h41

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