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

Vue hybride

elwinner08 Insertion d'une pause non... 28/03/2018, 15h36
mfoxy re 28/03/2018, 21h22
kiki29 Salut, à voir... 28/03/2018, 21h47
elwinner08 Merci pour vos réponses ! ... 28/03/2018, 22h06
unparia Bonjour Je n'ai pas ouvert... 29/03/2018, 08h25
Message précédent Message précédent   Message suivant Message suivant
  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

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