【问题标题】:Excel counting by colour VBA not updating with changes?Excel 按颜色 VBA 计数不随更改更新?
【发布时间】:2019-10-15 00:46:53
【问题描述】:

我在 Excel 中有一些 VBA,它计算一个单元格范围是否包含来自参考单元格的颜色,这很好用。但更改范围内任何单元格的颜色并不会更新总数。

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

我尝试在 If 语句中添加 Else 语句,这样如果一个单元格是“空白”或使用油漆罐按钮填充单元格的颜色“清除”,它会扣除一个数字,但这没有奏效.

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

如果我使用油漆罐图标更改范围填充中的一个单元格以说“清除”,它不会更改填充参考颜色的单元格计数。

如果单元格填充从参考颜色更改时,我将非常感谢有关如何确保此代码自动更新总和的一些建议。

【问题讨论】:

  • 您希望更改单元格时会发生更改,还是更改单元格并重新运行代码时会发生更改?
  • Sub ColorIf 的意义何在?它没有可执行的语句。无论如何,更改单元格颜色不会触发工作表计算,这可能是您的问题。
  • @Gareth - 我确实希望在单元格更改时发生更改,而无需重新运行代码,就像我想的标准 Excel 公式一样
  • @John,我错了,我把这个放错了,或者至少忘了删除这个子。所以我需要触发工作表计算?我会调查一下,谢谢

标签: excel vba


【解决方案1】:

不幸的是,格式更改似乎不会触发任何标准 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 运行一个子程序,每隔几秒触发一次重新计数,但这仍然不会导致您在更改颜色后立即更新。

编辑时 由于没有可以定位的FormatChange 事件,因此使用SelectionChange 作为它的代理并不理想。您在 cmets 中提到的一个问题是,这将在复制粘贴操作的中间触发,在这种情况下,生成的工作表计算将使 Excel 退出复制粘贴模式。解决该特定问题的一种方法是将代码更改为:

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

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

【讨论】:

  • 感谢 John 的评论,我会尝试使用这段代码,看看会发生什么并报告。
  • 嗨,约翰,效果很好。我将 WorkSheet_SelectionChange 子添加到工作表并更新了模块代码,现在一切正常!!!
  • @John,我很遗憾这个解决方案复制和粘贴不再有效?!?我选择要复制的单元格,移动到另一个单元格,现在粘贴不可用?任何建议将不胜感激:-)
  • @MarkHutchins 好问题。见编辑。请注意,如果您同时更改单元格的颜色然后立即复制它,则在进行编辑时,在粘贴之前不会重新计算该函数。
  • 感谢约翰的更新。我确实尝试了 If Application.CutCopyMode = False ,但在尝试“撤消”或 Ctrl+Z 时 Excel 崩溃了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2017-11-19
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多