使用弹出消息窗口编辑工作表

时间:2015-08-27 13:23:46

标签: excel-vba vba excel

我正在使用以下宏打开一个弹出消息框,提取特定的单元格值。消息框打开时,我无法编辑工作表。当我将鼠标指针移离消息框时,它会转到一个旋转的圆圈。如何打开我的消息框,让它保持打开状态并编辑下面的工作表?

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 

2 个答案:

答案 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函数有四个参数:

  • hWnd 是拥有此消息框的窗口的特殊标识符,诀窍是使用&H0传入null,以便没有窗口拥有它
  • lpText 是要显示的消息(与VBA MsgBox功能的提示参数相同)
  • lpCaption 是要显示为标题的文本(与VBA MsgBox函数的title参数相同)
  • wType 是将显示的消息框的类型(与VBA MsgBox功能的按钮参数相同)

您可以阅读更多here

答案 1 :(得分:3)

不幸的是,消息框是模态的 - 所以他们会把焦点放在被解雇之前。

解决此问题的方法是创建一个可用作消息框的自定义用户窗体。用户表单上有一个选项可以使它们成为非模态的 - 这将允许您在打开时继续执行其他操作。

我希望这有助于