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

Posted

技术标签:

【中文标题】自动计算与单元格属性相关的 Excel VBA UDF【英文标题】:Automatic calculation of Excel VBA UDF related to cell properties 【发布时间】:2015-01-20 15:49:58 【问题描述】:

我已经编写了一个 UDF 来计算特定颜色和特定线条样式的单元格,我将发布整个函数:

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 变通方法对我的目的来说已经足够了。没想到。 背景信息也很方便,非常感谢。

【问题讨论】:

我想解决方案是您需要检查范围内的每个单元格是否有颜色变化。并在更改时调用您的 UDF 简短的回答(您有以下几种解决方法)是否定的。格式化应该用于反映数据,而不是作为数据。 ;) 我就是这么说的。 :-) 我建议让用户在单元格中输入一个值,通过条件格式更改颜色。然后计算会容易得多。但是不,人们习惯于使用颜色。变更管理:-) 【参考方案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 是什么? Source

Me 指代代码所在的父对象。如果您在工作表模块中编写,Me 将引用该特定工作表。

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于自动计算与单元格属性相关的 Excel VBA UDF的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA中的ThisCell属性如何使用?

求EXCEL VBA代码。单元格输入内容保存后自动锁定有内容单元格。下次打开后不可编辑。

Excel VBA 函数循环遍历范围并测量多个相关性

求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题

Excel vba 仅自动填充空单元格

excel VBA 当有公式的单元格录入内容后,自动将内容粘贴为数值