Access小僧:CapsLock, NumLock, IMEモードを設定 [コンピューター]
Accessのフォームのテキストボックスがフォーカス取得したら、
・CapsLock:OFF
・NumLock:ON
・IMEモード:半角英数、または、全角ひらがな
に設定するVBAを作ってみました。
【フォームのクラスオブジェクト】
Private Sub myYear1_GotFocus()
'【機能】フォーカス取得後、IMEModeを設定、NumLockをON、CapsLockをOFF
'【変数】
Dim Name1 As String ' 名前
Dim Obj1 As Object ' オブジェクト
'【実行コード】
Name1 = Me.ActiveControl.Name ' アクティブなコントロールの名前
Debug.Print "Name1=" & Name1 & " [myYear1_GotFocus]"
Set Obj1 = Me.myYear1 ' このコントロールのオブジェクト
Debug.Print "Obj1.Name=" & Obj1.Name & " [myYear1_GotFocus]"
Call mySChkKey1(Name1, Obj1, acImeModeAlpha) ' IMEMode(半角英数)を設定、NumLockをON、CapsLockをOFF
Set Obj1 = Nothing ' オブジェクト変数を解放
End Sub
注1:IMEモードを全角ひらがなにする場合は、mySChkKey1の第3引数をacImeModeHiraganaにする。
注2:myYear1がテキストボックスの名前
【標準モジュールの先頭】
標準モジュールの先頭にWindows APIを呼び出すための記述をする。
#If VBA7 And Win64 Then
' 64bit (PtrSafeが無いとエラーになる)
Declare PtrSafe Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
#Else
' 32bit
Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
【標準モジュール】
Public Sub mySChkKey1(Name1 As String, Obj1 As Object, myIMEMode1 As Integer)
'【機能】NumLockキーがOFFだったら、ONにする
'【引数】
' Name1:アクティブなコントロールの名前
' Obj1:呼び出し側のコントロールのオブジェクト
' myIMEMode1:IMEMode(半角英数とか)
'【変数】
Dim nKey As Integer ' NumLockキーの状態
Dim Name2 As String ' 名前
'【実行コード】
' 呼び出し側のコントロールとアクティブなコントロールが不一致の場合は終了
Name2 = Obj1.Name
Debug.Print "Name1=" & Name1 & " [mySChkKey1]"
Debug.Print "Name2=" & Name2 & " [mySChkKey1]"
If Name1 <> Name2 Then
Exit Sub
End If
' IMEモードの設定
Debug.Print "myIMEMode1=" & myIMEMode1 & " [mySChkKey1]"
Obj1.IMEMode = myIMEMode1
Obj1.IMEHold = False
' NumLockキーの確認、設定
nKey = GetKeyState(vbKeyNumlock) And 1 ' NumLockキーの状態
Debug.Print "nKey(NumLock)=" & nKey & " [mySChkKey1]"
' NumLock : OFF -> ON
If nKey = 0 Then
Call mySendKeys1("{NUMLOCK}", False)
End If
' Sleepは、特に意味ない
Sleep 1
' CapsLockキーの確認、設定
nKey = GetKeyState(vbKeyCapital) And 1 ' CapsLockキーの状態
Debug.Print "nKey(CapsLock)=" & nKey & " [mySChkKey1]"
' CapsLock : ON->OFF
If nKey = 1 Then
Call mySendKeys1("{CAPSLOCK}", False)
End If
End Sub
Public Sub mySendKeys1(Keys As String, Optional Wait As Boolean = False)
'【機能】キー操作を疑似的に起こす
'【変数】
Static wshShell As Object ' Static変数はファイルを閉じるまで値が残る
'【実行コード】
If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
Call wshShell.SendKeys(Keys, Wait)
End Sub
【参考】
・キーボードの状態を取得 : Access
・VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 - Office 2010,2013
・VBAのキーコード一覧
・VBAで疑似的にキーボード入力を行う(SendKeys)
・【Access】テキストボックスのIMEモードを切り替える
・CapsLock:OFF
・NumLock:ON
・IMEモード:半角英数、または、全角ひらがな
に設定するVBAを作ってみました。
【フォームのクラスオブジェクト】
Private Sub myYear1_GotFocus()
'【機能】フォーカス取得後、IMEModeを設定、NumLockをON、CapsLockをOFF
'【変数】
Dim Name1 As String ' 名前
Dim Obj1 As Object ' オブジェクト
'【実行コード】
Name1 = Me.ActiveControl.Name ' アクティブなコントロールの名前
Debug.Print "Name1=" & Name1 & " [myYear1_GotFocus]"
Set Obj1 = Me.myYear1 ' このコントロールのオブジェクト
Debug.Print "Obj1.Name=" & Obj1.Name & " [myYear1_GotFocus]"
Call mySChkKey1(Name1, Obj1, acImeModeAlpha) ' IMEMode(半角英数)を設定、NumLockをON、CapsLockをOFF
Set Obj1 = Nothing ' オブジェクト変数を解放
End Sub
注1:IMEモードを全角ひらがなにする場合は、mySChkKey1の第3引数をacImeModeHiraganaにする。
注2:myYear1がテキストボックスの名前
【標準モジュールの先頭】
標準モジュールの先頭にWindows APIを呼び出すための記述をする。
#If VBA7 And Win64 Then
' 64bit (PtrSafeが無いとエラーになる)
Declare PtrSafe Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)
#Else
' 32bit
Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
【標準モジュール】
Public Sub mySChkKey1(Name1 As String, Obj1 As Object, myIMEMode1 As Integer)
'【機能】NumLockキーがOFFだったら、ONにする
'【引数】
' Name1:アクティブなコントロールの名前
' Obj1:呼び出し側のコントロールのオブジェクト
' myIMEMode1:IMEMode(半角英数とか)
'【変数】
Dim nKey As Integer ' NumLockキーの状態
Dim Name2 As String ' 名前
'【実行コード】
' 呼び出し側のコントロールとアクティブなコントロールが不一致の場合は終了
Name2 = Obj1.Name
Debug.Print "Name1=" & Name1 & " [mySChkKey1]"
Debug.Print "Name2=" & Name2 & " [mySChkKey1]"
If Name1 <> Name2 Then
Exit Sub
End If
' IMEモードの設定
Debug.Print "myIMEMode1=" & myIMEMode1 & " [mySChkKey1]"
Obj1.IMEMode = myIMEMode1
Obj1.IMEHold = False
' NumLockキーの確認、設定
nKey = GetKeyState(vbKeyNumlock) And 1 ' NumLockキーの状態
Debug.Print "nKey(NumLock)=" & nKey & " [mySChkKey1]"
' NumLock : OFF -> ON
If nKey = 0 Then
Call mySendKeys1("{NUMLOCK}", False)
End If
' Sleepは、特に意味ない
Sleep 1
' CapsLockキーの確認、設定
nKey = GetKeyState(vbKeyCapital) And 1 ' CapsLockキーの状態
Debug.Print "nKey(CapsLock)=" & nKey & " [mySChkKey1]"
' CapsLock : ON->OFF
If nKey = 1 Then
Call mySendKeys1("{CAPSLOCK}", False)
End If
End Sub
Public Sub mySendKeys1(Keys As String, Optional Wait As Boolean = False)
'【機能】キー操作を疑似的に起こす
'【変数】
Static wshShell As Object ' Static変数はファイルを閉じるまで値が残る
'【実行コード】
If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
Call wshShell.SendKeys(Keys, Wait)
End Sub
【参考】
・キーボードの状態を取得 : Access
・VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 - Office 2010,2013
・VBAのキーコード一覧
・VBAで疑似的にキーボード入力を行う(SendKeys)
・【Access】テキストボックスのIMEモードを切り替える
ヤバイぜ、ありがとうございます。
by cheese999 (2023-10-13 12:17)