VBA代码运行提示Next without For错误该如何解决?
错误原因与修复方案
Next without For报错的直接原因是代码中If CompletedField = "No" Then没有对应的End If闭合,VBA编译时无法匹配层级结构,就会抛出该错误。除此之外你的代码还存在多处逻辑错误,无法实现需求,完整修复后的代码如下:
Sub SplitDataByAddress() Dim AddressField As Range Dim AddressName As Range Dim NewWSheet As Worksheet Dim WSheet As Worksheet Dim WSheetFound As Boolean Dim DataWSheet As Worksheet Set DataWSheet = Worksheets("Data") Set AddressField = DataWSheet.Range("A4", DataWSheet.Range("A4").End(xlDown)) Application.ScreenUpdating = False For Each AddressName In AddressField ' 先判断当前行Completed是否为N,不是就直接跳过 If UCase(AddressName.Offset(0, 4).Value) = "N" Then WSheetFound = False ' 遍历工作表判断是否已存在对应地址的表 For Each WSheet In ThisWorkbook.Worksheets If WSheet.Name = AddressName.Value Then WSheetFound = True Exit For End If Next WSheet If WSheetFound Then ' 已有工作表就追加数据 AddressName.Resize(1, 5).Copy _ Destination:=Worksheets(AddressName.Value).Range("A" & Rows.Count).End(xlUp).Offset(1, 0) Else ' 没有就新建工作表,先复制表头再复制数据 Set NewWSheet = Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) NewWSheet.Name = AddressName.Value DataWSheet.Range("A3", DataWSheet.Range("A3").End(xlToRight)).Copy Destination:=NewWSheet.Range("A3") AddressName.Resize(1, 5).Copy Destination:=NewWSheet.Range("A4") End If End If Next AddressName ' 所有表自动适配列宽 For Each WSheet In ThisWorkbook.Worksheets WSheet.UsedRange.Columns.AutoFit Next WSheet Application.ScreenUpdating = True End Sub
主要修改点
- 补全了缺失的
End If语句,修复编译报错 - 删除了全局的CompletedField变量,改为取当前Address单元格向右偏移4列(对应E列Completed)的值判断,判断值改为需求要求的"N",同时加了Ucase避免大小写问题
- 调整了判断逻辑顺序,先判断当前行是否符合复制条件,不符合直接跳过,减少无意义的遍历操作
- 修正了已有工作表追加数据的定位逻辑,用
Range("A" & Rows.Count).End(xlUp)替代原来的Range("A3").End(xlDown),避免空表时定位到最后一行的问题 - 修正了工作表名称判断的逻辑,统一用AddressName.Value取值,避免隐式类型转换错误
内容的提问来源于stack exchange,提问作者JBird100
相关产品推荐
相关产品推荐

