我正在使用以下宏打开一个弹出消息框,提取特定的单元格值。消息框打开时,我无法编辑工作表。当我将鼠标指针移离消息框时,它会转到一个旋转的圆圈。如何打开我的消息框,让它保持打开状态并编辑下面的工作表?
Sub PopUp()
Dim vMsg
Dim r As Integer
For r = 4 To 16
vMsg = vMsg & Range("AD" & r).Value & Range("AE" & r).Value & Range("AF" & r).Value & Range("AG" & r).Value & Range("AH" & r).Value & Range("AI" & r).Value & Range("AJ" & r).Value & vbCrLf
Next
MsgBox vMsg, , "Values"
End Sub
答案 0 :(得分:4)
内置MsgBox
是模态的,这意味着在用户以某种方式解除消息框之前,您无法操作工作表。典型的解决方法似乎是创建您自己的自定义UserForm
以显示消息并使用UserForm1.Show vbModeless
进行调用,这将显示消息并允许用户仍然编辑工作表。
但是,除了创建自己的自定义UserForm
之外,还有另一种方法。您可以使用Windows API而不是VBA接口。
要做到这一点,首先将此代码添加到模块的顶部(在所有子例程和函数之前):
Private Declare Function MessageBox _
Lib "User32" Alias "MessageBoxA" _
(ByVal hWnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) _
As Long
上面的语法采用Windows API函数MessageBoxA
,并允许您通过调用MessageBox
(它是别名)来调用它。
然后,您可以更新PopUp
子例程以使用新的MessageBox
功能。
Sub PopUp()
Dim vMsg
Dim r As Integer
For r = 4 To 16
vMsg = vMsg & Range("AD" & r).Value & Range("AE" & r).Value & Range("AF" & r).Value & Range("AG" & r).Value & Range("AH" & r).Value & Range("AI" & r).Value & Range("AJ" & r).Value & vbCrLf
Next
MessageBox &H0, vMsg, "Values", vbOkayOnly
End Sub
这将允许用户在显示消息框时访问工作表。此外,该行:
MessageBox &H0, vMsg, "Values", vbOkayOnly
可以更改为
MessageBox &H0, vMsg, "Values", vbSystemModal
这将允许您访问工作表,但会始终将消息框保持在最顶层(它将对所有应用程序执行此操作,而不仅仅是Excel,但没有什么是完美的。)
MessageBox
函数有四个参数:
&H0
传入null,以便没有窗口拥有它您可以阅读更多here。
答案 1 :(得分:3)
不幸的是,消息框是模态的 - 所以他们会把焦点放在被解雇之前。
解决此问题的方法是创建一个可用作消息框的自定义用户窗体。用户表单上有一个选项可以使它们成为非模态的 - 这将允许您在打开时继续执行其他操作。
我希望这有助于