Excel VBA在ModifyAppliesToRange上发生硬崩溃,没有错误消息

时间:2018-12-10 04:35:07

标签: excel vba crash

我在Excel和VBA中遇到一个奇怪的问题。

我正在各种ModifyAppliesToRange上叫FormatCondition,还有很多其他FormatCondition相关的东西。

它可以正常工作一段时间(大约2-300次调用),然后无缘无故地看到我的Excel(和VBA开发环境)将关闭,并且错误处理程序或excel没有错误,没有通知,除了“暂停”以外,什么都没有发生,直到崩溃为止。无论我是正常运行还是带有断点和步骤,都会发生这种情况。

根据工作表FormatConditions的确切内容,工作的确切次数似乎有所不同。但是,如果起始条件相同,则故障点相同(即,在相同的FormatCondition上故障)。代码失败是:

myCF.ModifyAppliesToRange Union(range1, range2)

其中myCF As FormatCondition

我尝试过

Dim rng As Range
Set rng = Union(range1, range2)
myCF.ModifyAppliesToRange rng

我检查了:据我所知,myCFrange1range2rng均有效,并显示有效的.Address字符串(对于范围)。例如,它将在range1.Address = "$DO$9:$GN$39,$BD$8:$BD$39"range2.Address = "$CI$9:$DN$39"上失败,并且结果rng.Address = "$BD$8:$BD$39,$CI$9:$GN$39"

所以我尝试了

Set rng = Union(Range(CFFrom.AppliesTo.Address), Range(CFTo.AppliesTo.Address))

同样的问题。

有时(在不同的开始条件下)它会超过上述ModifyAppliesToRange,但当我看着myCF.AppliesTo.Address时,会发生相同的崩溃-是将鼠标悬停在它上面还是在Watches中显示,或立即显示。但是rng.Address并没有出现这样的问题。

但是它似乎也可以正常工作2-300次。

我怀疑存在内存问题(但Excel没有使用太多内存或CPU,计算机上有很多可用内存,我使用了Option Explicit,依此类推)或Excel中存在硬限制或错误

关于为什么会发生这种情况的任何想法? 关于如何找出关闭Excel的任何想法?

注意:要提供精确的复制方法,我必须发布我不愿做的整个电子表格和代码。如果需要,我仍然可以一对一发送邮件。

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题。老实说,这似乎是一个Excel错误。

但是,根据this Technet forum post,看来更新条件时Excel会即时更改格式条件集合。看到那样处理循环中的所有条件时可能会导致讨厌的错误(就像我一样),我首先重新编写了代码,以便它首先收集要在Collection中处理的所有条件,然后循环遍历这些条件。那仍然让我Excel崩溃了;可能条件对象本身也会在后台进行更新(创建/销毁),从而导致指向已删除VBA对象的陈旧指针?

也不信任Excel来保持顺序相同,然后我重新编写了代码以在所有条件上保持循环,找到第一个要更新的条件,然后重新启动循环,直到没有单个条件被处理为止。所以基本上就像:

Dim stillBusy As Boolean
Do
    stillBusy = False
    Dim nextCondition As FormatCondition
    For Each nextCondition In myRange.FormatConditions
      Dim newAreas As Range
      Set newAreas = ResizeAreas(nextCondition.AppliesTo, myRange.Rows.Count)
      If Not AreasEqual(nextCondition.AppliesTo, newAreas) Then
        Call nextCondition.ModifyAppliesToRange(newAreas)
        stillBusy = True
        Exit For
      End If
    Next
Loop While stillBusy    

虽然这是超级低效的,却……行之有效?! (目前)。希望它也对其他人有用吗?

顺便说一句:ResizeAreasAreasEqual是我自己的一些帮助函数; ResizeAreas转换例如[A1:A3,C1:D3][A1:A6,C1:D6],然后AreasEqual查看给定的两个范围是否由完全相同的单元格组成([A1:A2,B1:B2][A1:B2] = True)