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
これはMicrosoft VBAのバグです。しかし、回避策があります。
使用する F8 マクロを実行し、それがオフになっている場所を見つけます。通常はSendKeys
の後にあります。
次に、行の後にSendkeys "{NUMLOCK}", True
を追加して、効果を逆にします。
見つからない場合は、最後に追加するだけで終了します。うまくいけば、表示/非表示プロセス中に追加した場合、機能します。
これは:
Sendkeys "any key", False
2番目のパラメーターとしてFalse
の代わりにTrue
を使用します。
同様の問題があり、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キーを送信するだけです。
この行が私の問題を引き起こしました:
Application.SendKeys "%s"
これに変更することで解決:
Application.SendKeys "{NUMLOCK}%s"
文字列の最初と最後に{NUMLOCK}
を追加しても違いはありません。
SendKeysステートメントの直後に、次の2行を追加します。
DoEvents
SendKeys "{NUMLOCK}{NUMLOCK}"
コードで最後の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がオンかオフかを確認するメッセージを表示し、オフの場合はオンにします。
組み込みのVBAであるSendKeys()関数には、NumLockを非アクティブ化する副作用があります。ただし、回避策を使用して、WSCRIPTコンポーネント(Windowsオペレーティングシステムの一部)の一部である同じ関数の別の実装を呼び出すことができます。次のサンプルコードは、このコンポーネントへの参照を作成し、そのメソッドを呼び出す方法を示しています。
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^g", True
これにより、同じ機能(例ではCtrl-Gキーボードショートカットを呼び出す)が得られますが、この場合はNumLockに問題はありません。
多くの解決策を試した後。最も確かなのは以下のリンクにあるようです。モジュールに貼り付けます。
SendKeys "^{HOME}", True
をオフにしていました num lock だから私はコマンドを繰り返しただけで、再びオンになりました:
SendKeys "^{HOME}", True
SendKeys "^{HOME}", True