Excel VBA For循环编译失败 提示End If无对应If语句求解
错误原因
两个核心问题直接导致编译报错+逻辑不符合预期:
- 多余的
End If:内层判断If source_total_hours = "TOTALE ORE" Then Exit For是单行If写法,这种语法不需要配套End If。你在内层循环后写的那个End If会提前闭合外层的日期匹配判断,导致代码最后真正对应外层判断的End If找不到匹配的If,直接触发编译错误。 - 遍历范围完全写错:
source_month.Offset(50, 0)是单个单元格(仅指向目标单元格往下第50行的那一个格),根本不是“从目标单元格开始向下扫描50行”的范围,完全达不到你要的查找效果。
修正后可运行代码
Dim found_total As Range Set found_total = Nothing For Each source_month In wb_source.Range("A1:A600") If source_month.Value = "01/05/2022" Then ' 修正范围:从目标单元格下一行开始,A列向下取50行作为查找区域 For Each source_total_hours In source_month.Offset(1, 0).Resize(50, 1) If source_total_hours.Value = "TOTALE ORE" Then Set found_total = source_total_hours Exit For End If Next source_total_hours ' 没找到"TOTALE ORE"时跳过后续取数,避免引用错误单元格 If Not found_total Is Nothing Then ' 取TOTALE ORE所在行向右偏移3列开始的50个单元格数值 For Each source_hours In found_total.Offset(0, 3).Resize(1, 50) If IsNumeric(source_hours.Value) Then hours_list.Add source_hours.Value End If Next source_hours ' 取目标单元格下一行开始A列50行的日期,如果你要横向取同一行日期就把Resize改成(1,50) For Each source_date In source_month.Offset(1, 0).Resize(50, 1) If IsDate(source_date.Value) Then date_list.Add source_date.Value End If Next source_date End If End If Next source_month
注意事项
- VBA里If分两种写法:单行If(
If 条件 Then 执行语句全写在一行)不需要End If;块If(Then后换行写多行逻辑)必须配套End If闭合,不要混用。 Resize(行数, 列数)如果省略其中一个参数,会默认保持当前单元格的对应维度,比如单个单元格调用Resize(,50)就是取1行50列的横向区域,Resize(50,)才是取50行1列的纵向区域,根据你实际表格的行列结构调整参数即可。- 新增
found_total变量存储找到的目标单元格,避免50行范围内没找到"TOTALE ORE"时,后续代码错误引用遍历结束的位置取数。
内容的提问来源于stack exchange,提问作者Simon Riccio
相关产品推荐
相关产品推荐

