自动计算Excel VBA 单元格属性相关的UDF
Automatic calculation of Excel VBA UDF related to cell properties
我已经编写了一个 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
sub 触发计算,但是这不起作用,因为 Excel 似乎没有考虑改变颜色 [=] 25=]。
在rData
中,当用户更改单元格的颜色或线条属性时,是否有任何方法可以使单元格自动计算和更新?
编辑——已解决
非常感谢 ignotus,ChangeSelection 解决方法足以满足我的目的。没想到。
背景信息也很方便,非常感谢。
我认为这是不可能的,但一个相当公平的解决方案是在您离开或更改单元格时重新计算:
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Calculate
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.Calculate
End Sub
或者作为替代方案,在 sheet 上放置一个调用 Me.Calculate
的按钮
仅供参考:Me
是什么? Source
Me
指代代码在 "sitting" 中的父对象。如果您在 Sheet 模块中编写,Me
将指代该代码具体 sheet.
使用 Me
很方便,因为我们不必担心 sheet 名称更改,而且对于未来的代码阅读者来说也很容易,因为他们不必这样做请记住 "Main UserForm" 是我们当前正在处理的用户窗体。您可以将相同的方法应用于 Me
,如果您提供了全名,就可以将这些方法应用于对象。
在 Sheet1 module
中,以下几行的目的相同:
Worksheets("Sheet1").Range("A1").Select
Me.Range("A1").Select
如果您的函数执行速度非常快(比如不到 50 毫秒),那么您可以从事件处理程序中调用它 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
;用户不会注意到它的发生。此解决方案的另一个问题是当用户更改格式并立即离开工作表时。然后,如果您希望重新计算发生,您也许可以使用 Private Sub Worksheet_Deactivate()
到 运行 它。还有其他可能性,none 防弹或简单。
我已经编写了一个 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
sub 触发计算,但是这不起作用,因为 Excel 似乎没有考虑改变颜色 [=] 25=]。
在rData
中,当用户更改单元格的颜色或线条属性时,是否有任何方法可以使单元格自动计算和更新?
编辑——已解决 非常感谢 ignotus,ChangeSelection 解决方法足以满足我的目的。没想到。 背景信息也很方便,非常感谢。
我认为这是不可能的,但一个相当公平的解决方案是在您离开或更改单元格时重新计算:
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Calculate
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.Calculate
End Sub
或者作为替代方案,在 sheet 上放置一个调用 Me.Calculate
仅供参考:Me
是什么? Source
Me
指代代码在 "sitting" 中的父对象。如果您在 Sheet 模块中编写,Me
将指代该代码具体 sheet.
使用 Me
很方便,因为我们不必担心 sheet 名称更改,而且对于未来的代码阅读者来说也很容易,因为他们不必这样做请记住 "Main UserForm" 是我们当前正在处理的用户窗体。您可以将相同的方法应用于 Me
,如果您提供了全名,就可以将这些方法应用于对象。
在 Sheet1 module
中,以下几行的目的相同:
Worksheets("Sheet1").Range("A1").Select
Me.Range("A1").Select
如果您的函数执行速度非常快(比如不到 50 毫秒),那么您可以从事件处理程序中调用它 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
;用户不会注意到它的发生。此解决方案的另一个问题是当用户更改格式并立即离开工作表时。然后,如果您希望重新计算发生,您也许可以使用 Private Sub Worksheet_Deactivate()
到 运行 它。还有其他可能性,none 防弹或简单。