Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Application onkey

5 réponses
Avatar
Tendasque
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci

5 réponses

Avatar
michdenis
Bonjour Tendasque,

Question floue !

La procédure EssaiChrono est-elle dans un module standard ?
Que contient ta procédure comme code ?
Application.OnKey "{End}", "essaichrono"





"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de groupe de discussion :
#
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci
Avatar
Tendasque
Je vais essayer de préciser:
- la procédure EssaiChrono est dans un module standard

Sub essaichrono()
[A1000].End(xlUp).Offset(1, 0).Select

ActiveCell.Value = Range("L1").Value
ActiveCell.Value = Range("L1").Value
End Sub

L1 contient la formule maintenant()

Si nécessaire, je peux poster mon fichier

Merci de ton aide

"michdenis" a écrit dans le message de news:

Bonjour Tendasque,

Question floue !

La procédure EssaiChrono est-elle dans un module standard ?
Que contient ta procédure comme code ?
Application.OnKey "{End}", "essaichrono"





"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de groupe
de discussion :
#
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D
s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à
False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le
bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci



Avatar
michdenis
Ce que je peux t'offrir c'est ceci :

Utilise un bouton de commande émanant de la barre d'outils
"Contrôle" et dans les propriétés de ce contrôle, tu peux définir
"Accelerator" avec une lettre qui deviendra ton raccourci clavier
pour ce bouton avec la combinaison de la touche "Alt"
Alt + La lettre que tu as retenue pour accelerator

Pour une raison que j'ignore, application.onkey ne fait pas le boulot.
Pour ceux que la chose intéresse, j'ai fait cette expérience :

J'ai inséré ce code dans un module standard et j'ai
afficher la fenêtre exécution dans la fenêtre vba
(menu / affichage / fenêtre exécution)

A ) d'abord je mets en place le raccourci clavier en exécutant
la procédure : The_ShortCut
B ) Je lance la boucle infinie avec la procédure "Test"
C ) Normalement à partir de l'interface de calcul, si je tape sur
la touche M, la procédure "EssaiChrono" s'exécute et met
la variable Ok à True
D ) Comme Ok = True, cela devrait lancer la procédure "SaveData"
Or, il n'en n'est rien. De modifier la valeur de la variable Ok
ne modifie en rien l'exécution de la procédure.
E ) Le plus surprenant, si on regarde dans la fenêtre Exécution
la procédure "EssaiChrono" s'est bien exécuter car on voit
clairement que la valeur Ok a changé de valeur mais on ne
voit pas trace de l'exécution de SaveData. L'utilisation d'un
bouton de commande comme intermédiaire fonctionne
correctement.

Conclusion : la commande "DoEvents" ne fait pas le boulot
attendu. Dans l'aide d'Excel, il est écrit :
'----------------------------------
DoEvents passe la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de
traiter les événements de sa file d'attente et que tous les codes de la file d'attente
SendKeys aient été transmis.
'----------------------------------
Lorsque l'on utiliser un bouton de commande, cet objet (activex) est extérieur à Excel. Le
clic sur ce dernier ou son raccourci clavier s'ajoute aux événements de la liste
d'attente... mais le simple raccourci fait dans Excel n'a aucun impact.

'déclaration de la variable dans le haut du module standard
Public Ok As Boolean
'---------------------------------
Sub The_ShortCut()
Ok = False
Application.OnKey "m", "EssaiChrono"
End Sub
'---------------------------------

Sub EssaiChrono()
Ok = True
Debug.Print "OK"; Ok
End Sub
'---------------------------------
Sub SaveData()
'Adapte le nom de la feuille
With Worksheets("Feuil1")
.Range("A" & .Range("A65536").End(xlUp)(2).Row) = Now
End With
End Sub
'---------------------------------
Sub test()
'Boucle infinie pour les besoins de la cause
Do While t <= Timer
DoEvents
If Ok = True Then
Debug.Print "toto" & Ok
Call Module1.SaveData
Ok = False
End If
Loop
End Sub
'---------------------------------



"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de groupe de discussion :

Je vais essayer de préciser:
- la procédure EssaiChrono est dans un module standard

Sub essaichrono()
[A1000].End(xlUp).Offset(1, 0).Select

ActiveCell.Value = Range("L1").Value
ActiveCell.Value = Range("L1").Value
End Sub

L1 contient la formule maintenant()

Si nécessaire, je peux poster mon fichier

Merci de ton aide

"michdenis" a écrit dans le message de news:

Bonjour Tendasque,

Question floue !

La procédure EssaiChrono est-elle dans un module standard ?
Que contient ta procédure comme code ?
Application.OnKey "{End}", "essaichrono"





"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de groupe
de discussion :
#
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D
s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à
False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le
bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci



Avatar
Tendasque
Voici un lien vers le fichier:
http://www.cijoint.fr/cjlink.php?file=cj200910/cijD8KNI6Y.xls
pour y voir plus clair:
- les Userforms s'affichent à l'ouverture
- le clic sur Dep du Userform2 (Départ -Erreurs à l'arrivée) lance le chrono
- le clic sur Arrivée saisit une arrivée
- l'appui sur la touche clavier Fin devrait faire de même... mais ne
fonctionne que si le Userform3 (chrono) est arrêté

"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de news:

Je vais essayer de préciser:
- la procédure EssaiChrono est dans un module standard

Sub essaichrono()
[A1000].End(xlUp).Offset(1, 0).Select

ActiveCell.Value = Range("L1").Value
ActiveCell.Value = Range("L1").Value
End Sub

L1 contient la formule maintenant()

Si nécessaire, je peux poster mon fichier

Merci de ton aide

"michdenis" a écrit dans le message de news:

Bonjour Tendasque,

Question floue !

La procédure EssaiChrono est-elle dans un module standard ?
Que contient ta procédure comme code ?
Application.OnKey "{End}", "essaichrono"





"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de groupe
de discussion :
#
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui
affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D
s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à
False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le
bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci







Avatar
Tendasque
Le fait de devoir combiner 2 touches ne rend pas les choses plus simples;
s'il n'y a pas de solution, je vais donc en rester à mon "clic sur bouton"
qui fonctionne, même si c'est moins pratique que l'appui sur une touche !

"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de news:

Voici un lien vers le fichier:
http://www.cijoint.fr/cjlink.php?file=cj200910/cijD8KNI6Y.xls
pour y voir plus clair:
- les Userforms s'affichent à l'ouverture
- le clic sur Dep du Userform2 (Départ -Erreurs à l'arrivée) lance le
chrono
- le clic sur Arrivée saisit une arrivée
- l'appui sur la touche clavier Fin devrait faire de même... mais ne
fonctionne que si le Userform3 (chrono) est arrêté

"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de news:

Je vais essayer de préciser:
- la procédure EssaiChrono est dans un module standard

Sub essaichrono()
[A1000].End(xlUp).Offset(1, 0).Select

ActiveCell.Value = Range("L1").Value
ActiveCell.Value = Range("L1").Value
End Sub

L1 contient la formule maintenant()

Si nécessaire, je peux poster mon fichier

Merci de ton aide

"michdenis" a écrit dans le message de news:

Bonjour Tendasque,

Question floue !

La procédure EssaiChrono est-elle dans un module standard ?
Que contient ta procédure comme code ?
Application.OnKey "{End}", "essaichrono"





"Tendasque" <unss34(a_enlever)@free.fr> a écrit dans le message de
groupe de discussion :
#
Bonjour,
Je gère une course avec un fichier Excel.
Le clic sur un bouton démarre le chrono et affiche un userform qui
affiche
le chrono
extrait du code:

Do While Not fin
UserForm3.Label1.Caption = Format((Timer() - départ) / 3600 / 24,
"nn:ss")
DoEvents
Loop

Le clic sur un autre bouton correspond à une arrivée: en colonne D
s'affiche
le temps du coureur
j'ai pris la précaution de mettre la propriété ShowModal du Userform à
False
pour pouvoir saisir des valeurs dans la feuille (dossards arrivés)
Tout cela fonctionne bien, mais je voudrais remplacer le clic sur le
bouton
d'arrivée par l'appui sur une touche; j'ai donc mis dans le code de
Private Sub Workbook_Open()
Application.OnKey "{End}", "essaichrono"
(j'ai essayé aussi dans le code de la feuille en Activate)

la macro essaichrono valide le temps.
le pb c'est que quand le userform est affiché et le chrono en route, vba
semble occupé et l'appui sur End ne déclenche rien; quand j'arrête le
chrono, l'appui sur End valide bien une arrivée.

Pouvez-vous me venir en aide ?
Merci