如何让VBA未找到指定字符串时跳过当前工作表并进入下一个
解决VBA查找字符串时不存在工作表的报错问题
问题背景
现有一段VBA代码,功能是获取用户输入的字符串,在所有工作表中查找,找到后执行关联任务(如复制数据)并输出到指定工作表。但当部分工作表不存在目标字符串时,代码会报错,尝试用If语句内加Next ws跳过无效,需要解决该问题。
错误原因
原代码直接调用Range.Find(...).Select,当目标字符串不存在时,Find方法会返回Nothing,此时执行.Select就会触发“对象变量或With块变量未设置”的错误。另外原代码中遇到shtName工作表时用Exit Sub会直接终止整个程序,而不是跳过该工作表,逻辑错误。
修正后的代码
Sub Get_w_Data() Dim ws As Worksheet Dim shtName As String Dim exists As Boolean Dim i As Integer Dim wName As String Dim mydate As Date Dim i_DateCounter As Integer Dim DataColCounter As Integer Dim wData(1 To 1, 1 To 11) As Variant Dim Target As Range Dim DataToDelete As Range Application.ScreenUpdating = False ' 提前关闭,提升运行效率 shtName = "Test Sheet" ' 检查目标工作表是否存在,不存在则新建 exists = False For i = 1 To Worksheets.Count If Worksheets(i).Name = shtName Then exists = True Exit For ' 找到后直接终止循环,减少冗余遍历 End If Next i If Not exists Then ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(Sheets.Count)).Name = shtName End If ' 清除目标工作表中的旧数据 With Worksheets(shtName) Set DataToDelete = .Range("B6:K6", .Range("B" & .Rows.Count).End(xlUp)) DataToDelete.ClearContents End With ' 遍历所有工作表 For Each ws In ThisWorkbook.Worksheets ' 跳过目标工作表,继续下一个 If ws.Name = shtName Then GoTo NextSheet ' VBA无Continue语法,用GoTo实现跳过 End If ' 将查找结果赋值给变量,避免直接调用Select Set Target = ws.Range("B25:U64").Find(What:=wName, MatchCase:=True, LookAt:=xlWhole) ' 判断是否找到目标,仅在找到时执行后续任务 If Not Target Is Nothing Then ' 此处编写找到目标后要执行的任务,比如复制关联数据 ' 示例:Target.Offset(0,1).Copy Worksheets(shtName).Range("B" & Rows.Count).End(xlUp).Offset(1,0) End If NextSheet: ' 跳转标签,用于跳过当前工作表的后续代码 Next ws Application.ScreenUpdating = True End Sub
关键改进点
- 避免直接使用Select:直接操作Range对象而非选中工作表/单元格,既避免报错,又大幅提升代码运行效率。
- 处理Find返回Nothing的情况:用
Set Target = ...接收查找结果,通过If Not Target Is Nothing判断是否找到,未找到则直接跳过后续任务。 - 正确跳过指定工作表:用
GoTo NextSheet标签实现跳过当前工作表,而非Exit Sub(后者会直接终止整个程序)。 - 优化工作表存在性检查:找到目标工作表后立即
Exit For,减少不必要的循环遍历。 - 提前关闭屏幕更新:代码开头就关闭
ScreenUpdating,执行完毕后再开启,提升整体运行速度。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

