XL 2010 Savoir si on a appuyé sur une touche déterminée en présence d’un UF

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Un UF apparaît en « modal ». Est-il possible de savoir que l’on a appuyé sur la touche clavier « Enter » ? Je voudrais récupérer cette éventualité dans une condition :

If x = 1 And OnVientDapputerSurEnter Then…
 

patricktoulon

XLDnaute Barbatruc
bonsoir Stapple1600
comme je disais plus haut tout se gère dans le keydown qui annule,valide ou renvoie vers la sub sortie avec l'argument "juste"
donc voici avec les touche CTRL , ALT, PAUSE interdites
le code est monté de façon a ce que toute modifs soit plus facile car pas d'imbrication de condition comme la version de @Magic_Doctor ( un vrai sac de loeuds

le (rolling phrase) c'est le timer qui s'en charge en addressof il fonctionne en détaché presque indépendamment du reste le userform finalement change juste la variable" index"


si on :
met un mot de passe sur le projet
fait une obfuscation chiffrée

ça ralentira pas mal de filouteurs
 

Pièces jointes

  • mdp version pat.xlsm
    32.4 KB · Affichages: 12

Magic_Doctor

XLDnaute Barbatruc
Bonjour à tous,

D’abord, moi pas programmeur. Moi dilettante austral. Quand une idée me passe par la tête, j’essaie de la résoudre avec mes moyens du bord et, bien sûr, l’aide du forum (sinon, je n’irais pas dans les forums…). Un programme, quel qu’il soit, est toujours perfectible (performances, concision, élégance…). En revanche, le point le plus important, c’est qu’il fonctionne ! Même si c’est pour le fun, comme c’est le cas ici.

Il est vrai qu’il y avait beaucoup de Flags, j’ai remplacé « basta » (= « assez » en français) par « FlgExit », plus explicite, comme le proposait BrunoM45.
J’ai fait encore quelques petites modifications, vraiment mineures, pour parvenir à mes fins.

1/ L’UF s’ouvre, le message défilant est bleu. On peut toujours fermer l’UF en appuyant sur la touche « Esc », et seulement cette touche.

2/ On ne connaît pas cette astuce, on doit alors cliquer sur le « champignon » afin de pouvoir accéder au TextBox pour y entrer un mot de passe.

À partir du moment où l’on a cliqué sur le champignon, on ne peut plus sortir de l’UF, à moins d’y avoir entré le bon mot de passe. Autrement dit, la touche « Esc » ne permet plus de fermer l’UF ; on est donc condamnés à rentrer un mot de passe (bon ou mauvais).

Quand on rentre un mot de passe (crypté), si on appuie sur « Esc », le mot de passe s’efface pour en rentrer un nouveau (fortuitement je l’ai constaté, ce qui, somme toute, n’est pas gênant). En revanche, si on appuie sur « Enter », cela reviendrait alors à cliquer sur le bouton « OK », ce qui est, ma fois, logique. On peut donc valider le mot de passe entré (valide ou pas) soit en cliquant sur le bouton « OK », soit en appuyant sur la touche « Enter ».

3/ Idem pour les 2ème et 3ème essais.


Je viens d’essayer l’application de patriktoulon (#8). Le problème, c’est qu’à l’ouverture de l’UF (avant même la première tentative de mot de passe) on ne peut pas le fermer en appuyant sur « Esc ».

Enfin, je viens d’essayer l’application (#14), toujours de patricktoulon. Chez moi, ça n’a pas marché. Des APIs ne sont manifestement pas reconnues (rouges), certainement en raison de ma version obsolète d’Excel (2007…).

Au fait, en Uruguay on n’est pas confinés, la quarantaine n’est pas obligatoire, et tout se passe bien pour le moment : 61 DC pour 3,45 millions d’habitants ---> 0,0026%. Pas de quoi en faire un pataquès…
Ramené à la population française, cela ferait aux alentours de 1200 DC...

Gaucho.jpg
 

Pièces jointes

  • Pb USF Touche Enter (4).xlsm
    80 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re
regarde mon procédé et analyse
ton userform affiché fait monter mon procc en 70%
c'est rédhibitoire pour un simple input mdp

tu pourrais aussi t' intéresser au sub classing X fois d'un même controls et gérer les events de deux façons pour un même controls ce qui réduirait considérablement les cabrioles que tu fait avec les variables
bien Evidemment le rolling des phrases traité en addressof par le timer réduit aussi la charge
tournant de lui même les cabrioles que tu fait dans ton do loop n'existeraient pas

je reconnais que l'exercice est amusant
 

patricktoulon

XLDnaute Barbatruc
tiens comme ca vite fait un exemple
prenez un userform et mettez un textbox1
VB:
Option Explicit
Public WithEvents secure As MSForms.TextBox
Public WithEvents TxTb As MSForms.TextBox
Public stopKey As Boolean

' le principe :
' utiliser 2evenement pour un meme controls
' ici secure et TxTb sont le meme textbox 2 instances  pour un meme textbox
' le premier je l'ai appelé secure  son nom parle de lui meme
' je vais donc gérer dans secure tout ce qui est securité
' une variable "stopKey" est modifiée elle peut servir dans tout l'userform
' le second me servira pour d'autre traitement des touches


Private Sub secure_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 17, 18, 19: KeyCode = 0: stopKey = True
Case Else: stopKey = False
End Select
End Sub

Private Sub TxTb_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Not stopKey Then MsgBox KeyCode Else MsgBox "touche Interdites"
End Sub

Private Sub UserForm_Activate()
Set secure = TextBox1
Set TxTb = TextBox1
End Sub

ainsi on n'a pas d'imbrication de condition dans un même events
les deux instances du textbox travaillent séparément et l'un communique a l'autre si oui ou non la touche doit être valider
c'est un exemple assez simpliste que j'aurais pu gérer dans un seul c'est juste pour l'exemple
ça devient plus simple a gérer dans l'events TxTb
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oui si tu veux
pour montrer ce que veux dire sub classing
j'ai remplacer pour l'execution TxTb par l'events original du textbox vous verrez ca ne fonctionne pas ;)

VB:
Option Explicit
Public WithEvents TxTb As MSForms.TextBox
Public WithEvents secure As MSForms.TextBox
Public stopKey As Boolean


' le principe :
' utiliser 2evenement pour un meme controls
' ici secure et TxTb sont le meme textbox 2 instances  pour un meme textbox
' le premier je l'ai appelé secure  son nom parle de lui meme
' je vais donc gérer dans secure tout ce qui est securité
' une variable "stopKey" est modifiée elle peut servir dans tout l'userform
' le second me servira pour d'autre traitement des touches



'Private Sub TxTb_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Not stopKey Then MsgBox KeyCode Else MsgBox "touche Interdites"
End Sub
Private Sub secure_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 17, 18, 19: KeyCode = 0: stopKey = True
Case Else: stopKey = False
End Select
End Sub

Private Sub UserForm_Activate()
Set secure = TextBox1
Set TxTb = TextBox1
End Sub


tout simplement par ce que textbox1 fait parti de l’instance userform1 originale( celle qui s'initie a l'ouverture)
les autres font partie des sub(sous classe) de l'userform1 et donc ne peuvent pas communiquer avec l'instance original
sauf!!!! si j'utilise le prefixe "userform1." devant les variables
ceux qui ont décortiqué mon calendrier comprendront ;)
s
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 251
Messages
2 086 623
Membres
103 268
dernier inscrit
gille deleuze