Excel VBA双层For Next循环跳行跳列问题排查求助
解决VBA循环跳过行/列的问题:别手动修改循环变量!
嘿,我一眼就揪出问题所在了——你在For...Next循环里手动递增循环变量,这直接导致每次循环都多走一步,自然就跳过了一行和一列!
核心错误原因
For...Next循环的工作逻辑是:初始化变量后,每次执行到Next语句时,会自动把循环变量增加默认步长(也就是1)。但你在循环内部手动加了i = i + 1、iweek = iweek + 1、i2 = i2 + 1、i3 = i3 + 1,这就相当于循环变量被加了两次,步长直接变成2,所以才会跳过一半的行和列。
举个最直观的例子,你的外层循环:
For i = 1 To AantalPag ' ... 你的业务代码 i = i + 1 ' 手动加1 Next i ' 这里又自动加1
第一次循环i=1,手动加1变成2,Next i再把i变成3——直接跳过了i=2的迭代,也就是跳过了一行。其他嵌套循环的问题也是完全一样的逻辑。
修正后的代码
把所有循环内部手动递增循环变量的代码删掉,让For...Next自己处理迭代逻辑:
For i = 1 To AantalPag GezSite = BeginCel.Offset(i + 1) ' 注:如果这里的偏移逻辑不对可以调整,比如是否应该用Offset(i)? For iweek = 1 To AantalWeek GezWeek = BeginCel.Offset(0, iweek) For i2 = 1 To AantalWeekData If BeginCelData.Offset(i2 - 1) = GezWeek Then For i3 = 1 To AantalSitesData If BeginCelData.Offset(0, i3) = GezSite Then Sommetje = Sommetje + BeginCelData.Offset(i2 - 1, i3 - 1) End If ' 删掉原来的i3 = i3 + 1 Next i3 End If ' 删掉原来的i2 = i2 + 1 Next i2 BeginCel.Offset(i, iweek) = Sommetje Sommetje = 0 ' 删掉原来的iweek = iweek + 1 Next iweek ' 删掉原来的i = i + 1 Next i
额外小提示
- 关于
GezSite = BeginCel.Offset(i + 1):如果i从1开始,第一次循环会取BeginCel下面第2行的内容。如果你本来想取第i行(比如i=1对应BeginCel下面第1行),应该改成Offset(i),这个可以根据你的实际数据结构调整。 - 效率优化:多层嵌套循环如果数据量大的话会很慢,后续可以考虑用
Range.Find方法或者字典来实现匹配,比逐行逐列循环高效得多,但先解决当前的跳步问题再说。
内容的提问来源于stack exchange,提问作者JeroenAnimalRescuer
相关产品推荐
相关产品推荐

