Accueil > > > ALTERNATIVE TIMER POUR VBA
ALTERNATIVE TIMER POUR VBA
Information sur la source
Description
Bonjour, Ce code défini une classe d'objet « Timer » permettant de créer des 'Timer' tournant sur de longues durées. Il a vu le jour suite à un problème rencontré lors du développement d'une macro EXCEL nécessitant l'exécution d’une tâche à intervalle régulier. Le composant 'Timer' n'existant pas sous VBA, et une simple boucle faisant ramer le PC, j'ai créé le mien...
Source
- 'Contenu de ma classe Timer
-
- Option Explicit
-
- Private localInterval As Long
- Private localEnabled As Boolean
-
- Private Type FILETIME
- dwLowDateTime As Long
- dwHighDateTime As Long
- End Type
-
- Private TimeOptions As FILETIME ' Durée transmise à la fonction SetWaitableTimer
-
- Private Declare Function CreateWaitableTimer Lib "kernel32" Alias "CreateWaitableTimerA" (ByVal lpSemaphoreAttributes As Long, ByVal bManualReset As Long, ByVal lpName As String) As Long
- Private Declare Function SetWaitableTimer Lib "kernel32" (ByVal hTimer As Long, lpDueTime As FILETIME, ByVal lPeriod As Long, ByVal pfnCompletionRoutine As Long, ByVal lpArgToCompletionRoutine As Long, ByVal fResume As Long) As Long
- Private Declare Function CancelWaitableTimer& Lib "kernel32" (ByVal hTimer As Long)
- Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
- Private Declare Function MsgWaitForMultipleObjects Lib "user32" (ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
-
- Private TimerhWait As Long
- Private CancelTimer As Boolean
- Private TimerRunning As Boolean
-
- Public Event Timer()
-
- '--------------------------------------------------------------
- 'Routine de temporisation...
- '<vdata> : milisecondes
- '<vdata> : <= 0 Annuler l'attente
- '<vdata> : > 0 Démarrer la boucle d'attente
-
- Public Property Let interval(vdata As Long)
- 'Si le Timer est activé
- If localEnabled Then
-
- 'Reset le drapeau d'annulation
- CancelTimer = False
-
- 'Si la durée est inférieur ou égale à zéro
- If vdata <= 0 Then
- 'Durée de la temporisation : <vdata> ms
- TimeOptions.dwLowDateTime = -1
- 'Mettre à jour la variable locale
- localInterval = vdata
- 'Sinon
- Else
- 'Si le timer tourne déjà
- If TimerRunning Then
- 'Annule le décompte en cours
- CancelWaitableTimer TimerhWait
- 'Convertir la nouvelle durée
- TimeOptions.dwLowDateTime = CLng(vdata * -10000)
- 'Programmer le déclenchement de l'évènement 'TimerhWait' dans 'TimeOptions' ms
- SetWaitableTimer TimerhWait, TimeOptions, 0, 0, 0, 0
- 'Mettre à jour la variable locale
- localInterval = vdata
- 'Sinon
- Else
- 'Définir localement le timer comme tournant
- TimerRunning = True
- 'Mettre à jour la variable locale
- localInterval = vdata
- 'Convertir la nouvelle durée
- TimeOptions.dwLowDateTime = CLng(vdata * -10000)
-
- 'Boucle infinie (jusqu'à annulation)
- Do Until TimeOptions.dwLowDateTime = -1
-
- 'Programmer le déclenchement du prochain évènement 'TimerhWait' dans 'Timeoptions' ms
- SetWaitableTimer TimerhWait, TimeOptions, 0, 0, 0, 0
-
- 'Boucle d'attente sans stress (Attendre le déclenchement de l'évènement 'TimerhWait')
- Do While MsgWaitForMultipleObjects(1, TimerhWait, False, &HFFFF, &HFF) > 0
- DoEvents
- 'If CancelTimer Then Exit Do
- Loop
-
- 'Si annulation, sortir de la boucle infinie
- If TimeOptions.dwLowDateTime = -1 Then Exit Do
-
- 'Déclenchement de l'évènement 'Timer'
- RaiseEvent Timer
-
- Loop
-
- 'Définir localement le timer à l'arrêt
- TimerRunning = False
-
- End If
- End If
- 'Sinon
- Else
- 'Mettre à jour la variable locale
- localInterval = vdata
- End If
- End Property
-
- Public Property Get interval() As Long
- interval = localInterval
- End Property
-
- '--------------------------------------------------------------
- Public Property Let Enabled(vdata As Boolean)
-
- 'Si changement
- If vdata <> localEnabled Then
- 'Si activation
- If vdata Then
- 'Mettre à jour la variable locale
- localEnabled = vdata
- 'Si l'intervalle est supérieur à zéro
- If localInterval > 0 Then
- 'Mise en route du timer
- Me.interval = localInterval
- End If
- 'Sinon
- Else
- 'Annulation
- TimeOptions.dwLowDateTime = -1
- 'Mettre à jour la variable locale
- localEnabled = vdata
- End If
- End If
- End Property
-
- Public Property Get Enabled() As Boolean
- Enabled = localEnabled
- End Property
-
- '--------------------------------------------------------------
- Private Sub Class_Initialize()
- 'Création de l'horloge
- TimerhWait = CreateWaitableTimer(0, True, "Timer6RatsMorts")
- 'Initialisation de la durée
- TimeOptions.dwHighDateTime = -1
- TimeOptions.dwLowDateTime = -1
- End Sub
-
- Private Sub Class_Terminate()
- TimeOptions.dwHighDateTime = -1
- TimeOptions.dwLowDateTime = -1
- CloseHandle TimerhWait
- End Sub
'Contenu de ma classe Timer
Option Explicit
Private localInterval As Long
Private localEnabled As Boolean
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private TimeOptions As FILETIME ' Durée transmise à la fonction SetWaitableTimer
Private Declare Function CreateWaitableTimer Lib "kernel32" Alias "CreateWaitableTimerA" (ByVal lpSemaphoreAttributes As Long, ByVal bManualReset As Long, ByVal lpName As String) As Long
Private Declare Function SetWaitableTimer Lib "kernel32" (ByVal hTimer As Long, lpDueTime As FILETIME, ByVal lPeriod As Long, ByVal pfnCompletionRoutine As Long, ByVal lpArgToCompletionRoutine As Long, ByVal fResume As Long) As Long
Private Declare Function CancelWaitableTimer& Lib "kernel32" (ByVal hTimer As Long)
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function MsgWaitForMultipleObjects Lib "user32" (ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Private TimerhWait As Long
Private CancelTimer As Boolean
Private TimerRunning As Boolean
Public Event Timer()
'--------------------------------------------------------------
'Routine de temporisation...
'<vdata> : milisecondes
'<vdata> : <= 0 Annuler l'attente
'<vdata> : > 0 Démarrer la boucle d'attente
Public Property Let interval(vdata As Long)
'Si le Timer est activé
If localEnabled Then
'Reset le drapeau d'annulation
CancelTimer = False
'Si la durée est inférieur ou égale à zéro
If vdata <= 0 Then
'Durée de la temporisation : <vdata> ms
TimeOptions.dwLowDateTime = -1
'Mettre à jour la variable locale
localInterval = vdata
'Sinon
Else
'Si le timer tourne déjà
If TimerRunning Then
'Annule le décompte en cours
CancelWaitableTimer TimerhWait
'Convertir la nouvelle durée
TimeOptions.dwLowDateTime = CLng(vdata * -10000)
'Programmer le déclenchement de l'évènement 'TimerhWait' dans 'TimeOptions' ms
SetWaitableTimer TimerhWait, TimeOptions, 0, 0, 0, 0
'Mettre à jour la variable locale
localInterval = vdata
'Sinon
Else
'Définir localement le timer comme tournant
TimerRunning = True
'Mettre à jour la variable locale
localInterval = vdata
'Convertir la nouvelle durée
TimeOptions.dwLowDateTime = CLng(vdata * -10000)
'Boucle infinie (jusqu'à annulation)
Do Until TimeOptions.dwLowDateTime = -1
'Programmer le déclenchement du prochain évènement 'TimerhWait' dans 'Timeoptions' ms
SetWaitableTimer TimerhWait, TimeOptions, 0, 0, 0, 0
'Boucle d'attente sans stress (Attendre le déclenchement de l'évènement 'TimerhWait')
Do While MsgWaitForMultipleObjects(1, TimerhWait, False, &HFFFF, &HFF) > 0
DoEvents
'If CancelTimer Then Exit Do
Loop
'Si annulation, sortir de la boucle infinie
If TimeOptions.dwLowDateTime = -1 Then Exit Do
'Déclenchement de l'évènement 'Timer'
RaiseEvent Timer
Loop
'Définir localement le timer à l'arrêt
TimerRunning = False
End If
End If
'Sinon
Else
'Mettre à jour la variable locale
localInterval = vdata
End If
End Property
Public Property Get interval() As Long
interval = localInterval
End Property
'--------------------------------------------------------------
Public Property Let Enabled(vdata As Boolean)
'Si changement
If vdata <> localEnabled Then
'Si activation
If vdata Then
'Mettre à jour la variable locale
localEnabled = vdata
'Si l'intervalle est supérieur à zéro
If localInterval > 0 Then
'Mise en route du timer
Me.interval = localInterval
End If
'Sinon
Else
'Annulation
TimeOptions.dwLowDateTime = -1
'Mettre à jour la variable locale
localEnabled = vdata
End If
End If
End Property
Public Property Get Enabled() As Boolean
Enabled = localEnabled
End Property
'--------------------------------------------------------------
Private Sub Class_Initialize()
'Création de l'horloge
TimerhWait = CreateWaitableTimer(0, True, "Timer6RatsMorts")
'Initialisation de la durée
TimeOptions.dwHighDateTime = -1
TimeOptions.dwLowDateTime = -1
End Sub
Private Sub Class_Terminate()
TimeOptions.dwHighDateTime = -1
TimeOptions.dwLowDateTime = -1
CloseHandle TimerhWait
End Sub
Historique
- 10 février 2007 20:08:30 :
- RAS
- 10 février 2007 20:22:26 :
- Correction de la présentation du code
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
peut t'on remplacer la fonction ontime par timer [ par eryk17 ]
bonjourj'ai réaliser une macro sous outlook et jaimerai qu'il s'execute automatiquement ttes les 2h par exemple.J'ai vu qu'il y avait une fonction en
Utilisation du timer [ par jems86 ]
Bonjour tout le monde, Je vous explique mon problème: j'ai programmé une macro dans un module sous Excel (VBA) (macro de calculs et de comparaison..
macro enregistrement pdf sous autocad [ par Ricou36 ]
Bonjour à tous,Je suis débutant en programmation sous AutoCAD et donc je vous demandes votre aide.Pour information, je travailles sous AutoCAD R13 ou
Lancement automatique d'une macro [ par ChevalierPaul ]
Bonjour,J'ai fait l'acquisition d'un PC portable dans une vente : appareil récent (1 an 1/2 environ) en excellent état technique. Les fichiers de trav
Passage d'une variable d'une macro vers une feuille de calcul [ par Tity333 ]
Bonjour, à tous,Je cherche depuis quelque temps à utiliser une variable définie selon les choix d'un set d'OptionButton directement dans mes formules
Problème avec boucle If [ par likemonster ]
Bonsoir tout le monde, j'ai un petit soucis pour réaliser une petite manip sous excel! J'ai une plage de valeurs sur une feuille excel qui se nomme Ma
VBA: executer une macro depuis une fonction [ par edoo82 ]
Bonjour à tous, j'ai un souci, j'arrive pas à exécuter une fonction (personnalisée) qui appelle une macro: dans la cellule B1 de la feuille "Control
Macro word: obtenir le numéro de la ligne d'un mot selectionné [ par elliotttt ]
Bonjour! Je me heurte à un problème que je ne saurais résoudre.! Je cherche une commande, une fonction ou je ne sais quoi qui pourr
inputbox mettre plusieurs macro en mot de passe [ par patbl ]
Bonjourj'ai encore besoin de votre aide je suis sur excel 2000 je crée des mots de passe pour mon fichier pour acceder a chaque fonction mais voila qu
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|