在经历了很多挫折之后,“vba built-in”方法似乎总是存在问题。例如,列“A”和“WS”是工作表对象:
- « Ws.Cells(WS.Rows.Count,1).End(xlUp) » 因隐藏行而失败
- « WS.Range("A1").Find(...) » 在组中隐藏行时失败(可能还有其他情况)
- « UsedRange » 和 « .SpecialCells(xlLastCell) » 可以返回高于预期的结果
我的解决方案是使用带有“WorkSheet.Evaluate”的 excel 公式。
检查非空值(即不考虑结果为空的公式):
Function FindLastRow(R as Range) As Long
Const NotFoundResult = 1 ' If all cells have an empty value, this value is returned
FindLastRow = R.Worksheet.Evaluate("IFERROR(LARGE(ROW('" & R.Worksheet.Name & "'!" & R.Address & ")*--('" & R.Worksheet.Name & "'!" & R.Address & " <> """"),1)," & NotFoundResult & ")")
End Function
要使用公式或值检查最后一个单元格(即使结果为空):
Function FindLastRow(R as Range) As Long
Const NotFoundResult = 1 ' If all cells are empty (no value, no formula), this value is returned
FindLastRow = R.Worksheet.Evaluate("IFERROR(LARGE(ROW('" & R.Worksheet.name & "'!" & R.Address & ")*--(NOT(ISBLANK('" & R.Worksheet.name & "'!" & R.Address & "))),1)," & NotFoundResult & ")")
End Function