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

时间:2015-01-20 15:49:58

标签: excel vba excel-vba excel-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中的一个单元格的颜色或线条属性发生变化时,公式不会自动计算。 我添加了Application.Volatile,我也试图通过Worksheet_Change子触发计算,但是这不起作用,因为Excel似乎没有考虑将颜色更改为单元格/工作表的更改。

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

编辑 - 已解决 非常感谢ignotus,ChangeSelection的解决方法足以满足我的需求。没有想到这一点。 并且背景信息也很方便,非常感谢。

2 个答案:

答案 0 :(得分: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

的工作表上放置一个按钮

仅供参考:什么是MeSource

Me指代代码所在的父对象&#34; sit&#34;如果您在Sheet模块中书写,Me将引用该特定表格。

使用Me非常方便,因为我们不必担心工作表名称的变化,这也使得未来的代码阅读器变得有点容易,因为他们不必记住&#34;主要用户形式&#34;是我们目前正在处理的UserForm。如果您提供了全名,则可以将相同的方法应用于可以应用于对象的Me

Sheet1 module中,以下行的目的相同:

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

答案 1 :(得分:0)

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