Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel按颜色VBA计数不随更改而更新?_Excel_Vba - Fatal编程技术网

Excel按颜色VBA计数不随更改而更新?

Excel按颜色VBA计数不随更改而更新?,excel,vba,Excel,Vba,我在Excel中有一些VBA,它可以计算一系列单元格是否包含参考单元格的颜色,效果很好。但改变该范围内任何单元格的颜色都不会更新计数的总数 理想情况下,我希望代码更新与引用匹配的彩色单元格的数量,并在更改单元格颜色时更新计数的总和 我曾尝试在If语句中添加Else语句,这样,如果某个单元格是“空白”的,或者使用“paint pot”按钮填充单元格时颜色被“清除”,它将扣除一个数字,但这不起作用 Sub Colourif() End Sub Function CountColorIf(rSamp

我在Excel中有一些VBA,它可以计算一系列单元格是否包含参考单元格的颜色,效果很好。但改变该范围内任何单元格的颜色都不会更新计数的总数

理想情况下,我希望代码更新与引用匹配的彩色单元格的数量,并在更改单元格颜色时更新计数的总和

我曾尝试在If语句中添加Else语句,这样,如果某个单元格是“空白”的,或者使用“paint pot”按钮填充单元格时颜色被“清除”,它将扣除一个数字,但这不起作用

Sub Colourif()
End Sub

Function CountColorIf(rSample As Range, rArea As Range) As Long
    Dim rAreaCell As Range
    Dim lMatchColor As Long
    Dim lCounter As Long

    lMatchColor = rSample.Interior.Color

    For Each rAreaCell In rArea
        If rAreaCell.Interior.Color = lMatchColor Then
            lCounter = lCounter + 1
        End If
    Next rAreaCell

    CountColorIf = lCounter
End Function
如果我使用“paint pot”图标更改填充范围中的一个单元格,使其显示“clear”(清除),则不会更改填充了参考颜色的单元格数


如果您能提供一些建议,告诉我如何确保当单元格填充从参考颜色更改时,此代码自动更新总和,我将不胜感激。

不幸的是,格式更改似乎不会触发任何标准Excel事件处理程序。接近目标的是工作表的选择更改事件。在工作表的代码模块中,输入:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Me.Calculate
End Sub
然后更改
CountColorIf
的定义,使其开始:

Function CountColorIf(rSample As Range, rArea As Range) As Long
    Application.Volatile 
然后,如果某个单元格的颜色发生了更改,则当您移动到另一个单元格时,计数就会更新

另一个想法是使用
Application.OnTime
运行sub,每隔几秒钟触发重新计票,但这仍然不会导致在您更改颜色后立即更新

在编辑时由于没有可针对的
FormatChange
事件,因此使用
SelectionChange
作为代理并不理想。您在评论中提到的一个问题是,这将在复制粘贴行为的中间着火,在这种情况下,所得的工作表计算将从复制粘贴模式中获得Excel。解决该特定问题的一个方法是将代码更改为:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode = 0 Then Me.Calculate
End Sub

如果此代码是供您个人使用的,一个简单的解决方案是保持
Application.Volatile
,但要完全摆脱事件处理程序,养成在更改单元格颜色时点击
F9
的习惯。这会将重新计算限制在您需要的时候,而您需要付出所需的代价。

您是否希望在更改单元格或更改单元格并重新运行代码时发生更改?如果
子颜色有什么意义?它没有可执行语句。在任何情况下,更改单元格颜色都不会触发工作表计算,这可能是您的问题。@Gareth-我确实希望在单元格更改时进行更改,而不必重新运行代码,就像标准Excel公式一样,我想@John,我错了,我错把它放进去了,或者至少忘了删除此子项。所以我需要触发工作表计算?我将对此进行调查,谢谢你的评论谢谢你John,我将尝试使用此代码,看看会发生什么,然后报告。嗨John,这非常有效。我将工作表\u SelectionChange sub添加到工作表中,并更新了模块代码,现在一切正常!!!@约翰,我后悔这个解决方案复制粘贴不再有效?!?我选择要复制的单元格,移动到另一个单元格,现在粘贴不可用?任何建议都将不胜感激:-)@MarkHutchins问得好。请参见编辑。请注意,使用编辑功能时,如果您都更改了单元格的颜色,然后立即复制它,则在粘贴之后才会重新计算该函数。感谢您的更新。我确实尝试了If Application.CutCopyMode=False,但在尝试“撤消”或Ctrl+Z时Excel崩溃了!