如果Form1关注,则保存文件将被取消

Private Sub Workbook_BeforeSave... MsgBox "Why" 

如果Form1重点 – MsgBox不出现。 保存程序被取消。
请不要告诉我,最终用户必须在表单外单击来保存文件。
Form1不是模态的。

请在表单上放置文本框,将光标置于其中,或者只需单击表单标题。 然后按Ctrl + S,看是否出现MsgBox。 – Alegro 49分钟前

在这种情况下,只需将此代码粘贴到您的用户窗体中即可。 这个代码稍微修改了我的其他答案 。

代码(试验和testing)

 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