我在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
我检查了:据我所知,myCF
,range1
,range2
和rng
均有效,并显示有效的.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的任何想法?
注意:要提供精确的复制方法,我必须发布我不愿做的整个电子表格和代码。如果需要,我仍然可以一对一发送邮件。
答案 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
虽然这是超级低效的,却……行之有效?! (目前)。希望它也对其他人有用吗?
顺便说一句:ResizeAreas
和AreasEqual
是我自己的一些帮助函数; ResizeAreas转换例如[A1:A3,C1:D3]
至[A1:A6,C1:D6]
,然后AreasEqual查看给定的两个范围是否由完全相同的单元格组成([A1:A2,B1:B2]
和[A1:B2]
= True)