编写VBA函数:判断工作表是否有数据,有则返回末行否则返回首行
VBA Function to Check Empty Worksheet and Return Target Row
我帮你把这个VBA函数完善好了,不仅能实现你要的判断逻辑,还处理了几个容易踩坑的细节,来看看最终版本:
Private Function GetLastRow(sheetName As String) As Integer Dim targetSheet As Worksheet Dim lastRow As Integer ' 先检查指定工作表是否存在,避免因无效表名报错 On Error Resume Next Set targetSheet = ThisWorkbook.Sheets(sheetName) On Error GoTo 0 ' 若工作表不存在,返回0作为错误标识(可根据需求调整) If targetSheet Is Nothing Then GetLastRow = 0 Exit Function End If ' 在目标工作表中查找最后一个有内容的单元格 With targetSheet.Cells Dim lastCell As Range Set lastCell = .Find(What:="*", _ After:=.Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) End With ' 根据查找结果返回对应行号 If lastCell Is Nothing Then ' 工作表为空,返回第一行 GetLastRow = 1 Else ' 工作表有数据,返回最后一行 GetLastRow = lastCell.Row End If End Function
几个关键的优化点:
- 修正了原代码里的
CurrentWorkbook错误:VBA里标准的当前代码所在工作簿对象是ThisWorkbook,CurrentWorkbook是无效写法,会直接报错。 - 增加了工作表存在性检查:如果传入的表名不存在,函数会返回0作为提示,不会直接崩溃。
- 完善了空表判断逻辑:原代码如果遇到空表,
Find方法会返回Nothing,直接取.Row会报错,这里先判断lastCell是否为空,再返回第一行。 - 用
With语句限定范围:确保Find方法作用在目标工作表上,而不是默认的活动工作表,避免切换工作表时出问题。
调用示例
你可以在其他宏里这样调用这个函数:
Sub TestFunction() Dim targetRow As Integer targetRow = GetLastRow("销售数据") ' 替换成你的工作表名称 Select Case targetRow Case 0 MsgBox "指定的工作表不存在哦!" Case 1 MsgBox "工作表是空的,返回第一行" Case Else MsgBox "工作表最后一行是:" & targetRow End Select End Sub
内容的提问来源于stack exchange,提问作者Nimy Alex
相关产品推荐
相关产品推荐

