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 :

Macro automatique toutes les minutes avec une donnée (qui varie) à C/L dans une nouvelle cellule


Sujet :

Macros et VBA Excel

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Enlève : Option Private Module
    j'ai fait le test et effectivement chez moi cela ne fonctionne plus avec ! j'ai pas d'explication mais juste une supposition qui est que cette option est incompatible avec OnTime

    Probablement que cette fonction tourne en dehors de l'application excel, même si on l'appel depuis l'application du coup Ontime etant hors appli et le module etant privatisé OnTime n'a plus acces à MaMacro...

    ...mais ce n'est que mon avis

    voir msdn Option Private

  2. #22
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Ah oui c'est étrange ...
    Tu peux C/L le code que tu as utilisé (module 1 + thisworkbook) s'il te plait ?

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    C'est le même que le tiens mais sans Option Private Module

    mais si cela peut te faire plaisir :


    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
     
    Option Explicit
     
    Private Const heure_déb As Date = #9:24:00 AM#
    Private Const heure_fin As Date = #7:00:00 PM#
     
    Sub MaMacro()
     
    If Time < heure_déb Then Application.OnTime Date + heure_déb, "MaMacro" ' si tu demarre ton fichier avant 9 heures du mat on programme le premier toutrs de garde a 09:00:00 du jours
     
    If Time >= heure_déb And Time <= heure_fin Then ' l'heure actuelle est plus grande que l'eure_deb et plus petite que l'heure fin on programe la prochaine minute
     
        With Sheets("Feuil1")
            Debug.Print Time
            .Range("E" & .Cells(Rows.Count, "E").End(xlUp).Row + 1).Value = .Cells(8, "F").Value
            'une cellule dédiée à l'arret ici "A1" pour l'exemple
            If LCase$(.Range("A1").Value) = "fin" Then 'on ecrit fin dans la cellule... le code s'arrete
                .Range("A1").Value = "" 'ici on efface le contenu avant de sortir pour ne pas oublier de l'enlever avant de relancer
                Debug.Print  "Fin"
                Exit Sub
            End If
        End With
     
         DoEvents 'nous assures d'avoir la main pour pouvoir ecrire "fin" dans la cellule dédiée à l'arret
        Debug.Print "Next..."
        Application.OnTime Now + TimeValue("00:00:10"), "MaMacro"
     
    End If
    End Sub

  4. #24
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Merci

    Je te demande ça car même sans le option private module rien ne se passe ...
    J'ai loupé un truc dans le code du workbook .... ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
      Call MaMacro
    End Sub

  5. #25
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Points : 224
    Points
    224
    Par défaut
    Sans vouloir t'offenser, je suis toujours étonné de voir que beaucoup n'utilisent pas toutes les possibilités de débugage d'un code :
    - instruction Stop puis contrôle des valeurs dans la fenêtre des variables locales
    - point d'arrêt
    - MsgBox("Je suis ici") et MsgBox("Je suis là") pour savoir si tu passes effectivement dans tes parties du code, voire si ta MaMacro est bien exécutée
    - le Debug.Print "Il est passé par ici" et Debug.Print "Il repassera par là" (dans la même logique)
    - etc.

    Autre élément intéressant quand on cascade les instructions : la pile des appels, pour vérifier que le serpent ne se mord pas la queue.

    Pour répondre à ta question, et pour l'avoir vécu quelque fois, attention aux OnTime qui "s'auto-relancent" car si tu interromps le code trop longtemps ou que tu le réinitialises, il se peut que celui-ci ne se relance justement pas.

    D'autant que ta MaMacro s'exécute à l'ouverture de ton classeur... dans le doute, sauvegarde, ferme et rouvre-le.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    tiens je te donne le début d'une autre solution sans ontime

    Mais fait gaffe le timer présenté ci dessous plante facilement excel si mal utilisé... je parle de la mise en place coté macro une fois bien en place plus de risque.

    dans un module
    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
    Option Explicit
     
    Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
     
    Const heure_déb As Date = #9:24:00 AM#
    Const heure_fin As Date = #7:00:00 PM#
     
    Dim TimerID As Long
    Public ArretDemande As Boolean
    Sub ArretTimer()
        KillTimer Application.hwnd, 0
    End Sub
    Sub LetsGo()
        Dim MonTimerEnSeconde As Long
        ArretDemande = False
        MonTimerEnSeconde = 10
        TimerID = SetTimer(Application.hwnd, 0, MonTimerEnSeconde * 1000, AddressOf MaMacro2)
        DoEvents
    End Sub
    Sub MaMacro2(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
     
    'If Time < heure_déb Then Application.OnTime Date + heure_déb, "MaMacro" ' si tu demarre ton fichier avant 9 heures du mat on programme le premier toutrs de garde a 09:00:00 du jours
        On Error Resume Next
        If Time >= heure_déb Then ' l'heure actuelle est plus grande que l'eure_deb et plus petite que l'heure fin on programe la prochaine minute
            With Sheets("Feuil1")
                Debug.Print Time
                .Range("E" & .Cells(Rows.Count, "E").End(xlUp).Row + 1).Value = .Cells(8, "F").Value
                'une cellule dédiée à l'arret ici "A1" pour l'exemple
                If ArretDemande = True Then 'il suffit de selectionner la cellule A1
                    Debug.Print "arret demandé ok !"
                    ArretTimer
                    Exit Sub
                End If
            End With
     
             DoEvents
            Debug.Print "Next..."
     
        ElseIf Time <= heure_fin Then
            ArretTimer
        End If
    End Sub
    dans le code de Thisworkbook

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        Debug.Print Sh.Name & " " & Target.Address(False, False)
        If Sh.Name = "Feuil1" And Target.Address(False, False) = "A1" Then ArretDemande = True
        Debug.Print ArretDemande
    End Sub
    il reste à finaliser ton besoin mais voila l'idée

  7. #27
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Merci beaucoup Phil tu es un As !!

    Avec ce code de ton côté les données se collent dans la colonne E (pareil pour le message "arret demandé ok !")? J'ai bossé dessus hier soir mais rien ne s'affichait..

  8. #28
    Membre extrêmement actif
    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
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour Phil Free
    Mais fait gaffe le timer présenté ci dessous plante facilement excel si mal utilisé..
    Je te félicite d'être prudent.
    Dans l'exemple montré, toutefois, Addressof a beaucoup moins (presque pas) de chance d'entrer en conflit avec Excel, dans la mesure où :
    - il intervient à intervalles suffisamment grands pour que Excel ait pu intervenir en premier de son côté.
    - les taches effectuées ne sont pas de nature à "voler la vedette" à Excel.
    Les choses revêtent un aspect très différent lorsque sont "volées" à Excel des informations qu'il est censé recevoir en permanence du système (et utiliser immédiatement) avant que d'autres taches ne viennent s'imposer et troubler (ce que fait Addressof) son propre jeu. Le risque de plantage est alors bel et bien présent et pour cause.
    Il y aurait énormément à dire à ce sujet, mais pas dans ce forum (VBA).

    Je vais ici me contenter de citer le cas le plus dangereux : celui d'une utilisation de AdressOf pour exécuter sans cesse des instructions sur la base de la position du curseur de la souris.
    Il est d'ailleurs à ce propos plutôt étrange de solliciter le système pour qu'il détermine - via Adressof - la position du pointeur de souris, alors même que ce sont les mouvements mêmes de ce pointeur qui renseignent toujours -et en premier lieu - le système. C'est un peu comme appeler Paul au téléphone pour lui demander son N° de téléphone.
    Ce n'est par adressof, qu'il convient d'utiliser dans de tels cas, mais l'interception des messages que le pointeur envoie en permanence au système.
    Cette interception est possible, mais :
    1) elle demande une parfaite maîtrise
    2) je me garderai bien, en l'exposant ici (forum VBA) de tenter les moins avertis de l'utiliser, avec les risques induits s'ils ne maîtrisent pas tout.

    Une autre fois : je salue ta sagesse.
    Amitiés

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Avec ce code de ton côté les données se collent dans la colonne E (pareil pour le message "arret demandé ok !")?
    oui !

    dans l’éditeur de code VBA, il faudrait que tu affiches la fenêtre d’exécution soit par un Ctrl+G soit en passant par le menu affichage de l’éditeur VBA.
    Dans cette fenêtre sont renvoyées des valeurs via la commande Debug.Print que tu trouves dans le code posté.

    par exemple : même si le timer ne fonctionne pas la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print Sh.Name & " " & Target.Address(False, False)
    de l'evenement Workbook_SheetSelectionChange que je t'ai fait rajouter au code de ThisWorbook
    te renverra via cette fenêtre d'execution, le nom de la feuille et l'adresse de la cellule nouvellement sélectionnée.

    avant de tenter de relancer les macros applique les changements tel que :


    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
    Option Explicit
     
    Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
     
    Const heure_déb As Date = #9:00:00 AM#
    Const heure_fin As Date = #7:00:00 PM#
     
    Dim TimerID As Long
    Public ArretDemande As Boolean, PremierPassage As Boolean
    Sub ArretTimer()
        TimerID = KillTimer(Application.hwnd, 0)
        DoEvents
        If Not TimerID = 0 Then
            Debug.Print "Timer stoppé avec succès !"
        Else
            Debug.Print "erreur arrêt Timer !"
        End If
    End Sub
    Sub LetsGo()
        Dim MonTimerEnSeconde As Long
        PremierPassage = True
        ArretDemande = False
        MonTimerEnSeconde = 10
        TimerID = SetTimer(Application.hwnd, 0, MonTimerEnSeconde * 1000, AddressOf MaMacro2)
        DoEvents
    End Sub
    Sub MaMacro2(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
     
    'If Time < heure_déb Then Application.OnTime Date + heure_déb, "MaMacro" ' si tu demarre ton fichier avant 9 heures du mat on programme le premier toutrs de garde a 09:00:00 du jours
        On Error Resume Next
        If Time >= heure_déb Then ' l'heure actuelle est plus grande que l'eure_deb et plus petite que l'heure fin on programe la prochaine minute
            If PremierPassage = True Then
                Debug.Print "Time >= heure_déb, tout est OK !"
                PremierPassage = False
            End If
            With Sheets("Feuil1")
                Debug.Print Time
                .Range("E" & .Cells(Rows.Count, "E").End(xlUp).Row + 1).Value = .Cells(8, "F").Value
                'une cellule dédiée à l'arret ici "A1" pour l'exemple
                If ArretDemande = True Then 'il suffit de selectionner la cellule A1
                    Debug.Print "arret demandé ok !"
                    ArretTimer
                    Exit Sub
                End If
            End With
     
             DoEvents
            Debug.Print "Next..."
     
        ElseIf Time >= heure_fin Then ' note que j'ai fait une erreur ici hier ! 
            Debug.Print "Time >= heure_fin, on arrête tout !"
            ArretTimer
        End If
    End Sub
    quand tu testes ce que je t'ai posté n’essaie pas de lancer l’exécution de la macro LetsGo depuis l'evenement Workbook_Open mais Lance l’exécution de la macro Letsgo directement
    Pour cela, tu positionnes le curseur d’édition n'importe ou dans la macro et tu appuis sur la touche [F5] de ton clavier.

    Puis regarde ce qui s'affiche dans la fenêtre d’exécution.

    unperia, merci beaucoup pour tes encouragements, j’essaie de faire de mon mieux pour partager mon petit savoir. Il est clair que je n'est pas ton expérience.
    Amitiés également.

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    Bon ceci annule et remplace le code précédent !

    j'ai ajouté une gestion d'erreur et quelques debug.print et surtout corrigé mes erreurs au niveau des conditions de départ et d’arrêt dans la sub MaMacro2

    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
    Option Explicit
     
    Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
     
    Const heure_déb As Date = #9:00:00 AM#
    Const heure_fin As Date = #12:00:00 PM#
     
    Dim TimerID As Long
    Public ArretDemande As Boolean, PremierPassage As Boolean
    Sub ArretTimer()
        TimerID = KillTimer(Application.hwnd, 0)
        DoEvents
        If Not TimerID = 0 Then
            Debug.Print "Timer stoppé avec succes !"
        Else
            Debug.Print "erreur arret Timer !"
        End If
    End Sub
    Sub LetsGo()
        Dim MonTimerEnSeconde As Long
        Debug.Print "Tantative de demarrage à " & Time
        TimerID = 0
        PremierPassage = True
        ArretDemande = False
        MonTimerEnSeconde = 10
        TimerID = SetTimer(Application.hwnd, 0, MonTimerEnSeconde * 1000, AddressOf MaMacro2)
        DoEvents
    End Sub
    Sub MaMacro2(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
     
        If TimerID = 0 Then Debug.Print "le timer n'a pas demarré !": GoTo AhMince
        On Error GoTo AhMince
        If Time >= heure_déb And Time < heure_fin Then ' l'heure actuelle est plus grande que l'eure_deb et plus petite que l'heure fin on programe la prochaine minute
            If PremierPassage = True Then
                Debug.Print "Time >= heure_déb, tout est OK !"
                PremierPassage = False
            End If
            With Sheets("Feuil1")
                Debug.Print Time
                .Range("E" & .Cells(Rows.Count, "E").End(xlUp).Row + 1).Value = .Cells(8, "F").Value
                'une cellule dédiée à l'arret ici "A1" pour l'exemple
                If ArretDemande = True Then 'il suffit de selectionner la cellule A1
                    Debug.Print "arret demandé ok !"
                    ArretTimer
                    Exit Sub
                End If
            End With
     
             DoEvents
            Debug.Print "Next..."
     
        Else
            If Time >= heure_fin Then Debug.Print "Time >= heure_fin, on arrete tout !"
            If Time < heure_déb Then Debug.Print "Time < heure_déb, on arrete tout !"
            If Not TimerID = 0 Then ArretTimer
        End If
        Exit Sub
     
    AhMince:
        If Not TimerID = 0 Then ArretTimer
        Debug.Print Err.Description
        Debug.Print "/!\ Erreur " & Err.Number
    End Sub

  11. #31
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Super Phil !!!!
    Merci beaucoup !!!
    Tout marche comme sur des roulettes (je vais garder ce code précieusement avec moi et comprendre aussi toutes ces spécificités pour essayer de me débrouiller seul la prochaine fois...)

    Un dernier petit point pourquoi le code ne se met pas en route automatiquement quand le classeur s'ouvre ? (tout devrait être bon du coté du Workbook ?) PS : j'ai bien paramétré les heures du début donc pas de souci de ce côté là..



  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Points : 378
    Points
    378
    Par défaut
    De rien,

    note que c'est quand même un peu bricolé. Je pense que cela pourrait être amélioré mais bon...

    N'oublie pas de noter le poste comme résolu.

    A+

    Philippe

    Edit : je ne sais pas pour le lancement via Workbook_Open... tu fais bien un appel à la sub LetsGo ?
    Après, à voir si à l'ouverture d'un fichier excel l'adressage (Addressof) est "fermer" par l'appli(excel) du fait que à ce moment le fichier n'est encore pas ouvert graphiquement.
    La on est à mon niveau d’incompétence
    Essai de décaler l'appel dans l'evenement Workbook_activate qui, il me semble, arrive en fin de chargement du fichier.

Discussions similaires

  1. [MySQL-5.6] trouver des lignes dans une table qui correspondent à certains mots dans une string
    Par trucmuche2005 dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/12/2017, 16h06
  2. Réponses: 1
    Dernier message: 18/06/2015, 10h38
  3. [XL-2010] Code pour sauvegarder un fichier automatiquement toutes les minutes
    Par philou665 dans le forum Excel
    Réponses: 3
    Dernier message: 03/09/2014, 23h07
  4. Ajout automatique d'une page qui contient des WebParts dans une bibliothèque
    Par hassine dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 29/04/2011, 09h36
  5. Réponses: 5
    Dernier message: 27/04/2010, 15h55

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