如何在Excel VBA中遍历所有工作表并分别存储各表LastRow值
遍历Excel所有工作表并单独存储每个表的最后一行行号
当然可以实现啦!你现在的代码是针对单个工作表的,要遍历所有工作表并单独存储每个表的最后一行行号,我给你推荐两种实用的方法,其中最灵活的是用字典来存储,另外也能实现动态命名变量的方式,下面详细说明:
方法一:使用字典存储(最推荐)
字典可以直接把工作表名称作为「键」,对应的最后一行行号作为「值」,后续想调用哪个表的行号直接用名称取就行,维护和使用都非常方便。
Sub GetAllLastRows() Dim ws As Worksheet Dim lastRowDict As Object Dim lastRow As Long ' 创建字典对象 Set lastRowDict = CreateObject("Scripting.Dictionary") ' 遍历当前工作簿的所有工作表 For Each ws In ThisWorkbook.Worksheets With ws If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastRow = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else lastRow = 1 End If End With ' 将工作表名称和对应行号存入字典 lastRowDict(ws.Name) = lastRow Next ws ' 示例:调用指定工作表的行号,比如查看"Sheet1"的最后一行 ' MsgBox "Sheet1的最后一行是:" & lastRowDict("Sheet1") ' 示例:遍历字典查看所有工作表的结果 ' Dim key As Variant ' For Each key In lastRowDict.Keys ' MsgBox key & "的最后一行是:" & lastRowDict(key) ' Next key End Sub
方法二:动态命名单独变量(特定场景使用)
如果你确实需要每个工作表对应一个独立命名的变量(比如Sheet1_LastRow、Sheet2_LastRow),可以用VBA的ExecuteGlobal语句动态创建变量,但这种方式维护起来比较麻烦,而且需要处理工作表名称中的特殊字符(比如空格),只推荐在特殊需求下使用:
Sub CreateIndividualLastRowVars() Dim ws As Worksheet Dim lastRow As Long Dim varName As String ' 遍历所有工作表 For Each ws In ThisWorkbook.Worksheets ' 处理工作表名称,替换空格为下划线,确保变量名合法 varName = Replace(ws.Name, " ", "_") & "_LastRow" With ws If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastRow = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else lastRow = 1 End If End With ' 动态创建全局变量并赋值 ExecuteGlobal "Dim " & varName & " As Long" ExecuteGlobal varName & " = " & lastRow Next ws ' 示例:调用动态创建的变量,比如查看"Sheet1"对应的行号 ' MsgBox "Sheet1的最后一行是:" & Sheet1_LastRow End Sub
小提示
- 方法一中的字典是最推荐的方案,不管工作表数量多少,都能轻松存储和调用,还能随时修改或删除条目,灵活性拉满。
- 方法二中的动态变量方式,虽然满足了「单独存储」的需求,但变量是全局的,后续调用需要记住每个变量的名称,不如字典直观。
内容的提问来源于stack exchange,提问作者AleB
相关产品推荐
相关产品推荐

