我有一个消息框,要求用户输入“是”或“否”,但需要让用户有机会交叉检查另一个选项卡(如果他们的猜测正确),例如
answer = MsgBox("Confirm Deletion?", vbYesNo + vbQuestion)
If answer = vbNo Then
Exit Sub
End If
消息框会阻止所有内容,不允许用户更改选项卡或单击其他任何内容。我还尝试创建一个 UserForm 并将其
ShowModal
设置为 False。这允许用户在显示表单时与电子表格进行交互,但也允许在表单仍然显示时继续执行代码/无需等待答案,例如,在下面的代码中,在用户表单显示后立即显示消息框显示。
UserForm.Show
MsgBox("Step 2")
我需要消息框仅在用户窗体退出时显示。我怎样才能实现这个目标?
终于找到解决办法了。显示用户表单后,您可以使用 Windows API 再次启用窗口交互。表单的
ShowModal
属性最初应为 True
,这无论如何都是默认值。
然后在用户表单代码窗口中,将此代码包含在顶部,当表单显示时会触发该代码。
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")
不是一个精确的解决方案,但您可以将
Msgbox
替换为 Inputbox
和某种停止代码,以防止进一步执行,直到收到用户的输入。以下代码删除用户已选择其中一个单元格的工作表。
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
我在用户表单方面取得了良好的效果。诀窍是将 userform.show 放在子例程的末尾。代码在 .show 之后继续运行,但仅到子例程结束。然后,它会挂起,并启用用户窗体,并且全局变量和类变量值仍然完好无损。用户窗体按钮的代码调用另一个重新启动代码的子例程。将用户表单设置为启用并将显示模式设置为 false。