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

VBA嵌套循环报'Next without For'错误,求双条件复制代码修复

问题解决:VBA报错"Next without For"及代码修正

错误原因

原代码的If语句未正确闭合,嵌套的If缺少对应的End If,导致循环结构混乱,触发"Next without For"错误。

修正后的完整代码

Dim shCD As Worksheet, shVD As Worksheet
Dim VDCell As Range
Dim lrwCD As Long, lrwVD As Long
Dim foundTrue As Boolean
Dim i As Integer, j As Integer

Application.ScreenUpdating = False

Set shCD = Sheets("Checked Dossiers")
Set shVD = Sheets("Verdwenen Dossiers")
Set VDCell = FreeCell(shVD.Range("A5")) ' 假设FreeCell是你自定义的找空单元格函数

lrwCD = shCD.Cells(shCD.Rows.Count, "B").End(xlUp).Row
lrwVD = shVD.Cells(shVD.Rows.Count, "A").End(xlUp).Row

foundTrue = False   ' 控制是否复制的开关

For i = 2 To lrwCD
    ' 先判断条件1:对应单元格返回"1"
    If shCD.Cells(i, 1).Value = "1" Then
        foundTrue = True
        ' 遍历目标表,检查编号是否已存在
        For j = 2 To lrwVD
            If shCD.Cells(i, 2).Value = shVD.Cells(j, 1).Value Then
                foundTrue = False ' 编号已存在,关闭开关
                Exit For ' 找到重复就跳出内层循环,不用继续遍历
            End If
        Next j
        
        ' 开关仍为True,说明满足两个条件,执行复制
        If foundTrue = True Then
            shCD.Cells(i, 2).Copy
            VDCell.PasteSpecial Paste:=xlPasteValues
            Set VDCell = VDCell.Offset(1, 0) ' 更新目标单元格到下一行
        End If
        foundTrue = False ' 重置开关
    End If
Next i

Application.ScreenUpdating = True

关键修改点

  • 为所有嵌套的If添加了对应的End If,修复了循环结构的语法错误
  • 添加Exit For:找到重复编号后立即跳出内层循环,提升运行效率
  • 调整了代码缩进,让结构更清晰,便于后续维护
  • 修正了变量名笔误:原代码里的lrwI改为lrwVD,确保逻辑正确

额外优化建议(可选)

对于查找重复编号,用Range.Find方法比逐行循环更高效,尤其当数据量较大时,可以替换内层循环:

' 替换原内层For j循环的代码
If Not shVD.Range("A2:A" & lrwVD).Find(shCD.Cells(i, 2).Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
    foundTrue = False
End If

内容的提问来源于stack exchange,提问作者Bert_V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:28:39