我有以下功能(返回任何选定列的最后一行)
Function LastrowCC(SelectedRange As Range)
Dim SelectedColumnNum As Long
SelectedColumnNum = SelectedRange.Column
LastrowCC = ActiveSheet.Cells(Rows.count, SelectedColumnNum).End(xlUp).Row
End Function
问题是当删除所选列的最后一行时,该功能不会自动更新
我们可以在输入改变时自动更新VBA自定义函数吗?
答案 0 :(得分:3)
有可能重复已发布的有用评论和答案,请允许我指出您的问题涉及多个问题,在MSDN文章" Excel Recalculation中得到了很好的总结。"
一个更具体的问题,包括Excel版本和工作表上的计算方式,可能有助于缩小范围。
让我总结一些您可能想要查看的内容,所有内容都在上面的文章中列出:
这些是需要考虑的几个选项和事项。
答案 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