Private Sub Workbook_BeforeSave...
MsgBox "Why"
Form1にフォーカスがある場合、MsgBoxは表示されません。保存手順はキャンセルされます。
エンドユーザーがファイルを保存するためにフォームの外側をクリックする必要があるとは言わないでください。
Form1はモーダルではありません。
フォームにテキストボックスを配置するか、フォーム内にカーソルを置くか、フォームヘッダーをクリックしてください。次に、Ctrl + Sを押して、MsgBoxが表示されるかどうかを確認します。–アレグロ49分前
このような場合は、このコードをユーザーフォームに貼り付けるだけです。このコードは、他の回答から少し変更されています。
コード(試行およびテスト済み):
Private Declare Function GetKeyboardState _
Lib "user32" (pbKeyState As Byte) As Long
Private Myarray(255) As Byte
Dim Cntrl_Key As Boolean, Sletter_Key As Boolean
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
If KeyCode = 17 Then Cntrl_Key = True
If KeyCode = 83 Then Sletter_Key = True
Call ShowKey
End Sub
Private Sub RefreshKeyState(RefreshState As Boolean)
If RefreshState Then
Call GetKeyboardState(Myarray(0))
End If
End Sub
Private Sub ShowKey()
'~~> Check for Ctrl + S
If Cntrl_Key = True And Sletter_Key = True Then
'~~> Save Workbook
ActiveWorkbook.Save
Cntrl_Key = False
Sletter_Key = False
End If
End Sub
スクリーンショット:
注CTRL:ユーザーが何かを押してから入力してから「S」キーを押すと、コードが実行されるため、これは絶対確実な方法ではありません。CTRL押された後に次に押されたキーが押されたかどうかを確認するための小さなチェックを含めることができますS。そうでない場合は、もう一度falseに設定します...たとえば
Private Declare Function GetKeyboardState _
Lib "user32" (pbKeyState As Byte) As Long
Private Myarray(255) As Byte
Dim Cntrl_Key As Boolean, Vletter_Key As Boolean
Dim OtherLetter As Boolean
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
If KeyCode = 17 Then Cntrl_Key = True
If KeyCode = 83 Then Vletter_Key = True
If KeyCode <> 83 And KeyCode <> 17 Then
OtherLetter = True
End If
Call ShowKey
End Sub
Private Sub RefreshKeyState(RefreshState As Boolean)
If RefreshState Then
Call GetKeyboardState(Myarray(0))
End If
End Sub
Private Sub ShowKey()
'~~> Check for Ctrl + S
If Cntrl_Key = True And OtherLetter = True Then
Cntrl_Key = False
ElseIf Cntrl_Key = True And Vletter_Key = True Then
'~~> Save Workbook
ActiveWorkbook.Save
Cntrl_Key = False
Vletter_Key = False
End If
End Sub