2016-03-19 43 views
1

我有一个用于检查评论是否存在的UDF。我在CF中使用它,因为我想为单元格着色,如果1.单元格不是空白,并且2.没有评论。这对2007年和2010年来说工作得很好,但现在我已经有了2016年,而且Excel对我来说有点奇怪。使用Office 2016/Office 365的udf问题进行条件格式化

UDF:

Function HasCmt(Rng As Range) 
    Application.Volatile 

    HasCmt = IIf(Not Rng.Comment Is Nothing, True, False) 

End Function 

CF: = AND(NOT(ISBLANK(B6)),HasCmt(B6)= FALSE)

现在,当我符合标准,格式化被施加并且然后再消失。如果我禁用自动计算,它会正常运行,直到我重新计算。保存文档时也会出错。 '计算不完整...'。

有没有人知道我可以适用于我的许多工作簿我有使用此CF的修复? 2016年Excel产品有所改变吗?

任何帮助将不胜感激。

由于

+1

该application.volatile必须很难打到工作簿。此外,它似乎并不符合您的两个标准,因此您必须在其上使用ISBLANK。除了2016年问题之外,您是否考虑过其他更有效的方法?严格来说,当收到评论时,。volatile并没有改变单元格的状态。只有在工作簿中的某些内容发生变化时才会重新评估所有单元格。 – Jeeped

+0

谢谢Jeeped。我想不出一种替代方式来实现这一点,尤其是因为从07年和2010年它只是'工作' –

+0

我从UDF中删除application.volatile,并将逻辑改为'If Not IsEmpty(rng)Then HasCmt = CBool (不是rng.Comment是Nothing)'。计算设置为自动时,UDF按预期在CF规则中执行。这是在Excel 2013中。我稍后会尝试检查excel 2016。 – Jeeped

回答

0

看来,在工作簿(或应用程序实例中的任何工作簿)的任何挥发性功能进行了生成的重复计算事件调用和UDF物上的自身上运行。条件格式在每个计算周期都会刷新,就像一个易失性函数一样。在UDF中使用Application.Volatile方法本身更加复杂。

我写了一个修改后的UDF的几个版本,一旦我得到一个稳定的版本,我剥离开销,直到我有最低的运作良好。

Option Explicit 

Function hasComment(rng As Range) As Boolean 
    'reports true for non-blank with a comment 
    Application.EnableEvents = False 
    If Not IsEmpty(rng) Then _ 
     hasComment = CBool(Not rng.Comment Is Nothing) 
    DoEvents 
    Application.EnableEvents = True 
End Function 

Function hasNoComment(rng As Range) As Boolean 
    'reports true for non-blank with no comment 
    Application.EnableEvents = False 
    If Not IsEmpty(rng) Then _ 
     hasNoComment = Not CBool(Not rng.Comment Is Nothing) 
    DoEvents 
    Application.EnableEvents = True 
End Function 

基本上,Application.EnableEvents property暂时中止。这限制了重新触发计算事件的易失性函数。 DoEvents function暂时中止反复执行并允许应用程序消息队列赶上。

这适用于在包含数百个易失性函数的工作表上覆盖几百个单元格的条件格式规则中的主要功能。

+0

这看起来很棒,但由于某些原因,它没有格式化我的单元格。我甚至尝试过一个新的WB。我添加了你的UDF到一个新的模块,我的CF = hasNoComment(B2) –

+0

如果你愿意,或者有其他的东西阻止它正常工作,我可以给你发邮件给你吗?谢谢 –

+0

发送到您的Gmail,谢谢 –

相关问题