更新VBA自定义函数

时间:2014-05-01 14:13:54

标签: vba excel-vba excel

我有以下功能(返回任何选定列的最后一行)

Function LastrowCC(SelectedRange As Range)
Dim SelectedColumnNum As Long
SelectedColumnNum = SelectedRange.Column
LastrowCC = ActiveSheet.Cells(Rows.count, SelectedColumnNum).End(xlUp).Row
End Function

问题是当删除所选列的最后一行时,该功能不会自动更新

我们可以在输入改变时自动更新VBA自定义函数吗?

3 个答案:

答案 0 :(得分:3)

有可能重复已发布的有用评论和答案,请允许我指出您的问题涉及多个问题,在MSDN文章" Excel Recalculation中得到了很好的总结。"

一个更具体的问题,包括Excel版本和工作表上的计算方式,可能有助于缩小范围。

让我总结一些您可能想要查看的内容,所有内容都在上面的文章中列出:

  • 触发重新计算的方法有多种,包括功能。研究这种情况的发生方式可能会带来一些见解。根据文章," Excel中工作表的计算可视为一个三阶段过程:
    1. 构建依赖关系树,
    2. 构建计算链,
    3. 重新计算细胞。"
  • 易失性功能是一种选择,但由于资源消耗应该谨慎而明智地使用。
  • 你也可以探索Range.DirtyRange.Calculate方法,这些方法从Excel 2002开始(过去比我们有些人意识到的更远!)允许"强制重新计算"再次引用上面的文章。

这些是需要考虑的几个选项和事项。

答案 1 :(得分:1)

使其易变性

Function LastrowCC(SelectedRange As Range) As Long
    Application.Volatile
    Dim SelectedColumnNum As Long
    SelectedColumnNum = SelectedRange.Column
    LastrowCC = ActiveSheet.Cells(Rows.Count, SelectedColumnNum).End(xlUp).Row
End Function

答案 2 :(得分:0)

使函数在Excel的计算树中工作而不是易失性的关键是在函数的参数中包含所需的一切。也就是说,不要引用函数参数中未包含的任何范围。

在您的示例中,您可以将任何单个单元格发送给它,它将返回该同一列的最后一行。但是你在那个单元格之外寻找,所以Excel不知道整个列应该在计算树中。

在此重写中,该函数仅接受单个整列参数。如果发送的内容少于整列,则会返回错误。如果您发送多个列,则会返回错误。但由于整个列都在参数中,因此列中的任何更改都会触发重新计算。

Public Function LastRowCc(ByVal SelectedRange As Range)

    If SelectedRange.Address = SelectedRange.EntireColumn.Address And SelectedRange.Columns.Count = 1 Then
        LastRowCc = SelectedRange.Find("*", SelectedRange.Cells(1), , , , xlPrevious).Row
    Else
        LastRowCc = CVErr(xlErrValue)
    End If

End Function