在不暂停应用程序的情况下使用MsgBox

19

我需要向用户显示一条信息。当我使用MsgBox时,程序会停止直到用户关闭弹窗。我想知道是否有一种方法可以在不暂停程序的情况下打开MsgBox


2
不,MsgBox总是会暂停执行直到被点击。 - Jean-François Corbett
1
这个标题应该更新以反映MsgBox不是您问题的要求。我来到这里遇到一个问题,无法使用“Application.Statusbar”来与用户通信,因为Excel已经将其用于其他用途。 - Jay Killeen
8个回答

31

听起来你不希望从MsgBox中获取任何用户输入。在这种情况下,根据你的应用程序,StatusBar可能是一个适当的替代品。

在Excel中,这很容易实现:

Application.StatusBar = "Please be patient..."
Application.StatusBar = iDone & " of " & iTotal & " items done."
清除状态栏的方法如下:
Application.StatusBar = False

在Access中,语法有点更加复杂:

Temp = SysCmd(acSysCmdSetStatus, "Hey, look at me!") ' Puts out your message
Temp = SysCmd(acSysCmdClearStatus) ' Clears StatusBar

7
据我所知,你无法直接实现此功能。解决方法是创建一个自定义表单作为对话框。
请参见http://www.mvps.org/access/forms/frm0046.htm(虽然不完全回答了你的问题,但仍然适用)。

6

MsgBox是模态的(意味着窗口会弹出并暂停代码的执行,直到它被清除)。正如其他发布者/评论者所提到的-你的替代方案是编写自己的非模态弹出版本。除非你真的需要这样做,否则不值得花费这种努力。


1
这是不正确的。Msgbox 是模态对话框;对话框是阻止代码执行的东西。只有使用 acDialog 打开的表单和实际的对话框(如 MsgBox、FileDialog 等)才会阻止代码执行。可以制作模态或弹出式表单,但它们都不会阻止代码执行。 - usncahill

5
在VB编辑器中:选择插入菜单用户窗体。 在工具箱中选择文本框:在用户窗体中拖动一个矩形并在其中输入文本。 右键单击用户窗体,选择属性。 在ShowModal属性中:选择False。 在你的VBA模块中输入UserForm1.Show在你想要打开它的地方和UserForm1.Hide在你想要关闭它的地方。 UserForm1是我的,当然,使用你创建的表单的适当名称。

4
创建一个表单代替。我创建了一个小表单,只有一个文本框,上面写着“正在工作,请稍候”。需要时,我会打开这个表单作为弹出窗口(docmd openform "表单名称"),通常是在开始某些需要一定时间完成的操作之前。当工作完成后,我关闭表单(docmd close acform "表单名称")。这不会停止程序,但会向用户提供一个“消息”。

2

我认为这个选项不允许代码按照用户的需求继续运行。就我测试来看,它是一个模态窗口,就像MsgBox一样(至少对于VBA/Excel)。 - Tiago Cardoso
@TiagoCardoso 它确实会暂停代码的运行,但与msgbox不同的是,它允许用户在Excel(或其他软件)中切换到不同的选项卡、工作表、窗体等——这可能正是OP真正想要的。另一个优点是它允许显示更大的消息。 - Yin Cognyto

1

我相信你首先需要评估一下是否真的需要一个弹出式消息框来保持你的代码运行。

如已经提到的,消息框功能是模态的,你无法“绕过”它。但是,你可以创建一个类似于消息框的表单,将此表单设置为“非模态”,并调用显示此表单的代码。代码工作流程继续进行。在Excel中测试并可行。


1
你可以使用这个方法。我用它创建了一个Outlook对话框:
Dim myMessage as String  
Dim myDelay as Integer  
myMessage = "This message will self destruct in 8 seconds!"  
myDelay = 8  
Shell "msg /TIME:" & myDelay & " " & Environ("Username") & " " & myMessage  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接