VBA报错‘End If without block If’:双层For Each循环问题求助
解决VBA里的「End If without block If」错误
嘿,我来帮你搞定这个头疼的VBA错误!你遇到的「End If without block If」问题,本质是If语句的结构不匹配——VBA里有两种If写法,搞混了就会触发这个错误。
先搞懂两种If的规则
VBA里的If分两种,规则完全不一样:
- 单行If:把条件和执行代码写在同一行,比如
If Counter > 5 Then MsgBox "超过上限",这种写法不需要加End If,加了就会报错。 - 块If:把条件和执行代码分开写(换行),比如:
这种必须用If Counter > 5 Then MsgBox "超过上限" Counter = 0 End IfEnd If来闭合块结构,少加了也会报错。
结合你的代码找问题
从你给出的代码片段来看,大概率是你不小心把「单行If」和「块If」的规则搞混了:要么是写了单行If却多加了End If,要么是块If的结构没配对好(比如漏了Then,或者嵌套If时End If放错了位置)。
另外顺便提个小坑:你现在的变量声明Dim i1, j1 As Range其实只有j1是Range类型,i1会被默认设为Variant类型,正确的写法应该是每个变量单独指定类型:Dim i1 As Range, j1 As Range,同理Material, Customer, Price As String也要改成Dim Material As String, Customer As String, Price As String,避免后续出现莫名其妙的类型错误。
给你一个修正后的示例代码
基于你的需求,我写了一个简化的可运行版本,你可以对照调整自己的代码:
Sub SAP1C() ' 修正变量声明,每个变量指定类型 Dim i1 As Range, j1 As Range Dim Material As String, Customer As String, Price As String Dim MaterialStart As Object, CustomerStart As Object, PriceStart As Object Dim Counter As Integer ' 假设你要遍历B1到B100的范围,替换成你实际的单元格范围 Set i1 = Sheets("Invoice Prices").Range("B1:B100") Counter = 0 ' 遍历i1范围内的每个单元格 For Each j1 In i1 ' 块If写法,需要End If闭合 If j1.Value = "Material" Then Set MaterialStart = j1 Counter = Counter + 1 End If ' 单行If写法,不需要End If If j1.Value = "Customer" Then Set CustomerStart = j1 If j1.Value = "Price" Then Set PriceStart = j1 Next j1 ' 测试输出结果 MsgBox "找到" & Counter & "个Material标记,位置在" & MaterialStart.Address End Sub
最后检查步骤
- 逐行检查你代码里的每个
If ... Then:如果后面直接跟执行代码(单行),删掉对应的End If;如果是换行写代码块,确保有对应的End If闭合。 - 检查嵌套If的情况:每个内层的If都要和对应的
End If配对,避免嵌套混乱。
内容的提问来源于stack exchange,提问作者Ben Gerry
相关产品推荐
相关产品推荐

