You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:13:53