Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA代码不';当光标停留在更新后的Excel单元格时,无法运行_Excel_Vba - Fatal编程技术网

VBA代码不';当光标停留在更新后的Excel单元格时,无法运行

VBA代码不';当光标停留在更新后的Excel单元格时,无法运行,excel,vba,Excel,Vba,我想在打开Excel工作簿20秒后显示一条消息。代码是: //ThisWorkbook Private Sub Workbook_Open() SetTimer End Sub //Module1 Public Sub SetTimer() Application.OnTime Now + TimeValue("00:00:20"), "ShowMsg" End Sub Public Sub ShowMsg() MsgBox ("my message") End Su

我想在打开Excel工作簿20秒后显示一条消息。代码是:

//ThisWorkbook
Private Sub Workbook_Open()
    SetTimer
End Sub

//Module1
Public Sub SetTimer()
    Application.OnTime Now + TimeValue("00:00:20"), "ShowMsg"
End Sub

Public Sub ShowMsg()
    MsgBox ("my message")
End Sub
正如您所看到的,代码非常简单,当用户不更新工作表或离开更新/聚焦的单元格时,代码可以工作。但是,如果光标停留在单元格上,则消息将永远不会显示。当单元格有焦点或正在更新时,控件不会返回到VBA代码。对这个问题有什么想法吗?谢谢

这里有一个解决方法:

Sub main()

    Dim start As Single

    start = Timer

    Do
        DoEvents
    Loop Until Timer > (start + 20) '20 seconds
    MsgBox "hello"

End Sub
编辑。进一步问题代码:

在名为Module1的模块中,输入以下代码:

Public start As Single

Sub main2()

    start = Timer

    Do
        DoEvents
    Loop Until Timer > (start + 20) '20 seconds
    MsgBox "hello"

End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Module1.start = Module1.start + 5
End Sub
在ThisWorkbook对象中(在项目资源管理器的对象列表中双击ThisWorkbook),输入以下代码:

Public start As Single

Sub main2()

    start = Timer

    Do
        DoEvents
    Loop Until Timer > (start + 20) '20 seconds
    MsgBox "hello"

End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Module1.start = Module1.start + 5
End Sub

每次更改工作簿中任何工作表中的任何单元格时,都会在计时器中再添加五秒钟。

在运行期间,您将无法运行任何其他VBA代码,我不认为。很好-我一直认为,一旦用户处于编辑模式,VBA就会被阻止-显然不是这样。。。其他VBA代码将与计时器循环“并行”运行—测试了一个简单的messagebox和一个工作表事件。我当时正在从EnumWindows进行回调(是的,我知道,有点狡猾),我想Windows可能会劫持我的函数并在自己的进程中运行它(也许这突出了我对这些事情的无知)。无论如何,它似乎在回调中起作用,所以我在回调之外尝试了一下,结果很好。才华横溢:)@Tim Williams我很惊讶事件中断了运行的代码,很有趣!我们是否可以在用户每次更新单元格时推迟hello消息。我试图通过在每次单元格更改后更新开始时间来做到这一点。但它不起作用。有什么想法吗?@Bob我已经更新了我的答案。我可以问一下,你是不是在做一些搞笑的“继续工作”的提醒?