Excel 如果Form1处于焦点状态,则取消保存文件

Excel 如果Form1处于焦点状态,则取消保存文件,excel,vba,Excel,Vba,如果Form1已聚焦-MsgBox不会出现。已取消保存过程。 请不要告诉我最终用户必须在表单外单击才能保存文件。 Form1不是模态的 请在表单上放置文本框,将光标放在其中,或者 单击表单标题。然后按Ctrl+S,查看是否显示MsgBox 或者不是阿莱格罗49分钟前 在这种情况下,只需将此代码粘贴到用户表单中即可。这段代码与我的另一段代码略有不同 代码(经过尝试和测试): Private Sub Workbook_BeforeSave... MsgBox "Why" 屏幕截图: Priva

如果Form1已聚焦-MsgBox不会出现。已取消保存过程。
请不要告诉我最终用户必须在表单外单击才能保存文件。
Form1不是模态的

请在表单上放置文本框,将光标放在其中,或者 单击表单标题。然后按Ctrl+S,查看是否显示MsgBox 或者不是阿莱格罗49分钟前

在这种情况下,只需将此代码粘贴到用户表单中即可。这段代码与我的另一段代码略有不同

代码(经过尝试和测试)

Private Sub Workbook_BeforeSave...  
MsgBox "Why"
屏幕截图

Private Sub Workbook_BeforeSave...  
MsgBox "Why"

注意:这不是一个简单的方法,因为用户可能会按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, 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
私有声明函数GetKeyboardState_
Lib“user32”(pbKeyState作为字节)的长度
私有Myarray(255)作为字节
Dim Cntrl_键为布尔值,Vletter_键为布尔值
将其他字母设置为布尔值
私有子文本框1u KeyDown(ByVal键码为MSForms.ReturnInteger_
ByVal移位为整数)
如果KeyCode=17,则Cntrl_Key=True
如果KeyCode=83,则Vletter_Key=True
如果钥匙代码83和钥匙代码17,则
其他字母=真
如果结束
呼叫显示键
端接头
私有子RefreshKeyState(RefreshState为布尔值)
如果刷新状态,则
调用GetKeyboardState(Myarray(0))
如果结束
端接头
私有子ShowKey()
“~~>检查Ctrl+S
如果Cntrl_Key=True,而OtherLetter=True,则
Cntrl_Key=False
ElseIf Cntrl_Key=True,Vletter_Key=True,则
“~~>保存工作簿
活动工作簿。保存
Cntrl_Key=False
Vletter_Key=False
如果结束
端接头

如何启动保存过程?使用干净的工作簿、新表单、
此工作簿进行了测试。表单上的“保存”按钮和给定的代码->有效。@Jook,请在表单上放置一个文本框,将光标放在其中,或只需单击表单标题。然后按Ctrl+S,查看MsgBox是否出现。Siddharth,感谢您的解决方案和努力。我真的很惊讶,我必须为这样一件小事编写所有这些代码,比如-Ctrl S。有没有合理的解释,为什么Microsoft不希望在窗体处于焦点状态时保存文件?当按Ctrl+S时,指令将发送到活动窗口。现在,如何解释指令取决于活动窗口。当窗体或文本框处于活动状态时,Ctrl+S对其没有任何意义,因此它不会执行任何操作。是的,我理解,但是,无论光标在哪里,Ctrl+S都应该是Ctrl+S。明天早上,我可能会发现,如果我的鼠标在左边,而不是在右边,我必须写一个额外的代码。这是因为从第一天起,你就被告知全局接受保存的快捷键是Ctrl+S。但不幸的是,用户窗体或活动文本框不知道:)