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

问题描述 投票:0回答:3

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

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

消息框会阻止所有内容,不允许用户更改选项卡或单击其他任何内容。我还尝试创建一个 UserForm 并将其

ShowModal
设置为 False。这允许用户在显示表单时与电子表格进行交互,但也允许在表单仍然显示时继续执行代码/无需等待答案,例如,在下面的代码中,在用户表单显示后立即显示消息框显示。

UserForm.Show
MsgBox("Step 2")

我需要消息框仅在用户窗体退出时显示。我怎样才能实现这个目标?

excel vba userform msgbox
3个回答
1
投票

终于找到解决办法了。显示用户表单后,您可以使用 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")

0
投票

不是一个精确的解决方案,但您可以将

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

0
投票

我在用户表单方面取得了良好的效果。诀窍是将 userform.show 放在子例程的末尾。代码在 .show 之后继续运行,但仅到子例程结束。然后,它会挂起,并启用用户窗体,并且全局变量和类变量值仍然完好无损。用户窗体按钮的代码调用另一个重新启动代码的子例程。将用户表单设置为启用并将显示模式设置为 false。

© www.soinside.com 2019 - 2024. All rights reserved.