VBA UDF函数导致excel“无响应”

时间:2016-07-09 23:07:07

标签: excel vba excel-vba udf

我有一些非常简单的代码导致Excel崩溃。

我已经调试了代码中可以看到的变量,它们看起来很好,只是在几秒钟后,Now()不会改变而且waitTime不会改变 - 尽管时间彼此不同,即时间有没有向前移动(例如,现在可能会在3:00:05停留,而waitTime会在3:00:09停留)。

并且application.wait不会等待我要求的5秒钟。

细胞字体颜色也不会改变。

我不知道如何进一步调试。

在工作表“sheet1”中,我有以下单元格条目 -     在C8我有一个我手动更改的号码。在D8我有

=if(C8>25,"yup",startFlash(C8))

这很好用。它调用函数没有问题。这是宏代码:

Dim waitTime As Date, stopTime As Date


Function startFlash(x As String)
    Beep
    stopTime = TimeSerial(Hour(Now()), Minute(Now()) + 2, Second(Now()))
    Call sflash
    MsgBox "done"  
End Function

Sub sflash()

    Do While waitTime <= stopTime

        With Sheet1.Range("c8").Font
            If .ColorIndex = 3 Then
              .ColorIndex = 5
             Else
             .ColorIndex = 3
            End If
        End With

        newHour = Hour(Now())
        newMinute = Minute(Now())
        newSecond = Second(Now()) + 5
        waitTime = TimeSerial(newHour, newMinute, newSecond)

        Debug.Print Now(); waitTime; stopTime

        Application.Wait waitTime
    Loop

End Sub

有关更改哪些代码以阻止Excel崩溃的任何建议?

1 个答案:

答案 0 :(得分:1)

如果有任何机会走过去,不要单独依赖时间。午夜;包括开始日期和停止日期时间。

Option Explicit

Dim waitTime As Date, stopTime As Date

Function startFlash(x As String)
    Beep
    stopTime = Now + TimeSerial(0, 2, 0)
    'Debug.Print stopTime
    Call sflash
    MsgBox "done"
End Function

Sub sflash()

    Do While waitTime <= stopTime

        With Sheet1.Range("c8").Font
            If .ColorIndex = 3 Then
              .ColorIndex = 5
             Else
             .ColorIndex = 3
            End If
        End With

        waitTime = Now + TimeSerial(0, 0, 5)
        'Debug.Print Now; waitTime; stopTime

        Do While Now < waitTime: DoEvents: Loop
    Loop

End Sub

循环通过DoEvents Function直到你的时间相遇是一种更好的方法。