web-dev-qa-db-fra.com

SendKeys joue avec ma clé NumLock via le code VBA dans le formulaire d'accès

J'ai le code suivant pour un formulaire d'accès. Il semble que si SendKeys soit en train de jouer avec mon NumLock touche en activant et désactivant cette fonction au fur et à mesure que j'ouvre et ferme le formulaire.

Pour des raisons parfaitement valables que je ne souhaite pas aborder, je ne souhaite vraiment pas masquer complètement le ruban (je veux que les menus déroulants restent accessibles), de sorte que la commande DoCmd.ShowToolbar n'est pas ma méthode préférée pour le faire.

Quelqu'un a-t-il des suggestions sur la façon dont je peux modifier le code ci-dessous pour accomplir ce que je veux à l'aide de la commande SendKeys?

Utiliser Access 2007 pour que la commande

CommandBars.ExecuteMso "MinimizeRibbon"

n'est pas disponible pour moi.

À propos, la base de données sera distribuée, donc la solution doit être contenue dans la base de données.

Private Sub Form_Close()

' Unhide navigation pane
    DoCmd.NavigateTo "acNavigationCategoryObjectType"
    DoCmd.Maximize

' Maximize the ribbon
RibbonState = (CommandBars("Ribbon").Controls(1).Height < 75)

Select Case RibbonState
    Case True
        SendKeys "^{F1}", True
    Case False
        'Do nothing, already maximized
End Select
End Sub

Private Sub Form_Load()
' Hide navigation pane
    DoCmd.NavigateTo "acNavigationCategoryObjectType"
    DoCmd.Minimize
Debug.Print Application.CommandBars.Item("Ribbon").Height
' Minimize ribbon
RibbonState = (CommandBars("Ribbon").Controls(1).Height < 100)

Select Case RibbonState
    Case True
        'Do nothing, already minimized
    Case False
            SendKeys "^{F1}", False
End Select
End Sub
11
user12059

C'est un bogue dans Microsoft VBA. Mais il existe une solution de contournement.

Utilisation F8 parcourir la macro et trouver où il l’éteint. C'est généralement après un SendKeys.

Ajoutez ensuite un Sendkeys "{NUMLOCK}", True après la ligne pour inverser l’effet.

Si vous ne le trouvez pas, ajoutez-le à la fin et une fois terminé, il reviendra en arrière. Si tout va bien, si vous l'ajoutez pendant le processus d'affichage/masquage, cela fonctionnera.

14
icebird76

J'ai eu le même problème et j'ai trouvé une solution sur un forum vba. Au lieu de Sendkeys buggy, vous pouvez simuler kyes comme ceci.

    Option Explicit
'//WIN32API Declare
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

'//WIN32API Constant

Public Const KEYEVENTF_EXTENDEDKEY = &H1
Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_CONTROL = &H11
Public Const VK_SHIFT = &H10
Public Const VK_F6 = &H75

Public Function PreviousTab()
    keybd_event VK_CONTROL, 0, 0, 0
    keybd_event VK_SHIFT, 0, 0, 0
    keybd_event VK_F6, 0, 0, 0
    keybd_event VK_F6, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
    keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
End Function

Vous pouvez trouver d’autres touches ici vba forum Cette fonction "previousTab" vient d’envoyer les touches Ctrl + Maj + F6.

4
BTjacker

Cette ligne a causé mon problème:

Application.SendKeys "%s"

RESOLU en changeant à ceci:

Application.SendKeys "{NUMLOCK}%s"

Il n'y a pas de différence entre ajouter {NUMLOCK} au début et à la fin de la chaîne.

3
RodB

Ceci est causé par:

Sendkeys "any key", False

Au lieu de False comme second paramètre, utilisez True.

2
omari

Juste après votre déclaration SendKeys, ajoutez ces 2 lignes:

DoEvents
SendKeys "{NUMLOCK}{NUMLOCK}"
1
Mendel Lowy

Lorsque vous exécutez une dernière commande sendKeys dans votre code, l'ajout de {NUMLOCK} à l'instruction peut faire l'affaire, comme indiqué par RodB et iceBird76. Mais ce n’est pas une bonne pratique de codage, et voici pourquoi: si quelque chose est différent d’une fois à l’autre lorsque vous exécutez la macro, cela peut ne pas fonctionner. Je le sais parce que je vivais moi-même un problème similaire. Lorsque je faisais une commande sendKeys à la fin de mon programme, le verrou numérique restait parfois activé, mais parfois, il restait éteint, en fonction de certaines variables de la feuille de calcul (que j'aie ou non inclus {NUMLOCK} dans ma dernière déclaration SendKeys).
Je ne vais pas entrer dans les détails de mes propres variables, mais le fait est que pour construire un programme/macro qui maintiendra votre verrouillage numérique de manière cohérente, vous devez d'abord Tester pour voir si le verrouillage numérique IS ON OR OFF, puis exécutez le code en fonction de la condition actuelle. 

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const kNumlock = 144

Public Function NumLock() As Boolean
    NumLock = KeyState(kNumlock)
    If (NumLock = True) Then
        MsgBox ("Num lock was off. Will turn back on now...")
        SendKeys "{NUMLOCK}", True
    Else: MsgBox ("Num Lock stayed on")
    End If
End Function

Private Function KeyState(lKey As Long) As Boolean
    KeyState = CBool(GetKeyState(lKey))
End Function


Sub myMainMethod()
    'do a function here that includes .SendKeys
    Call NumLock
End Sub

Cet exemple de programme vous donnera un message de confirmation indiquant si le verrouillage numérique est activé ou non, et l'activera s'il est désactivé. 

1
technoman23

La fonction SendKeys () intégrée à VBA a vraiment un effet secondaire qui provoque la désactivation de NumLock. Mais vous pouvez utiliser une solution de contournement et appeler une autre implémentation de la même fonction faisant partie du composant WSCRIPT (composant du système d'exploitation Windows). L'exemple de code suivant montre comment une référence à ce composant peut être faite, puis sa méthode appelée:

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^g", True

De cette façon, vous obtenez la même fonctionnalité (appelez le raccourci clavier Ctrl-G dans l'exemple), mais il n'y a aucun problème avec NumLock dans ce cas.

0
Petr Michl

SendKeys "^{HOME}", True éteignait le num lock alors je viens de répéter la commande et il la rallume:

SendKeys "^{HOME}", True
SendKeys "^{HOME}", True
0
user6772440