我有一个包含两个UDF的工作表。他们的内容(除了一行)对于手头的问题并不那么有趣,但对于好奇的人来说,他们是:
Function finn_prioritert_oppgave(nummer As Long) As String
Dim i As Long, r As Range, c As Range
Set r = Range(PDCA.Range("N11"), PDCA.Range("N1048576").End(xlUp))
If Not Intersect(r, PDCA.Range("N10")) Is Nothing Then
Set r = PDCA.Range("N11")
End If
For Each c In r
If Not IsEmpty(c) Then
nummer = nummer - 1
End If
If nummer = 0 Then
Exit For
End If
Next
If nummer > 0 Then
finn_prioritert_oppgave = CVErr(xlErrNA)
Else
finn_prioritert_oppgave = c.Offset(0, -11).Value
End If
End Function
Function finn_status_oppgave(oppgave As Range) As String
Application.Volatile
Dim r As Range, i As Long, satisfied As Boolean
Call deaktiver
Set r = Range(PDCA.Range("C11"), PDCA.Range("C1048576").End(xlUp))
Set r = r.Find(what:=oppgave, LookIn:=xlValues, lookat:=xlWhole)
finn_status_oppgave = ""
If Not r Is Nothing Then
Set r = PDCA.Range("J" & CStr(r.Row) & ":M" & CStr(r.Row))
i = 4
satisfied = False
Do
If Not IsEmpty(r.Cells(1, i)) Then
Debug.Print PDCA.Range("J9:M9").Cells(1, i)
finn_status_oppgave = PDCA.Range("J9:M9").Cells(1, i)
satisfied = True
End If
i = i - 1
Loop While i >= 1 And Not satisfied
End If
Call reaktiver
End Function
据我所知,问题在于第二个函数,因为它包含行Application.Volatile
。我整个上午都在努力工作,在确定Excel崩溃的原因时没有运气,当我尝试重命名工作表时。最后,在梳理了我的代码并查找错误之后尝试谷歌搜索,我在Excel论坛上遇到this thread,该论坛声称问题是由于上述功能而发生的。
显然
如果你有一个volatile函数(你的代码函数包含 “Application.Volatile(True)”标签),您可以在其中更改DisplayAlerts status(例如,“Application.DisplayAlerts = False”),然后如果你 更改包含a的工作簿中的工作表的名称 使用这两个命令,Excel(截至2010年,未经过测试) 2013年)将崩溃
我在代码中没有使用Application.DisplayAlerts = False
,但症状相似,我觉得它是导致问题的易失性函数:
我能做些什么来防止发生这种错误,或者我应该做些什么来使其非易失性,并使用例如Application.CalculateFull
- 事件上的Workbook_SheetChange
答案 0 :(得分:1)
你的deaktiver和reaktiver几乎肯定是因为你没有解析他们。没有多少函数可以不参数!
如果deaktiver或reaktiver尝试更改任何应用程序,工作簿,工作表或范围属性,则调用函数将失败!这包括例如设置Application.DisplayAlerts = False
等内容。
工作表中的函数只能更改它们所在的单元格的值。他们只能返回功能结果。
你使用函数来计算 - 你可以改变一些东西。
Subs可以调用函数,但函数不应该调用subs。