TIMER POUR VBA

Signaler
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
Messages postés
1
Date d'inscription
mercredi 23 novembre 2016
Statut
Membre
Dernière intervention
23 novembre 2016
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39308-timer-pour-vba

Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut MAITREGEO,

Je reviens sur ce que j'ai dit: pour avoir un intervalle >1mn, il faut seulement utiliser 1 timer qui appelle une simple procédure contenant un compteur qui déterminea l'intervalle désiré.
Exemple ci-dessous:

Sub MiseEnRoute_Timer()
TimerVBA1.Intervalle = 60000 '1mn
TimerVBA1.Active = True
End Sub

Sub TimerVBA1_Timer()
DéclencheEvent
End Sub

Sub DéclencheEvent() 'procédure appelée chaque mn par le timer
Static compteur As Integer 'variable statique non changée à chaque appel
'on peut aussi la déclarer au niveau module
compteur = compteur + 1 'incrémentation
If compteur = 15 Then
'mettre ici l'évènement à déclencher (toutes les 15mn dans ce cas)
compteur = 0 'remise à 0 du compteur pour les 15 prochaines mn
End If
End Sub

Voilà, c'est donc très simple!...

J'espère vous avoir aidé

Cdt
Messages postés
1
Date d'inscription
mercredi 23 novembre 2016
Statut
Membre
Dernière intervention
23 novembre 2016
>
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Bonjour à tous

Tout d'abord, merci à Mimizanzan pour ses conseils avisés, sauf que là je suis concé avec l'installation et l'utilisation du timer.
Dans mes feuilles Excel j'ai besoin de modifier la hauteur de la ligne que je survole avec la souris pour faire apparaître des boutons dynamiquement ainsi que des info-bulles contextuelles.
J'ai commencé par le faire via des SetTimer et KillTimer, mais ça plante Excel quasi systématiquement. Pas très drôle...
Je me suis donc orienté vers la solution dont on parle ici, sauf que j'ai un problème :
- j'ai installé le contrôle complémentaire via le petit programme de mimizanzan : ça a marché, sauf que la commande Regsvr32 C:\MesControleActiveX\TimerVBA.ocx me sort un message du style Échec du chargement du module "C:\MesControleActiveX\TimerVBA.ocx". Vérifiez que le fichier [...] dépendants. Le module spécifié est introuvable.
- malgré tout j'ai réussi à définir une nouvelle référence vers TimerPourVBA ainsi qu'un objet "Dim TimerVab1 as TimerVBA" dans un module VBA (donc TimerVBA est bien reconnu)
- mais dans ma feuille Excel quand je veux enregistrer le nouveau contrôle personnalisé TimerVBA.ocx j'ai un message "Échec lors de l'enregistrement du contrôle dans le registre"

Pourriez-vous m'aider, s'il vous plait ? C'est vraiment très important

Ah oui : je suis sous Windows 10 en 64 bits et Office 2013 32 bits.

Un grand merci d'avance
Gilbert
Messages postés
2
Date d'inscription
dimanche 22 décembre 2002
Statut
Membre
Dernière intervention
21 janvier 2013

Merci pour cette aide je vais donc imbriquer deux timer, car il me faut 15mn de délai.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut MAITREGEO

Merci de votre intérêt pour mon timer.
Je vous précise que la limite de 65s s'applique seulement à la fréquence du timer (et non pas à sa durée de vie), fréquence qui déclenche un ou des évènements désirés. Je pense qu'il y a peu de cas où on ait besoin d'exécuter une action à des intervalles de plus de 1mn...
De toute façon, c'est aussi le cas pour le timer VB classique, qui d'ailleurs a servi pour développer mon ocx.
Sinon, il faut utiliser 2 timers reliés avec par exemple un compteur pour augmenter l'intervalle, ou bien créer le timer avec la fonction API SetTimer (voir comme exemple mon code FEU D'ARTIFICE SOUS EXCEL VBA) qui supporte des intervalles beaucoup + grands.
Voilà, j'espère que ceci vous aidera.

Cdt
Messages postés
2
Date d'inscription
dimanche 22 décembre 2002
Statut
Membre
Dernière intervention
21 janvier 2013

Bonjour MIMIZANZAN,

Votre timer est parfait à un détail près, la limite de 65535 n'autorise qu'un laps de temps de 65 seconde comment faire pour changer cela.

Merci de votre réponse.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

MCSILVER, je ne comprends pas, je viens de réessayer mon timer avec Excel 2007 sans aucun pb.
Tu mets le contrôle sur la feuille avec la boite à outil Contrôles activeX/Autres, puis 2 boutons et le code suivant par ex dans le module de la feuille:

Private Sub CommandButton1_Click() 'démarre le timer avec fréquence 1s
TimerVBA1.Active = True
TimerVBA1.Intervalle = 1000
End Sub

Private Sub CommandButton2_Click() 'arrête le timer
TimerVBA1.Active = False
End Sub

Private Sub TimerVBA1_Timer() 'écrit les secondes dans la cellule A1
Static t As Integer
t = t + 1
Range("A1") = t
End Sub

Je ne peux malheureusement pas t'en dire plus...
Sinon essaye toujours de faire la manip du registre que j'ai expliqué ci-dessus au PIVERT le 11/12/2009.
Cdt
Messages postés
13
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
6 janvier 2011

J'avais exploré cette avenue suite à votre 1ère explication, malheureusement, mon Excel 2007 (assurément maintenu à jour) crash solidement et à répétition immédiatement après avoir cliqué su OK suite à l'ajout du contrôle TimerPourVBA.TimerVBA. J'e n'ai donc pu aller plus loin dans cette exploration. Mon App fonctionne actuellement avec un autre Timer mais si vous avez encore du temps je préfèrerais faire fonctionner le vôtre qui me paraît plus flexible et adapté.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

MCSILVER, on peut utiliser le timer directement sur une feuille Excel, à partir de la boite à outils VBA "Autres contrôles". Le timer n'est pas visible sur la feuille, mais on a accès à ses propriétés à partir de la feuille. Son nom par défaut est TimerVBA1.
Les 2 propriétés à utiliser sont "Active" (pour démarrer le timer et "Intervalle" pour la fréquence (entre 1 et 65535). On met ensuite ce que l'on veut faire avec le timer dans l'évènement "TimerVBA1_Timer" de la feuille.
Cdt
Messages postés
13
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
6 janvier 2011

Y a-t-il un moyen d'utiliser le TimerVBA sans support (tel une Form ou une feuille du classeur)? Un peu comme je tentais de le faire avec le <Dim WithEvents>? Merci à l'avance pour le temps pris pour me répondre.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut MCSILVER,
Quand tu as enregistré (dans le registre) le timer, il devient disponible dans la boite à outils VBA dans "Contrôles supplémentaires" (clic gauche sur la boite à outils). Il suffit alors de cocher la case correspondant à "TimerPourVBA" pour qu'il apparaisse dans la boite à outil et utilisable comme un contrôle normal.
Il ne faut donc pas instancier l'objet: c'est un contrôle intégré quand il est enregistré dans le registre.
Cordialement
Messages postés
13
Date d'inscription
mercredi 25 octobre 2006
Statut
Membre
Dernière intervention
6 janvier 2011

Salut mimiZanzan, j'ai downloadé et enregistré le contrôle sur mon PC. Tout semble OK. Ensuite, dans Excel VBA, je peux définir un objet TimerVBA (Dim WithEvents MyTimer as TimerVBA). Ensuite, j'instancie l'objet: Set Mytimer = New TimerVba. Ici, le compilateur ne reconnaît pas automatiquement la classe TimerVBA. Évidemment la suite ne pourra fonctionner. Je me pose la question si je tente de bien utiliser le contrôle afin d'avoir accès à l'objet et à son événement (MyTimer_Timer)...

Merci d'avance pour tout aide.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut ANGELMAGIC,
Je ne comprends pas ton pb: je confirme que le controle Timer fonctionne correctement sous Excel 2007. Tu parles d'un autre PC: le controle est-il bien installé et enregistré sur ce PC, et la référence (par le menu Outils de VBA) est-elle bien cochée?
Sinon, je ne vois pas...
Messages postés
2
Date d'inscription
mercredi 9 décembre 2009
Statut
Membre
Dernière intervention
6 septembre 2010

Bonjour, j'ai presque le même problème que saloon019 : j'ai développé ma macro avec ton Timer pour vba sous excel 2003. J'essaye d'ouvrir ma macro sur un autre PC, sous excel 2007 et j'ai ce soucis : la référence est bien la : il va bien chercher ma macro sous C:\MesControlesActiveX\TimerVba. Cependant le contrôle n'est pas disponible parmi la liste quand on choisit contrôle supplémentaires. Le PC sur lequel j'essaye d'ouvrir mon application est un Seven 64 bits :s. Aurait-tu une solution?
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut Saloon019,
Je ne comprends pas, je viens de réessayer mon timer avec Excel 2007, et il fonctionne parfaitement, aussi bien dans un userform que directement sur une feuille.
Vérifie d'abord que le contrôle est bien enregistré.
De +, essaie la procédure que je propose ci-dessus à Le Pivert pour autoriser les contrôles activeX sous Office sans le message d'avertissement sécurité, ou bien utilise le code que j'ai déposé récemment pour le faire automatiquement (SUPPRESSION MESSAGE SÉCURITÉ À L'UTILISATION D'UN CONTRÔLE ACTIVEX SOUS EXCEL).
Bonne chance
Messages postés
1
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
1 février 2010

Bonjour Mimizanzan,
Je me suis servi de ton timer pour une appli sous execl 2000 et il fonctionne tres bien.
mais si j'ouvre ce fichier xls sous office 2007, là il y a plantage j'ai vérifié et le timer est bien visible dans les outils de développement VBA donc le ocx accessible depuis excel et lorsque que prend et pose le timer sur ma feuille excel çà plante aussi "excel a rencontrer un probleme....." aurais-tu une solution?
Merci d'avance @+
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut LE PIVERT,
J'ai simplement trouvé ces données à partir du site Microsoft
http://support.microsoft.com/kb/827742/fr.
On va parfois chercher loin une réponse bien proche!
Messages postés
6778
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
29 mai 2020
107
Bonjour Mimizanzan,
Bien vu, cela fonctionne très bien, je ne sais pas où tu as trouvé ces données mais chapeau.Je pense que cela va interesser pas mal de monde.
PS: je pense qu'il faut garder la marche à suivre si tu veux rétablir cette fonction, au cas où!.
@+ Le Pivert
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Bonjour LE PIVERT,
Je viens enfin de trouver la solution au pb de message que tu as soulevé le 16/04/08:
"Cette application est sur le point d'initialiser les contrôles ActiveX potentiellement non sûrs. Si la source de ce fichier est fiable, cliquez sur OK pour que les contrôles soient initialisés à l'aide des paramètres d'espace de travail en cours."
Il faut modifier le registre, donc 2 précautions habituelles:
*Créer un pt de restauration système au cas où
*suivre scrupuleusement la procédure.
Voici la procédure:

Rentrer dans le registre :
Démarrer / Exécuter / Ouvrir « regedit » - OK
1/ Aller dans le Dossier
HKEY_CURRENT_USER\Software\Microsoft\Office\Common
ClickDroit sur Common / Nouveau / clé
Renommer Security et ENTER pour valider le nom
ClickDroit sur Security / Nouveau et cliquer sur Valeur D WORD
Renommer UFIControls et ENTER pour valider le nom
DoubleClick sur UFIControls
Dans Données de la valeur indiquer 1 et OK

2/ Aller dans le Dossier
HKEY_CURRENT_USER\Software\Microsoft\VBA
ClickDroit sur VBA / Nouveau / clé
Renommer Security et ENTER pour valider le nom
ClickDroit sur Security / Nouveau et cliquer sur Valeur D WORD
Renommer LoadControlsInForms et ENTER pour valider le nom
DoubleClick sur LoadControlsInForms
Dans Données de la valeur indiquer 1 et OK

Je viens de faire ceci, et çà marche parfaitement sur mon PC.
Je pense que ceci peut intéresser d'autres membres VB France, car c'est applicable à tous les contrôles ActiveX développés localement sur un PC.

Cordialement
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Merci LE PIVERT, j'avais oublié de préciser que le controle doit aussi apparaitre dans les références...
Messages postés
6778
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
29 mai 2020
107
Bonjour,
j'ai fait le parcours de ANGELMAGIC et je crois savoir d'où vient le problème.
l'OCX est à la bonne place et enregistré. Il faut aller dans outils, références, parcourir et le chercher à son emplacement(mettre fichier de type: ocx) et ensuite dans controles supplémentaires vous le trouvez et ça fonctionne.
J'espére que ma modeste contribution pourra aider.
@+ Le Pivert
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut ANGELMAGIC,
Je ne comprends pas, si tu as fait comme tu le dis, tu devrais trouver dans la boite "contrôles supplémentaires" le contrôle TimerpourVBA.
Le contrôle n'est peut-être pas dans le registre. Essai directement avec la fonction Exécuter de Windows comme suit:
Menu démarrer,Tous les programmes,Accessoires,Exécuter, et écrire dans la fenêtre ouvrir: Regsvr32 "C:\MesControleActiveX\TimerVBA.ocx",puis faire OK.
Sinon, je ne vois pas...
Messages postés
2
Date d'inscription
mercredi 9 décembre 2009
Statut
Membre
Dernière intervention
6 septembre 2010

Bonjour, tout d'abord merçi pour ce contrôle activeX très utile pour vb6. J'ai juste un soucis : j'ai bien lancer ton programme excel InstallTimerVBA.xls, j'ai bien la fenetre me disant que l'ocx est bien enregistrer dans le registre. J'ai vérifier, il a bien été mis dans "C:\MesControleActiveX" Cependant, quand j'ouvre excel, je n'est pas accès à ce contrôle dans la boite à outils de VBA. Je fait, "contrôles supplémentaires", mais impossible de trouver TimerpourVBA ou TimerVBA. Il aurait un autre nom?
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

VARAOH, merci de ton message très intéressant.
J'ai ouvert avec le bloc note le code du controle Timer, et j'ai donc vu ce que tu décris.
Cependant, je ne vois pas ce que l'on peut faire: si on modifie le texte (et lequel?) du bloc note, celà modifie-t-il le code du contrôle?
Cordialement
Messages postés
3
Date d'inscription
mardi 6 novembre 2007
Statut
Membre
Dernière intervention
19 mars 2009

Un rapide passage par ici me rappelle qu'il restait une question sans suite...
Désolé MIMIZANZAN.

Je me dois donc d'être au moins clair.

Pour créer son propre OCX avec VB6, on démarre un projet '\Program Files\Microsoft Visual Studio\VBxxx\Template\Projects\DLL Document ActiveX.vbp' car un OCX est à la base une DLL...

Donc après avoir ouvert ce modéle de projet, un fichier CTL (Contrôle) est disponible et est en général utilisé pour dessiner son propre contrôle utilisateur.

Lorsque le projet 'DLL Document ActiveX' est terminé ET enregistré (je n'ai pas écris compilé), on trouve 2 ou plus fichiers principaux :
- le fichier projet VBP
- le fichier User Contrôle CTL

En ouvrant ces 2 fichiers avec un Bloc-Notes, le code du modèle apparait.
Note : celui-ci n'est pas visible facilement sous l'interface VB

Dans ce code du modèle qui a été modifié et adapté pour refléter le User Contrôle attendu, on trouve en clair certaines propriétés telle que :

- Projet VBP
Type=Control
UserControl=UserControl1.ctl
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\Windows\system32\stdole2.tlb#OLE Automation
Startup="(None)"
Command32=""
Name="Projet1"
HelpContextID="0"
CompatibleMode="1"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="ORION"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=1
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
ThreadingModel=1

- Contrôle CTL (avec par exemple le Timer VB juste déposé dans le projet sans aucune adaptation de code)
VERSION 5.00
Begin VB.UserControl UserControl1
ClientHeight = 435
ClientLeft = 0
ClientTop = 0
ClientWidth = 420
ScaleHeight = 435
ScaleWidth = 420
Begin VB.Timer Timer1
Left = 0
Top = 0
End
End
Attribute VB_Name = "UserControl1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True

Et donc, si code d'adaptation y avait, on le trouverait dans la section :
Begin VB.Timer Timer1
... code adapté ...
End

Les propriétés à occulter sont en général située dans cette section.
D'autres sections peuvent également concerner ta question en fonction des évènements (au sens VB du terme) mais de toutes façons elles sont clairement lisibles et compréhensibles.

Il y également les 'attributs' du contrôle CTL qui vont déterminer plutôt le mode de fonctionnement de l'OCX (Multi-Thread, Multi-Use, etc...).

Espérant avoir apporté un peu d'eau au moulin.

Très cordialement.
Messages postés
3
Date d'inscription
mercredi 25 février 2009
Statut
Membre
Dernière intervention
23 mars 2009

salut a tous je suis nouveau ici ^^ vous n'avais qu'a partir sur le site http://visuelbasic.100webspace.net/visuel basic 11lecon pour vous et merci ^^
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

VARAOH,
J'ai bien trouvé et ouvert le fichier Program Files\Microsoft Visual Studio\VB6\Template\Projects\EXE Document ActiveX.vbp, mais je ne vois pas comment faire pour le modifier pour occulter les propriétés inutiles d'un contrôle utilisateurs.
Peux-tu STP m'éclairer à ce sujet? Merci d'avance.
Concernant mon contrôle, on peut bien sûr aussi l'utiliser directement sur une feuille de calcul Excel, comme n'importe quel contrôle Active X.
Cordialement
Messages postés
3
Date d'inscription
mardi 6 novembre 2007
Statut
Membre
Dernière intervention
19 mars 2009

Super réactive MIMIZANZAN, j'aime cela ;-)...

Merci pour tes précisions, en lisant un peu ce topic j'en avais déduis qu'il fallait utiliser la propriété 'Active' et non 'Enabled' comme pour l'OCX VB6 cité... mais je me demandais l'utilité des autres propriétés et je suis donc fixé.

En effet, je me range à ton avis : lors de la création d'un OCX encapsulé sous VB6, ce dernier rajoute des propriétés issues de son modèle de départ (la fenêtre de sélection d'un nouveau projet), elles peuvent être néanmoins occultées en modifiant le modèle depuis '\Program Files\Microsoft Visual Studio\VBxxx\Template\Projects\EXE Document ActiveX.vbp ou DLL Document ActiveX.vbp'.

Autre point, j'ai implémenté dans une 'Worksheet' (et non pas une 'UserForm') le contrôle de MIMIZANZAN et avec un peu de code (pour la couleur) c'est pile poil... Merci encore !
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

VARAOH,
Merci d'abord de considérer mon "objet" comme précieux!
Pour te répondre, les 2 seules propriétés intéressantes de mon timer sont:
*Active: True pour mettre le timer en route, False pour l'arrêter
*Intervalle: durée de l'intervalle du timer en ms (indispensable de mettre une valeur entre 0 et 65535)
Les autres sont à négliger, je ne sais pas pourquoi elles apparaissent....Elles doivent sans doute faire partie des propriétés génériques des contrôles utiisateurs.
Un fichier d'aide me parait donc vraiment inutile.
Cordialement
Messages postés
3
Date d'inscription
mardi 6 novembre 2007
Statut
Membre
Dernière intervention
19 mars 2009

Merci à MIMZANZAN pour cet objet si précieux...

Néanmoins juste 2 p'tits points :

1. Un tout p'tit fichier TXT d'aide sur les propriétés et leur rôles aurait été bienvenu... car le contrôle classique de VB6 (nommé Timer.ocx) n'utilise pas autant de propriétés... Il y a donc des propriétés que je me demande à quoi elles peuvent servir (active et enabled, locked ???...)

2. Pour RBN :
ce calcul : Range("Feuil1!B2") = Range("Feuil1!B1") + Range("Feuil1!B2")
est nommé sous Excel "référence circulaire" car tu demandes à Excel de placer un résultat dans une cellule sommée... et cela il aime pas bien !
Messages postés
18
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
5 novembre 2010

Bonjour
Merci pour ta réponse et d'avoir été aussi réactif.
Je suis dans le domaine de l'automatisation et j'utilise Excel et VBA pour faire de la validation de modélisation process.
Dans le cas présent, je compte interfacer le modele Excel avec un autre logiciel utilisé dans la plateforme de simulation.
Merci encore pour ton aide précieuse
Cordialement
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Bonjour RBN,
J'ai essayé ton ex ,et en effet çà plante, mais je ne sais pas pourquoi...
En mettant "On error Resume next" avant le calcul, çà marche! Je sais que ce n'est pas très éthique, mais enfin c'est le résultat qui compte.
Juste pour savoir, çà te sert à quoi ce calcul, si je ne suis pas indiscret...
Messages postés
18
Date d'inscription
jeudi 1 mai 2008
Statut
Membre
Dernière intervention
5 novembre 2010

Bonjour ,
Merci pour ce timer qui fonctionne très bien et m'a bien aidé.
Je rencontre toutefois le pb suivant :j'utilise ce timer VBA pour exécuter un calcul avec un pas de 100msec sous Excel.
J'ai volontairement simplifié le calcul à sa plus simple expression (une addition) afin de mettre en évidence le problème.
Le calcul est :
Range("Feuil1!B2") = Range("Feuil1!B1") + Range("Feuil1!B2")
Le calcul plante lorsque j'active une cellule (n'importe laquelle) de la feuille Excel (l'idée étant de modifier la valeur de la cellule B1 pendant l'exécution du calcul) avec le message suivant : Erreur d'execution 50290 ; Erreur définie par l'application ou par l'objet.
Nota : L'équivalent avec le timer "on time" d'Excel ne plante pas le calcul, mais bien sûr ce n'est pas le même timer ... il ne descend pas en dessous de la seconde
Merci à l'avance pour votre aide
Cordialement
Messages postés
1
Date d'inscription
dimanche 1 octobre 2006
Statut
Membre
Dernière intervention
5 juin 2008

.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut Le Pivert,

Merci de ton appréciation.
Désolé, je ne sais pas comment éviter ce message.
Çà doit faire partie de la sécurité Windows ou Office.
Cependant, ce message n'apparait que la première fois qu'on installe le contrôle Timer.Une fois ajouté à la boite à outils, il n'y a plus ce message gênant.
Cordialement.
Messages postés
6778
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
29 mai 2020
107
Très bon code qui marche parfaitement si l'on suit les indications de MimiZanzan. Le seul problème que je trouve c'est ce message à chaque ouverture du fichier: "Cette application est sur le point d'initialiser les contrôles ActiveX potentiellement non sûrs. Si la source de ce fichier est fiable, cliquez sur OK pour que les contrôles soient initialisés à l'aide des paramètres d'espace de travail en cours."
Il y aurait-il une solution pour le supprimer? Merci d'avance
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Carrivin,

TRES JUSTE! Je viens de constater le conflit avec la fonction Timer de VBA (Excel ou Word, peu importe).
Je n'avais jamais utilisé la fonction Timer en même temps que mon timer...
C'est une erreur de ma part d'avoir nommé le projet auquel se refère mon timer bêtement "Timer".
Il faut renommer le projet autrement et ré-enregistrer le contôle OCX dans le registre avec le nouveau nom.

Je viens le faire, et tout est rentré dans l'ordre.
Je vais actualiser mon code sur le site Codes Source en ce sens.

Merci beaucoup pour ta clairvoyance.

Cordialement
Messages postés
6
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
30 septembre 2008

J'utilise ton timer dans une Form sous Word 2000 + l'instruction Timer dans une autre:

Private Sub UserForm_Activate()
Dim TempInfos As Single, Start As Single
If Trim(Label1.Caption) "" Then Label1.Caption "Initialization"

RCFeuilleInfos.Repaint

Select Case Label1.Tag
Case 1
RCDeplacementsDivers.PagePrecedente
TempInfos = 0.5
Case 2
RCDeplacementsDivers.PageSuivante
TempInfos = 0.5
Case 3
RCDiversTechTemplate.Visualise
TempInfos = 0.5
Case 4
RCDiversTechTemplate.Cache
TempInfos = 0.5
Case 5
RCDiversTechTemplate.ActionProtection
TempInfos = 0.5
End Select

Start = Timer ' Définit l'heure de début.

Do While Timer < Start + TempInfos
Loop

Unload RCFeuilleInfos
End Sub

Lorsque j'exécute la macro j'ia une erreur sur l'instruction Timer.
Quand je vais voir la définition de l'instruction Timer ceci pointe vers l'objet Timer VBA et non plus l'instruction Timer.
Je pense que sait le fait que dans le projet Timer project Name est Timer.

Cordialement,

René.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Carrivin,

Je ne comprends pas ton pb de conflit.
Tout marche très bien chez moi, et bien d'autres utilisent ce timer sans "conflit"...
Tu dois avoir un autre pb.

Cordialement
Messages postés
6
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
30 septembre 2008

Attention Il y a un conflit entre le nom Timer_VBA l'instruction Timer VBA, il faudrait changer le nom de l'objet.
Messages postés
3
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
12 mars 2008

SALUT MIMIZANZAN

J'ai testé ton TIMER et ça marche très bien, beaucoup mieux que ma boucle infini sur TIMER VBA qui avec DOEVENTS pendant que l'on attent ralenti considérablement le PC.
Je vais l'installer dans ma macro.

MERCI
Messages postés
5
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
20 février 2008

Oui oui je le lance depuis un autre sub la 1ère fois!!

je l'utilise comme... comme un truc qui me dis toutes les 32 ms que 32ms se sont écoulées!! (pour checker des valeurs sur une autre bécanne (en l'occurence une commande numérique!)

...Et ça fonctionne super!!

Merci
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Non, c'est le seul moyen (comme sur VB6 d'ailleurs).
Mais il faut le lancer à partir d'une sub AUTRE que
Private Sub TimerVBA1_Timer() qui ne se déclenche que si le timer est activé.
Par contre cette procédure peut servir pour l'arrêter.
Messages postés
5
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
20 février 2008

Salut mimiZanzan,

je me demandais s'il y avait un autre moyen poour relancer le timer que par

Private Sub TimerVBA1_Timer()

Timer1.Active = false
Timer1.Active = true

End Sub
Messages postés
5
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
20 février 2008

Merci mimiZanzan,

Je ne l'ai vu qu'après avoir posté mon message... Dsl

A++
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

La plus petite valeur est 1 ms, car le timer est étalonné en ms comme je l'ai indiqué dans mon message ci-dessus du 03/01.
Donc mets 32 pour ton besoin.
Messages postés
5
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
20 février 2008

Avec juste moins de fautes :-)

Salut mimiZanzan,

Peux tu me dire quelle est la plus petite valeur que l'on peutr mettre comme Interval??

Il me faudrait un timer avec une capacité de l'ordre de 32 ms et bien sûr j'en trouve pas!!

Merci

Jurgi
Messages postés
5
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
20 février 2008

Salut mimiZanzan,

Peux tu me dire quel est la plus petite valeur que mettre comme Interval??

Il me faudrait un timer avec une capacité de l'ordre de 32 ms et bien sûr j'en trouve pas!!

Merci

Jurgi
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Bonne année aux VB Members!

Pour TYPIQUEMENT, il faut aussi définir la propriété "intervalle" pour le timer en millisecondes, par ex 1000 pour une seconde, car elle est fixée à 0 par défaut.
Ensuite, mettre une action dans l'évènement "Private Sub TimerVBA1_Timer()", et çà devrait marcher!
Messages postés
3
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
2 janvier 2008

Bonjour et bonne année à tous,

Pour ma part, je ne parviens pas à utiliser le controle...
L'enregistrement dans le registre fonctionne normalement. J'arrive à récupérer le controle que je place dans une form vba mais il ne s'exècute pas à ma guise et rien n'apparait meme si j'ai mis le controle en "active".

Pouvez vous m'expliquer le paramétrage et l'utilisation du controle ou alors ai je simplement un autre bug?

Merci d'avance
Messages postés
3
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 octobre 2007

Salut Mimizanzan,

Le code avait bien son ocx dans system32 sur la machine de développement, et sur celle de prod.
L'enregistrement s'était bien passé sur les 2 systèmes.

J'ai dû changer d'option et recoder différement (tâches planifiées de windows) car la date de recette arrivait.

Je ne lâche pas le morceau car ton code est intéressant et j'aimerai le réutiliser pour d'autre développements. Je te fais un mail si je trouve qq chose.
Merci,
CBa
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut Devinet,

En complément de mon commentaire précédent, je précise que pour que le timerVBA d'un programme fonctionne sur plusieurs machines, il faut AVANT de l'enregistrer dans le registre, que le fichier Timer.ocx soit dans le même CHEMIN D'ACCÈS sur les différentes machine, par ex "C:\MesControles".
C'est pourquoi la plupart des dll et des activeX de Windows sont tous dans le chemin C:\WINDOWS\System32 ou
C:\WINDOWS\System.
Ne pas oublier que l'enregistrement dans le registre tient compte de la position du fichier sur le disque de la machine.
Si çà intéresse quelqu'un, j'ai fait un petit code VBA pour l'installation et l'enregistrement du timer à une position créée à partir de C:\
Merci de me faire savoir si ce commentaire t'as aidé.
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut Devinet,

Je crois que le pb est que le timer ocx, s'il est bien présent dans system32 de la machine B, n'est néanmoins pas enregistré dans le registre de la machine, ce qui est indispensable à son fonctionnement. Il faut donc le faire...
Je pense que tu sais le faire.
Messages postés
3
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 octobre 2007

Bonjour,

Je ne sais pas si ton problème et le même que le mien car tu n'as pas donné
beaucoup de précisions dans ton commentaire.

Mais j'ai rencontré le problème suivant, et je me suis dépanné comme indiqué
plus bas.

un code VBA développé sur une machine A et qui s'exécutait parfaitement sur cette machine, est copié sur une machine B, mais se plante sur l'instruction timer.active=true.

Après contrôle :
- l'ocx est bien dans system32
- le regsvr32 se déroule correctement
- le timer est bien visible dans la boîte à outils.

Si on regarde (sur le code qui ne marche pas) les propriétés du timer.
on ne trouve pas les propriétés active et intervalle.... ce qui provoque un message d'erreur à l'exécution.

Sur la machine B, j'ai créé un fichier excel, insérer un userform, insérer un timer. les propriétés active et intervalle sont présentes. Un peu de code dans l'auto_open du fichier pour afficher la userform et lancer le timer : tout marche.

Je me suis dépanné comme ceci :
- ouvrir le fichier excel qui ne marche pas (celui développé sur la machine A)
- supprimer le timer dans la userform du code qui ne marche pas
- ouvrir le fichier de test (ci-dessus) qui marche,
en laissant ouvert l'autre fichier.
- sélectionner le timer dans la userform du code qui marche, faire Ctrl C
- et copier le timer dans la userform du code qui ne marchait pas.
- renommer le timer en conformité avec le nom utilisé dans le code qui ne
marchait pas.
- vérifier que le timer a bien ses propriétés intervalle et active présentes.
- enregistrer le fichier

et le code marche.

Je ne comprend pas pourquoi ces propriétés sont perdues en copiant le fichier xls de la machine A vers B, ni pourquoi un nouveau code écrit sur B est correct. mais je me suis dépanné comme cela.
Espérant que cela t'aide.


Mimizanzan, merci pour ton code qui m'a bien été utile.
As tu une idée sur le problème que j'ai pû rencontrer.

CBa
Messages postés
11
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
1 novembre 2008

merci mimiZanzan pour votre controle timer
il est vraiment efficace mais il n'est pas fonctionnel dans tous les ordinateurs: dans certaines postes(win xp ,excel 2003) et quand je dessine le controle activex dans la feuille excel le programme se plante et ne répond plus. merci de me donner une solution s'il existe: c'est extrement urgent!!! merci d'avance
Messages postés
7
Date d'inscription
dimanche 18 juillet 2004
Statut
Membre
Dernière intervention
28 mai 2007

bonjour,j'ai un projet de stage ki me demande de faire une application pour extraire les données d'une machine ,les convertir (parce ke se sont des fichiers text) en pdf(parce ke c sécurisé),puis les archiver afin de les exploiter par aprés,
svp aidez-moi à réaliser ce projet
en fait,l'extraction des fichiers(données) doit étre sous réseau,non pa par port série ou paralléle!!!!!!
Messages postés
1
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 février 2007

Bonjour,

ton timer sur userform me plaisait bien, je n'ai eu aucun problème d'installation, par contre après avoir mis pour tester dans une macro :
Cells(2, 13).Value = Time
TimerVBA1.Active = True
TimerVBA1.Intervalle = 65000 '(entre autres)je suppose que celà fait 65 sec
Cells(2, 14).Value = Time
j'obtiens : 5:56:25 PM 5:56:25 PM et ce quelque soit la valeur de l'ntervalle...
je n'ai donc pas de temporisation....apparement ou peut être n'ais-je pas bien compris le fonctionnement ? L'intervalle est en ms ?
Merci d'une réponse si possible....

JP
Messages postés
1
Date d'inscription
dimanche 15 octobre 2006
Statut
Membre
Dernière intervention
15 octobre 2006

Bonjour
J'ai essayé ceci :b/Avec Windows: menu démarrer,exécuter,écrire dans la fenêtre ouvrir: Regsvr32 "pathContrôle.ocx", Mais module introuvable ! avec : REGSVR32 Timer.ocx ca marche mais quand je place le controle dans l'userform j'ai un bug avec rapport d'erreur etc... à l'aide !!!
Messages postés
8
Date d'inscription
mardi 23 décembre 2003
Statut
Membre
Dernière intervention
22 septembre 2009

Merci pour ce code , car pour le moment j'utilisais OnTime avec beaucoup de problèmes d'arret en cas d'erreur
par contre chaque fois que j'ouvre la feuille il me dit de me méfier de l'OCX, comment passer outre à cette requette

merci
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Salut, et merci de t'intéresser à mon code!

3 solutions:
a/Avec VB: -ouvrir un projet Contrôle ActiveX
-y ajouter le contrôle TimerVBA.ctl par le menu Projet, et mettre sa propriété public à true si c'est demandé.
-supprimer le contrôle par défaut UserControl1.
-faire créer projet activeX par le menu fichier (projet1.ocx), et donner un nom significatif au fichier, VBATimer par exemple, en choisissant une destination pour le fichier du contrôle).
Le contrôle ocx est compilé et enregistré dans le registre automatiquement.
b/Avec Windows: menu démarrer,exécuter,écrire dans la fenêtre ouvrir: Regsvr32 "pathContrôle.ocx", où pathContrôle est le chemin complet et le nom du contrôle. Pour enlever le contrôle du registre, faire de même avec Regsvr32 /u "pathContrôle.ocx".
c/ Avec Excel VBA: j'ai développé un petit programme pour enregistrer/supprimer les dll et les ocx (code source "ENREGISTREMENT FICHIERS ACTIVEX .OCX ET .DLL")

Ensuite, il suffit d'ouvrir Excel par ex, ajouter un userform dans VBA, puis menu Outils, contrôles supplémentaires, et cocher le nom du contrôle dans la liste. il devient alors disponible comme tout bon contrôle des familles!
Je lui ai même fait une tête de timer...

En tout cas, c'est vraiment en effet très pratique d'avoir un contrôle timer dans VBA (on peut en mettre autant qu'on veut, et même directement sur une feuille de calcul, et ils sont invisibles à l'exécution!)
Messages postés
26
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
29 juillet 2007
1
Bonjour,
Je cherche depuis un bon moment à utiliser un timer dans VBA ( Excel ) exactement comme dans VB. La fonction Sleep par exemple est très insuffisante.
C'est pourquoi j'aimerais un peu plus de détails sur l'installation de ce Timer pour qu'il soit utilisable dans VBA Excel. J'ai déziper tous les fichiers ( il y en a 9 en tout, des ocx, des ctl, des ctx... ). Par quoi faut-il commencer ? Par exemple comment enregistrer l' ocx dans le registre ? Et ensuite...
Merci.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Salut,

pour la valeur i, c'est une erreur. En fait quand j'ai vu ta source, c'est à ce moment que j'ai créé ce bout de code. i était là pour mes essai dans une boucle.

La valeur TimerID sert à détecter le bon timer désigné (ici 0 car pas désigné) mais tu peux en attribuer plusieurs. Pour le 2000, c'est l'interval en ms.

"De +, les actions pendant le timer doivent forcémment être placées dans la procédure MonTimer"
>> je l'ai fait à la vb6. Dans vb6, il faut rendre un timer enable, puis les actions sont lancées, dans la procédure Sub Timer1_Timer()

Je ne remet pas ton code en question car il est effectivement pratique de l'avoir en ocx, je te propose une autre soluce, avec les API Set et KillTimer, puis le FindWindowA, afin de déterminer le handle d'une fenêtre pour appliquer le timer.

Pour information l'API timer est un peu plus précise que le timer de vb6 (et l'interval est supérieur)

++
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017

Merci pour ton commentaire.
En fait, ce que je propose, c'est d'avoir un vrai contrôle Timer en VBA que l'on peut utiliser en plusieurs exemplaires à la fois avec des intervalles différents, et même sans utiliser d'userform en le ou les plaçant directement sur une feuille Excel, en les gardant invisibles.
Par contre au sujet de ton code, peux-tu m'expliquer le rôle de la variable publique i et la valeur 2000 dans la fonction SetTime, ainsi que l'obtention de la variable TimerID? Comment règle-t-on le délai du timer? De +, les actions pendant le timer doivent forcémment être placées dans la procédure MonTimer, alors qu'avec un contrôle activeX on fait ce que l'on veut où on veut pendant le déroulement du délai.

Merci d'avance.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Salut,

voici une autre méthode :

' *** A placer dans un Module :

Option Explicit

Public Declare Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

Public TimerID As Long
Public hwnd As Long
Public i As Integer

Sub StartTimer()
SetTimer hwnd, TimerID, 2000, AddressOf MonTimer
End Sub

Public Sub MonTimer(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)

' *** ici les actions à faire
End Sub

'=======================================================================

' *** A placer dans le UserForm :

Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub UserForm_Initialize()
hwnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
"X", "D") & "Frame", Me.Caption)

Call Module1.StartTimer
End Sub

Private Sub UserForm_Terminate()
Call Module1.KillTimer(hwnd, TimerID)
End Sub

++