XL 2016 VBA SendKeys - Que se passe-t-il sur le verrouillage numérique des PC et Mac ?

Dudu2

XLDnaute Barbatruc
Bonjour,

En VBA, je connnais 3 façons de faire un SendKeys.
Celui qui semble le plus sûr est un SendKeys via un Shell, mais il a aussi l'inconvénient de provoquer parfois des interruptions de code.
Les 2 autres ont un impact sur le verrouillage numérique (touche en haut à gauche du clavier numérique).

Sur mon PC, je peux constater l'impact des 2 autres, mais j'aimerais savoir pour d'autres PC ou MAC.
1621065747837.png


Merci par avance pour vos retours (si vous avez un voyant Num Lock pour juger de l'effet).
 

Pièces jointes

  • Classeur1.xlsm
    18.8 KB · Affichages: 56
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci pour le retour @sylvanu.
Ça montre la disparité des comportements.

@Yeahou, non je n'ai pas pensé à ça. J'ai juste vu passer Application.EnableCancelKey dans mes recherches Web en me disant que je devais m'y intéresser mais ton message m'indique qu'il faut que j'aille plus loin.
toutes, chez moi, provoquent une interruption, aucune ne fonctionne
Là je déprime 😭
 
@Dudu2
non je n'ai pas pensé à ça. J'ai juste vu passer Application.EnableCancelKey dans mes recherches Web en me disant que je devais m'y intéresser mais ton message m'indique qu'il faut que j'aille plus loin.
Application.EnableCancelKey = xlDisabled désactivera les possibilités d'interruption utilisateur par la touche escape, cela évite d'avoir à les gérer
 

Dudu2

XLDnaute Barbatruc
@Yeahou, bon ben t'as trouvé la solution de mon problème d'envoi d'Escape qui n'a rien à voir avec la méthode SendKeys utilisée pour l'envoyer.
Merci bcp ;)

Le "bonne méthode" étant donc (pour moi en tous cas)
VB:
Sub SendKeys1(Keys As String)
    Dim CancelKeyStatusAtCallTime As Integer
 
    CancelKeyStatusAtCallTime = Application.EnableCancelKey
    If InStr(UCase(Keys), "{ESC") > 0 Then Application.EnableCancelKey = xlDisabled
 
    CreateObject("wscript.shell").SendKeys (Keys)
 
    If Application.EnableCancelKey <> CancelKeyStatusAtCallTime Then Application.EnableCancelKey = CancelKeyStatusAtCallTime
End Sub
 

Pièces jointes

  • VBA SendKeys 3 méthodes.xlsm
    22.2 KB · Affichages: 7
Dernière édition:

MJ13

XLDnaute Barbatruc
Re

Pour moi, le clavier numérique doit rester dans le même état qu'au départ de la macro. et c'est un problème très ancien sur Excel. ;)

Vous pouvez utiliser tous ces codes pour voir dans quel cas, le clavier numérique ne se désactive pas. Après, il faut l'adapter à votre code et au nombre de Sendkeys envoyés.

VB:
Sub A()
SendKeys ("a~")
Réactive_Clavier_Num
End Sub
Sub Réactive_Clavier_Num()
Application.SendKeys ("{Numlock}")
End Sub
Sub AA()
SendKeys ("AA~")
SendKeys ("AA~")
Réactive_Clavier_Numérique
End Sub
Sub AB()
SendKeys ("AB~")
Réactive_Clavier_Numérique
End Sub
Sub ABC()
SendKeys ("A~")
SendKeys ("B~")
SendKeys ("C~")
Réactive_Clavier_Numérique
End Sub
Sub Réactive_Clavier_Numérique()
With Application
          DoEvents
          Application.SendKeys ("{NUMLOCK}"), True
          Application.SendKeys ("{NUMLOCK}"), True
    End With
End Sub
Sub Test3()
    For i = 1 To 3
        Application.SendKeys "(%{1068})", True 'avec"%"=fenetre active ;  sans le "%" =plein ecran
        Application.SendKeys ""
        DoEvents
        ActiveSheet.Paste
    Next
End Sub
Sub Test4()
    For i = 1 To 4
        Application.SendKeys "(%{1068})", True 'avec"%"=fenetre active ;  sans le "%" =plein ecran
        Application.SendKeys ""
        DoEvents
        ActiveSheet.Paste
    Next
End Sub
 

Dudu2

XLDnaute Barbatruc
@MJ13,

Il y a effectivement des comportements très différents.
Chez @sylvanu par exemple, ça alterne ON & OFF.
Chez moi si c'est ON ça passe à OFF, si c'est OFF ça reste à OFF.

Dans le fichier du Post #38, il y a 3 méthodes qui marchent dans tous les cas.
- La 1ère ne nécessite rien de spécial et n'impacte JAMAIS le clavier numérique.
- Les 2 autres impactent le clavier numérique de manières différentes selon la configuration du PC mais gèrent l'état réel du NUMLOCK après le SendKeys pour le rétablir si besoin.
Évidemment, le plus sûr et simple c'est d'utiliser la 1ère dont @job75 serait le découvreur.
 

Statistiques des forums

Discussions
315 065
Messages
2 115 866
Membres
112 602
dernier inscrit
annouara