如何在使用UDF重命名工作簿中的工作表时防止Excel崩溃

时间:2015-03-23 10:08:13

标签: excel excel-vba vba

我有一个包含两个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,但症状相似,我觉得它是导致问题的易失性函数:

Error-message

我能做些什么来防止发生这种错误,或者我应该做些什么来使其非易失性,并使用例如Application.CalculateFull - 事件上的Workbook_SheetChange

1 个答案:

答案 0 :(得分:1)

你的deaktiver和reaktiver几乎肯定是因为你没有解析他们。没有多少函数可以不参数!

如果deaktiver或reaktiver尝试更改任何应用程序,工作簿,工作表或范围属性,则调用函数将失败!这包括例如设置Application.DisplayAlerts = False等内容。

工作表中的函数只能更改它们所在的单元格的值。他们只能返回功能结果。

你使用函数来计算 - 你可以改变一些东西。

Subs可以调用函数,但函数不应该调用subs。