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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:03:32