从 excel vba 中的宏正确调用单元格公式

Properly call a cell formular from a macro in excel vba

我正在尝试在 excel 中制定一个小调度程序来更好地管理我的生活。我为每个事件使用不同的单元格颜色(黄色代表工作,红色代表大学等)。我已经有一个宏 CountColor 可以计算特定范围内颜色的出现次数,效果很好(我几乎是从在线解决方案中复制粘贴的)。我现在使用宏来计算单元格中的使用时间,如下所示:

单元格包含 =ColorCount(H5;B2:F15) 而第一个参数的内部颜色决定了要计算的颜色,第二个参数是计算颜色的范围。这个宏工作正常。最后一个数字就是上面三者的和

但我现在面临的问题是,更改单元格的内部颜色不会触发公式的重新计算。我创建了一个简单的按钮(不是 ActiveX 按钮)并为其分配了一个宏:

Public Sub CalcButton_onclick()
    Worksheets(1).Range("I13:I16").Calculate
End Sub

但是当我点击按钮时(我也尝试使用 Worksheets(1).Calculate 重新计算整个 sheet)没有任何反应。例如,只有当我更改单元格中的值时,我的时间才会重新计算。我的按钮宏肯定被执行了,我通过在 Calculate 调用之后添加 Worksheets(1).Cells(20, 20).Value = "Test" 进行了测试,它正确地更改了给定单元格的值。

为了完成,我还添加了CountColor宏的代码:

'counts the occurence of the interior color of rColor in rRange
Public Function ColorCount(ByRef rColor As Range, ByRef rRange As Range) As Integer
    Dim rCell As Range
    Dim lCol As Long
    Dim vResult As Integer
    vResult = 0
    lCol = rColor.Interior.ColorIndex
    For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
            vResult = 1 + vResult
        End If
    Next rCell
    ColorCount = vResult
End Function

我不太确定问题出在哪里,但我相信我可能误解了 Calculate 方法。我只创建了上面的 2 个宏。我感谢任何帮助!

顺便说一下元:这是在问题中正确使用图片吗?我想不出更好的方法来展示我希望输出的样子。

使您的颜色计数 UDF 可变会有所帮助(添加 Application.Volatile),但正如您发现更改单元格的颜色或格式不会触发重新计算,因此即使是可变的 UDF 也不会仅根据颜色重新计算改变。

如果您使 UDF 可变,那么 Range.Calculate 应该在自动计算模式下触发重新计算。

我自己发现了问题。

首先我要感谢大家的提示和技巧。在解决我最初的问题后我可能会需要它们,所以我提前修复了它们:)

我的问题实际上显然是,我想将我的空闲时间声明为白色。但实际上我有几个单元格 "no fill color" 在将每个空闲单元格显式着色为白色后,它现在可以与按钮一起使用。不幸的是,sheet 代码中使用 Worksheet_Change() 方法的解决方案没有奏效,因为颜色变化不会被评估为 sheet 中的变化。 Worksheet_SelectionChange() 然而,当您单击另一个单元格时,更新就成功了,所以我不再需要该按钮了。