web-dev-qa-db-ja.com

SendKeysがAccessフォームのVBAコードを介してNumLockキーを乱用している

Accessフォーム用に次のコードがあります。 SendKeysが私を混乱させているように見えます NumLock フォームを開いたり閉じたりするときに、キーのオンとオフを切り替えます。

入りたくない完全に正当な理由から、リボンを完全に非表示にしたくない(プルダウンメニューにアクセスできるようにしたい)ので、DoCmd.ShowToolbarコマンドは私の好みの方法ではありません。

以下のコードを変更して、SendKeysコマンドを使用してやりたいことを達成する方法について誰かが何か提案はありますか?

Access 2007を使用して、コマンド

CommandBars.ExecuteMso "MinimizeRibbon"

私は利用できません。

ちなみに、データベースは分散しているので、ソリューションはデータベース内に収める必要があります。

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
15
user12059

これはMicrosoft VBAのバグです。しかし、回避策があります。

使用する F8 マクロを実行し、それがオフになっている場所を見つけます。通常はSendKeysの後にあります。

次に、行の後にSendkeys "{NUMLOCK}", Trueを追加して、効果を逆にします。

見つからない場合は、最後に追加するだけで終了します。うまくいけば、表示/非表示プロセス中に追加した場合、機能します。

14
icebird76

これは:

Sendkeys "any key", False

2番目のパラメーターとしてFalseの代わりにTrueを使用します。

4
omari

同様の問題があり、vbaフォーラムで解決策を見つけました。バギーなSendkeysの代わりに、このようなkyesをシミュレートできます。

    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

他のキーはここにあります vba forum この「previousTab」関数は、Ctrl + Shift + F6キーを送信するだけです。

4
BTjacker

この行が私の問題を引き起こしました:

Application.SendKeys "%s"

これに変更することで解決:

Application.SendKeys "{NUMLOCK}%s"

文字列の最初と最後に{NUMLOCK}を追加しても違いはありません。

3
RodB

SendKeysステートメントの直後に、次の2行を追加します。

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

コードで最後のsendKeysコマンドを実行するときに、{NUMLOCK}をステートメントに追加すると、RodBとiceBird76で指摘されているように、うまくいく場合があります。ただし、これは適切なコーディング方法ではありません。その理由は次のとおりです。マクロを実行するときに何かが異なると、機能しない場合があります。私自身も同様の問題を経験していたので、これを知っています。プログラムの最後にsendKeysコマンドを実行すると、Num Lockがオンのままになることもありますが、スプレッドシートの特定の変数に応じてオフになることもあります({NUMLOCK}が含まれているかどうかに関係なく私の最後のSendKeysステートメント)。
私は自分の変数の詳細には触れませんが、ポイントは、Num Lockを一貫してオンに保つプログラム/マクロを構築するために、NUM LOCK =かどうかを確認するために最初にテストする必要があることですIS ON OR OFFの場合、現在の状態に基づいてコードを実行します。

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

このサンプルプログラムは、Num Lockがオンかオフかを確認するメッセージを表示し、オフの場合はオンにします。

1
technoman23

組み込みのVBAであるSendKeys()関数には、NumLockを非アクティブ化する副作用があります。ただし、回避策を使用して、WSCRIPTコンポーネント(Windowsオペレーティングシステムの一部)の一部である同じ関数の別の実装を呼び出すことができます。次のサンプルコードは、このコンポーネントへの参照を作成し、そのメソッドを呼び出す方法を示しています。

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

これにより、同じ機能(例ではCtrl-Gキーボードショートカットを呼び出す)が得られますが、この場合はNumLockに問題はありません。

1
Petr Michl

多くの解決策を試した後。最も確かなのは以下のリンクにあるようです。モジュールに貼り付けます。

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

0
user6788933

SendKeys "^{HOME}", Trueをオフにしていました num lock だから私はコマンドを繰り返しただけで、再びオンになりました:

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