我的简单MsgBox VBA暂停整个电子表格,除非我点击“确定”?

时间:2015-04-23 07:39:07

标签: excel vba excel-vba

请尽量简明扼要地向我承诺:

我有一个基本的交易电子表格,其中包含实时价格,如果价格超过我的目标入场价格,则单元格(例如AB4)显示文本“买入”。如果我拥有股票并且价格低于我的目标,则同一单元格显示“卖出”。无论哪种方式,电子表格也会自动发出订单来执行交易。

我想要的只是一个msgbox,提醒我在信号出现时做笔记。我只需要一个提醒,但我确实需要它,因为我总是忘记。

在这里阅读了很多过去的帖子后,这是我的第一次尝试:

Private Sub worksheet_calculate()
 If Range("AB4").value = "BUY" Or Range("AB4").value = "SELL" Then
  MsgBox ("Record Catalyst")
 End If
End Sub

似乎工作但是当我点击“确定”时,msgbox会立即重新出现。只要“买”或“卖”文字显示msgbox就不会消失,无论我点击它的次数。

所以我再次搜索并找到了一种让msgbox只出现一次的方法:

Private Sub worksheet_calculate()
If ActiveSheet.Range("BV4").Text = "Triggered" Then Exit Sub
  If Range("AB4").value = "BUY" Or Range("AB4").value = "SELL" Then
   MsgBox ("Record Catalyst")
ActiveSheet.Range("BV4") = "Triggered"
End If
End Sub

似乎工作魅力除了如果我没有点击“确定”使msgbox消失我的整个电子表格停止做任何事情(即价格不再更新,计算不再执行等)!它似乎在等我先点击爆破的“确定”。这是一个主要问题,因为如果我出现msgbox并且电子表格停止时我不在身边,那么如果我的投资组合中另一只股票的价格达到目标,电子表格甚至不会知道更不用说自动拍出订单了。 / p>

为什么这个简单的程序会阻止电子表格的运行?如何解决我原来的“简单”msgbox问题?我不想在电子表格上使用条件格式化路径,因为它已经混杂了太多有条件格式化的单元格。

谢谢大师!

2 个答案:

答案 0 :(得分:5)

似乎主要问题是MsgBox没有超时并且消失,因为消息只是提供信息。

使用下面的代码,Promped消息将在2秒内超时并允许子结束。

Private Sub worksheet_calculate()
    If ActiveSheet.Range("BV4").Text = "Triggered" Then Exit Sub
        If Range("AB4").Value = "BUY" Or Range("AB4").Value = "SELL" Then

            Set objShell = CreateObject("Wscript.Shell")

            intReturn = objShell.Popup("Record Catalyst", _
                2, , wshOk)

            If intReturn = 1 Then
                'do something if you click ok
            ElseIf intReturn = -1 Then
                'do something if times out alone, like record in a diff sheet
            End If

            ActiveSheet.Range("BV4") = "Triggered"

            Set objShell = Nothing

    End If
End Sub

希望这能解决您的问题。

答案 1 :(得分:1)

如果Windows Messenger程序服务正在运行(默认情况下,我已尝试使用的每台计算机),您可以自己使用Shell功能Msg。这与@ Miguel_Ryu的方法类似,但Shell将异步运行 - 它完全是非阻塞的。以下示例演示(显然您将要用您的Windows用户名替换'Comintern'):

Sub NonBlockingMessage()

    Dim i As Integer

    Shell "msg Comintern Look at me, I'm non-blocking!", vbHide

    For i = 1 To 10000
        Debug.Print i
    Next i

End Sub

您将看到弹出消息,然后在循环执行时看到数字滚动。这也具有以下优点:消息不限于代码的运行时。除非您使用/time:参数给出时间,否则它将一直停留在那里,直到你的代码在此期间完成为止。

更好的是,消息会叠加起来。如果您在不关闭第一条消息的情况下运行上面的测试代码两次,那么您仍将同时获得这两个消息。