4

我已经编写了一个 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现在,我遇到的问题是,当其中一个单元格的颜色或线条属性发生变化时,公式不会自动计算。我已经添加了Application.Volatile,并且我还尝试通过Worksheet_Change子触发计算,但是这不起作用,因为 Excel 似乎没有考虑将颜色更改为单元格/工作表的更改。

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

编辑——已解决 非常感谢 ignotus,ChangeSelection 解决方法对我的目的来说已经足够了。没想到。背景信息也很方便,非常感谢。

4

2 回答 2

1

我认为这是不可能的,但一个相当公平的解决方案是在您离开或更改单元格时重新计算:

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

仅供参考:什么是Me资源

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

使用Me起来很方便,因为我们不必担心工作表名称的变化,而且它也让未来的代码读者更容易,因为他们不必记住“主用户表单”是我们当前正在处理的用户表单. Me如果您提供全名,您可以将相同的方法应用于您可以应用于对象的方法。

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

Worksheets("Sheet1").Range("A1").Select
Me.Range("A1").Select
于 2015-01-20T16:13:17.430 回答
0

如果您的函数执行得非常快(例如,在 50 毫秒以下),那么您可以从事件处理程序中调用它Private Sub Worksheet_SelectionChange(ByVal Target As Range);用户不会注意到它的发生。此解决方案的另一个问题是当用户更改格式并立即离开工作表时。然后,如果您希望重新计算发生,您也许可以使用Private Sub Worksheet_Deactivate()来运行它。还有其他可能性,没有防弹或远程简单。

于 2015-01-20T16:22:13.473 回答