web-dev-qa-db-de.com

SendKeys spielt mit meinem NumLock-Schlüssel über VBA-Code im Access-Formular

Ich habe den folgenden Code für ein Access-Formular. Es sieht so aus, als würde der SendKeys mit my in Konflikt geraten NumLock Drücken Sie die Taste, indem Sie sie beim Öffnen und Schließen des Formulars ein- und ausschalten.

Aus absolut gültigen Gründen, auf die ich nicht eingehen möchte, möchte ich das Menüband wirklich nicht vollständig verbergen (ich möchte, dass die Pulldown-Menüs weiterhin zugänglich sind), daher ist der Befehl DoCmd.ShowToolbar nicht meine bevorzugte Methode.

Hat jemand Vorschläge, wie ich den folgenden Code ändern kann, um mit dem Befehl SendKeys die gewünschten Ergebnisse zu erzielen?

Mit Access 2007 also den Befehl

CommandBars.ExecuteMso "MinimizeRibbon"

steht mir nicht zur Verfügung.

Die Datenbank wird übrigens verteilt, sodass die Lösung in der Datenbank enthalten sein muss.

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

Es ist ein Fehler in Microsoft VBA. Es gibt jedoch eine Problemumgehung.

Benutzen F8 um das Makro zu durchlaufen und herauszufinden, wo es sich abschaltet. Es ist normalerweise nach einem SendKeys.

Fügen Sie anschließend nach der Zeile einen Sendkeys "{NUMLOCK}", True ein, um den Effekt umzukehren.

Wenn Sie es nicht finden können, fügen Sie es einfach am Ende hinzu. Wenn es fertig ist, kehrt es zurück. Wenn Sie es während des Ein-/Ausblenden-Vorgangs hinzufügen, funktioniert es hoffentlich.

14
icebird76

Ich hatte ein ähnliches Problem und fand eine Lösung in einem vba-Forum. Anstelle von fehlerhaften Sendkeys können Sie kyes so simulieren.

    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

Weitere Tasten finden Sie hier vba forum Diese "PreviousTab" -Funktion sendet einfach die Strg + Shift + F6-Taste.

4
BTjacker

Diese Zeile hat mein Problem verursacht:

Application.SendKeys "%s"

Gelöst, indem Sie dies ändern:

Application.SendKeys "{NUMLOCK}%s"

Es gibt keinen Unterschied zwischen dem Hinzufügen von {NUMLOCK} am Anfang oder Ende der Zeichenfolge.

3
RodB

Dies wird verursacht durch:

Sendkeys "any key", False

Verwenden Sie anstelle von False als zweiten Parameter True.

2
omari

Direkt nach Ihrer SendKeys-Anweisung fügen Sie diese beiden Zeilen hinzu:

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

Wenn Sie einen abschließenden sendKeys-Befehl in Ihrem Code ausführen, kann das Hinzufügen von {NUMLOCK} zu der Anweisung den Trick ausführen, wie von RodB und iceBird76 angegeben. Dies ist jedoch keine gute Codierungspraxis, und hier ist der Grund: Wenn sich beim Ausführen des Makros etwas von einem zum anderen ändert, funktioniert es möglicherweise nicht. Ich weiß das, weil ich selbst ein ähnliches Problem hatte. Wenn ich am Ende meines Programms einen sendKeys-Befehl ausführen würde, blieb die Num-Taste manchmal eingeschaltet, aber manchmal blieb sie ausgeschaltet, nur abhängig von bestimmten Variablen in meiner Tabelle (unabhängig davon, ob ich {NUMLOCK} in das Verzeichnis aufgenommen habe oder nicht meine letzte SendKeys-Anweisung).
Ich werde mich nicht mit den Details meiner eigenen Variablen befassen, aber um ein Programm/Makro zu erstellen, das Ihre Num-Sperre dauerhaft aufrechterhält, müssen Sie den ERSTEN TEST ÜBERPRÜFEN, WENN DIE NUM-LOCK IS ON OR OFF, dann Code basierend auf dem aktuellen Zustand ausführen. 

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

In diesem Beispielprogramm erhalten Sie eine Bestätigungsmeldung, ob die Num-Sperre ein- oder ausgeschaltet ist, und aktiviert sie, wenn sie deaktiviert ist. 

1
technoman23

Die SendKeys () - Funktion, die in VBA integriert ist, hat einen Nebeneffekt, der dazu führt, dass NumLock deaktiviert wird. Sie können jedoch eine Problemumgehung verwenden und eine andere Implementierung derselben Funktion aufrufen, die Teil der Komponente WSCRIPT ist (Teil des Windows-Betriebssystems). Der folgende Beispielcode zeigt, wie ein Verweis auf diese Komponente hergestellt und die Methode aufgerufen werden kann:

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

Auf diese Weise erhalten Sie dieselbe Funktionalität (Aufruf der Tastenkombination Strg-G im Beispiel), aber in diesem Fall gibt es kein Problem mit NumLock.

0
Petr Michl

Nachdem ich viele Lösungen ausprobiert habe. Die solide scheint auf dem Link unten zu sein. Fügen Sie es in ein Modul ein.

http://access.mvps.org/access/api/api0046.htm

0
user6788933

SendKeys "^{HOME}", True hat das ausgeschaltet num lock Deshalb habe ich den Befehl wiederholt und er wird wieder aktiviert:

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