VBA UDF 函数导致 excel 到 "not respond"
VBA UDF function causes excel to "not respond"
我有一些非常简单的代码导致 Excel 崩溃。
我已经调试了代码中的变量,它们看起来很好,只是几秒钟后 Now() 没有改变,waitTime 也没有改变——尽管时间彼此不同,即时间没有向前移动(例如,Now 可能停留在 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 崩溃有什么建议吗?
如果有机会'walking over'午夜,不要只依赖时间;在您的开始和结束日期时间中包含日期。
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 直到时间满足是更好的方法。
我有一些非常简单的代码导致 Excel 崩溃。
我已经调试了代码中的变量,它们看起来很好,只是几秒钟后 Now() 没有改变,waitTime 也没有改变——尽管时间彼此不同,即时间没有向前移动(例如,Now 可能停留在 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 崩溃有什么建议吗?
如果有机会'walking over'午夜,不要只依赖时间;在您的开始和结束日期时间中包含日期。
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 直到时间满足是更好的方法。