自动计算与单元格属性相关的Excel VBA UDF

我写了一个UDF来计算某些颜色的细胞和某些LineStyles,我发布了整个函数:

Function CountTime(rData As Range, cellRefColor As Range) As Variant Dim indRefColor As Long Dim cellCurrent As Range Dim cntRes As Variant Application.Volatile cntRes = 0 indRefColor = cellRefColor.Cells(1, 1).Interior.Color For Each cellCurrent In rData If indRefColor = cellCurrent.Interior.Color Then cntRes = cntRes + 1 End If If cellCurrent.Borders(xlDiagonalUp).LineStyle <> xlNone Then cntRes = cntRes + 0.5 End If Next cellCurrent CountTime = cntRes End Function 

现在,我遇到的问题是公式不会自动计算rData中的rData单元rData是否更改了颜色或线条属性。 我已经添加了Application.Volatile ,并且我也试图通过一个Worksheet_Change子来触发计算,但这不起作用,因为Excel似乎没有考虑改变单元格/工作表的改变颜色。

当用户改变rData单元格的颜色或线条属性时,有什么办法可以让单元格自动计算和更新?

编辑 – 已解决非常感谢ignotus,ChangeSelection解决方法已经足够我的目的。 没有想到这一点。 而且背景信息也很方便,非常感谢。

我不认为这是可能的,但一个相当公平的解决scheme是重新计算当你离开一个单元格或改变它:

 Private Sub Worksheet_Change(ByVal Target As Range) Me.Calculate End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Me.Calculate End Sub 

或者,也可以在调用Me.Calculate的工作表上放置一个button

供参考:我是什么? 资源

Me指的是代码“坐”在其中的父对象。如果您正在写一个工作表模块, Me将引用该特定工作表。

使用Me是很方便的,因为我们不必担心表单名称的改变,而且对于未来的代码阅读器来说也是一件容易的事情,因为他们不必记住“Main UserForm”是我们当前正在工作的UserForm上。 您可以将相同的方法应用于Me ,如果您提供了全名,则可以应用于该对象。

Sheet1 module ,以下几行用途相同:

 Worksheets("Sheet1").Range("A1").Select Me.Range("A1").Select 

如果你的函数执行得非常快(比如50毫秒),那么你可以从事件处理函数Private Sub Worksheet_SelectionChange(ByVal Target As Range)调用它。 用户不会注意到它发生。 这个解决scheme的另一个问题是当用户改变格式并且离开工作表的时候。 然后,如果你关心重新发生,你可以使用Private Sub Worksheet_Deactivate()来运行它。 还有其他的可能性,没有防弹或远程简单。