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
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.
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.
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.
Ceci est causé par:
Sendkeys "any key", False
Au lieu de False
comme second paramètre, utilisez True
.
Juste après votre déclaration SendKeys, ajoutez ces 2 lignes:
DoEvents
SendKeys "{NUMLOCK}{NUMLOCK}"
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é.
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.
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