use*_*758 10 vba worksheet-function microsoft-excel
我按照本指南创建了以下自定义函数,用于计算电子表格中某种颜色的单元格数量:
Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
lCol = rColor.Interior.ColorIndex
If SUM = True Then
For Each rCell In rRange
If rCell.Interior.ColorIndex = lCol Then
vResult = WorksheetFunction.SUM(rCell) + vResult
End If
Next rCell
Else
For Each rCell In rRange
If rCell.Interior.ColorIndex = lCol Then
vResult = 1 + vResult
End If
Next rCell
End If
ColorFunction = vResult
End Function
Run Code Online (Sandbox Code Playgroud)
如果我单击公式栏中的绿色勾号,它工作正常并给我预期的结果,但在我为另一个单元格着色后不会自动更新。每次手动为电子表格上其他位置的单元格着色时,如何将其设置为自动更新计数?
额外信息:我在 Mac 上使用 Excel,我已经检查了设置并打开了自动计算。
I s*_*ica 13
您已经创建了一个用户定义函数 (UDF)。Excel 仅在用作函数输入的单元格更改时运行 UDF 的代码。
例如,假设我有这个 UDF:
Public Function MyFunction(Target As Range)
MsgBox "The target cell's address is " & Target.Address
End Function
Run Code Online (Sandbox Code Playgroud)
在我的工作表上的单元格 A1 中,我使用以下公式引用单元格:
=MyFunction(A2)
Run Code Online (Sandbox Code Playgroud)
在我的工作簿的正常使用期间,只有当单元格 A2 的内容或 A2 中的公式引用的另一个单元格的内容发生更改时,才会调用我的 UDF 代码。
您可以通过多种方式解决此问题:
在 UDF 引用的单元格之一中包含 volatile 函数。通过修改 VBA 函数的定义以接受附加参数来执行此操作:
Public Function MyFunction(Target As Range, Optional VolatileParameter As Variant)
Run Code Online (Sandbox Code Playgroud)
然后编辑引用您的 UDF 的单元格以将易失性函数的结果传递Now()
给 UDF:
=MyFunction(A2,Now())
Run Code Online (Sandbox Code Playgroud)
最终结果是 Excel 会认为包含对 UDF 的引用的单元格在每次更改工作表时都需要重新计算,因为它引用了一个易失性函数。
编辑包含 UDF 的单元格。只需输入单元格然后按 Enter 键而不进行更改就足以触发更新。
创建运行以下代码行的宏按钮:
Application.CalculateFull
Run Code Online (Sandbox Code Playgroud)将以下代码放在您的工作簿的 Open 事件中:
ActiveWorkbook.ForceFullCalculation = True
Run Code Online (Sandbox Code Playgroud)
这会导致 Excel始终重新计算所有公式,无论它是否认为需要重新计算。此设置将一直有效,直到 Excel 重新启动。
当 Excel 执行自动重新计算时,它不会重新计算工作簿中的每个公式。相反,它只更新那些包含引用最近修改的单元格的公式的单元格。这种方法避免了在整个工作簿中不必要地执行许多计算只是为了为绝大多数计算得出相同结果的更长的过程。
对于 UDF,Excel 计算引擎知道的工作簿中的唯一引用是在函数的输入中标识的引用。Excel 无法检查 UDF 中的 VBA 代码并识别可能影响函数输出的其他单元格。因此,虽然函数的作者可能会根据工作簿中所做的任意数量的更改构造函数以返回不同的结果,但 Excel 知道将更改函数结果的唯一单元格是声明的输入。因此,这些单元格的更改是 Excel 在决定是否需要重新计算 UDF 时唯一注意的。
小智 6
用户定义的函数可以自己标记为 volatile,每次工作簿中的某些内容发生变化时都会强制重新计算。
为此,您必须Application.Volatile
从函数内部调用。
Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Application.Volatile
Dim rCell As Range
Dim lCol As Long
Dim vResult
lCol = rColor.Interior.ColorIndex
If SUM = True Then
For Each rCell In rRange
If rCell.Interior.ColorIndex = lCol Then
vResult = WorksheetFunction.SUM(rCell) + vResult
End If
Next rCell
Else
For Each rCell In rRange
If rCell.Interior.ColorIndex = lCol Then
vResult = 1 + vResult
End If
Next rCell
End If
ColorFunction = vResult
End Function
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
37393 次 |
最近记录: |