VBA遍历工作表时名称不存在或值为空如何跳过进入下一循环
VBA 异常跳过实现方案
在遍历集合的循环中增加两层前置校验,同时补充特殊场景容错即可解决问题,核心判断逻辑如下:
- 校验1:当前遍历到的集合元素为空字符串时,直接进入下一轮循环
- 校验2:当前元素对应的工作表不存在于当前工作簿时,直接进入下一轮循环
- 补充容错:工作表存在但A列无任何常量单元格时,
SpecialCells方法会触发运行错误,需一并处理避免代码中断
修改后完整代码
Set Tail = New ArrayList Dim NewestEntry As Long Dim Apple As String Dim ws As Worksheet Dim i As Long, j As Long For i = 0 To 20 Step 3 ' 读取StepBrief表指定区域值存入集合 ' 读取值时自动去除首尾空格,避免空格导致工作表名称匹配失败 Apple = Trim(Worksheets("StepBrief").Cells(i + 6, 3).Value) Tail.Add Apple Next i ' 遍历集合时直接取集合实际元素个数作为上界,避免写死数值导致下标越界 For j = 0 To Tail.Count - 1 ' 场景1:集合元素为空,跳过 If Tail(j) = "" Then GoTo NextLoop ' 场景2:对应工作表不存在,跳过 On Error Resume Next Set ws = Worksheets(Tail(j)) On Error GoTo 0 If ws Is Nothing Then GoTo NextLoop ' 统计常量单元格数量,兼容无常量单元格的场景 On Error Resume Next NewestEntry = ws.Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count If Err.Number <> 0 Then NewestEntry = 0 Err.Clear End If On Error GoTo 0 ' 此处编写你拿到NewestEntry后的后续业务逻辑 ' 示例:打印结果到立即窗口 Debug.Print "工作表【" & Tail(j) & "】A列常量总数:" & NewestEntry NextLoop: ' 重置工作表对象,避免下一轮判断异常 Set ws = Nothing Next j
关键说明
- 原代码中
NewestEntry定义为Integer类型存在溢出风险,Excel单表单元格总数远大于Integer类型的上限32767,修改为Long类型更稳妥- 读取单元格值时增加
Trim处理,避免单元格内容带首尾不可见空格时,匹配不到对应名称的工作表- 循环上界使用
Tail.Count - 1替代写死的数值20,集合元素数量变化时不需要手动修改循环参数,也不会触发下标越界错误
内容的提问来源于stack exchange,提问作者Beau
相关产品推荐
相关产品推荐

