Excel Office 2016/Office 365的自定义项条件格式问题
我有一个UDF来检查评论的存在。我在CF中使用它是因为我想给单元格着色,如果1。单元格不是空的,为2。没有评论。这在2007年和2010年都很好,但现在我有了2016年,Excel对我来说有点怪异 UDF: CF: =和(不是(ISBLANK(B6)),HasCmt(B6)=FALSE) 现在,当我满足条件时,将应用格式设置,然后再次消失。如果我禁用自动计算,它将正常运行,直到我重新计算。我在保存文档时也会出错。”计算不完整…' 有谁知道我可以在我的许多使用此CF的工作簿上应用的修复方法吗?2016年Excel产品有什么变化吗 任何帮助都将不胜感激Excel Office 2016/Office 365的自定义项条件格式问题,excel,vba,conditional-formatting,Excel,Vba,Conditional Formatting,我有一个UDF来检查评论的存在。我在CF中使用它是因为我想给单元格着色,如果1。单元格不是空的,为2。没有评论。这在2007年和2010年都很好,但现在我有了2016年,Excel对我来说有点怪异 UDF: CF: =和(不是(ISBLANK(B6)),HasCmt(B6)=FALSE) 现在,当我满足条件时,将应用格式设置,然后再次消失。如果我禁用自动计算,它将正常运行,直到我重新计算。我在保存文档时也会出错。”计算不完整…' 有谁知道我可以在我的许多使用此CF的工作簿上应用的修复方法吗?20
感谢工作簿(或应用程序实例中的任何工作簿)中的任何易失性函数似乎都在生成重复的计算事件调用,并且UDF在自身之上运行。条件格式在每个计算周期中都会“刷新”,就像易失性函数一样。在UDF内部使用该方法本身使事情进一步复杂化 我编写了一个修改过的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
从本质上说,这一进程是暂时中止的。这将限制易失性函数重新触发计算事件。临时挂起重复执行,并允许应用程序消息队列赶上
这与包含数百个易失性函数的工作表上覆盖数百个单元格的条件格式规则中的主函数一样有效。工作簿(或应用程序实例中的任何工作簿)中的任何易失性函数正在生成重复的计算事件调用,并且UDF正在自行运行。条件格式在每个计算周期中都会“刷新”,就像易失性函数一样。在UDF内部使用该方法本身使事情进一步复杂化 我编写了一个修改过的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
从本质上说,这一进程是暂时中止的。这将限制易失性函数重新触发计算事件。临时挂起重复执行,并允许应用程序消息队列赶上
这与包含数百个volatile函数的工作表上覆盖数百个单元格的条件格式规则中的主要函数一样有效。该application.volatile对工作簿的影响一定很大。此外,它实际上似乎不符合您的两个标准,所以您必须在它上面使用ISBLANK。除了2016年的问题,您是否考虑过其他(更有效的)方法?严格地说,.volatile在接收到注释时不会实际更改单元格的状态;只有当工作簿中的某些内容发生更改时,才会重新计算所有单元格。谢谢。我想不出另一种方法来实现这一点,特别是在07和2010年,它刚刚“起作用”,我从UDF中删除了application.volatile,并将逻辑更改为
如果不是IsEmpty(rng),那么HasCmt=CBool(不是rng.Comment是Nothing)
。当计算设置为自动时,自定义项按CF规则中的预期执行。这是在Excel 2013中。稍后我将尝试查看excel 2016。你好,吉佩德,谢谢你的解决方案。我对CF规则有问题。我应该简单地使用=HasCmt=TRUE吗?不幸的是,这似乎不起作用。我在上周末玩了很长一段时间,发现a)application.volatile不需要,因为CF规则无论如何都会重新评估计算周期;volatile使它们在自身之上运行b)工作表上的volatile函数(今天()、现在()、randbetween()、偏移量()、间接()等)是CF无法正常运行的原因。我还没有达成令人满意的决议。我正试图用特殊单元格隔离已注释的单元格,但突然发现了其他问题。application.volatile对工作簿的影响一定很大。此外,它实际上似乎不符合您的两个标准,所以您必须在它上面使用ISBLANK。除了2016年的问题,您是否考虑过其他(更有效的)方法?严格地说,.volatile在接收到注释时不会实际更改单元格的状态;只有当工作簿中的某些内容发生更改时,才会重新计算所有单元格。谢谢。我想不出另一种方法来实现这一点,特别是在07和2010年,它刚刚“起作用”,我从UDF中删除了application.volatile,并将逻辑更改为如果不是IsEmpty(rng),那么HasCmt=CBool(不是rng.Comment是Nothing)
。当计算设置为自动时,自定义项按CF规则中的预期执行。这是在Excel 2013中。稍后我将尝试查看excel 2016。你好,吉佩德,谢谢你的解决方案。我对CF规则有问题。我应该简单地使用=HasCmt=TRUE吗?不幸的是,这似乎不起作用。我在上周末玩了很长一段时间,发现a)application.volatile不需要,因为CF规则无论如何都会重新评估计算周期;volatile使它们在自身之上运行b)工作表上的volatile函数(今天()、现在()、randbetween()、偏移量()、间接()等)是CF无法正常运行的原因。我还没有达成令人满意的决议。我当时正试图用特殊单元格来隔离评论过的单元格,但我发现了其他一些东西。这看起来很棒,但由于某些原因,它没有格式化我的单元格。我甚至尝试了一个新的WB。我将您的自定义项添加到一个新模块中,并且我的CF is=has