Excel 中显示 UserForm 或 MsgBox 时如何允许用户与电子表格交互

How to allow user interaction with spreadsheet when UserForm or MsgBox is displayed in Excel

我有一个消息框要求用户输入“是”或“否”,但如果他们的猜测是正确的,则需要让用户有机会交叉检查另一个选项卡,例如

answer = MsgBox("Confirm Deletion?", vbYesNo + vbQuestion)
If answer = vbNo Then
    Exit Sub
End If

消息框会阻止所有内容,并且不允许用户更改选项卡或单击其他任何内容。我还尝试创建一个用户窗体并将其 ShowModal 设置为 False。这允许用户在显示表单时与电子表格进行交互,但它也允许代码执行在它仍然 displayed/without 等待答案时继续,例如在下面的代码中,消息框紧跟在显示用户窗体。

UserForm.Show
MsgBox("Step 2")

我需要消息框仅在用户窗体退出时显示。我怎样才能做到这一点?

不是一个精确的解决方案,但您可以将 Msgbox 替换为 Inputbox 并停止进一步执行代码,直到收到用户的输入。下面的代码删除了 sheet,其中用户选择了一个单元格。

Sub AlowDeletion()

    On Error Resume Next
      Set rng = Application.InputBox( _
      Title:="Range Selector", _
      Prompt:="Select any cell in the sheet you want to delete", _
      Type:=8)

      Application.DisplayAlerts = False
      ActiveWorkbook.Sheets(rng.Parent.Name).Delete
      Application.DisplayAlerts = True
    On Error GoTo 0

End Sub

终于找到解决办法了。显示用户表单后,您可以使用 windows api 再次启用 window 交互。表单的 ShowModal 属性 最初应该是 True,这是默认值。

然后在用户表单代码中 window 您将此代码包含在表单显示时触发的顶部。

Private Declare PtrSafe Function EnableWindow Lib "user32.dll" (ByVal Hwnd As Long, ByVal fEnable As Long) As Long

Private Sub UserForm_Activate()
EnableWindow Application.Hwnd, 1
End Sub

在下面的 运行 代码中,这允许用户在显示表单时仍然可以在电子表格中单击和移动,但不允许对单元格进行任何编辑,这是非常理想的。代码执行仅在窗体关闭后继续到消息框

UserForm.Show
MsgBox("Step 2")