ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1403|回复: 9

[求助] 匪夷所思!为何For...Next配合On Error GoTo Line语句时会因多循环1次而报错???

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-7 12:22 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 大虾小菜 于 2018-8-7 12:35 编辑

各位大神,小弟近日在编程中遇到了一个匪夷所思的问题,就是在On Error GoTo Line语句和For...Next语句搭配使用的时候,即使给For循环明确指定了范围和步长,最后还是会比指定的范围多循环一次,并且导致报错。但如果我把On Error GoTo Line语句删除,则程序恢复正常。


请问这是什么原因呢?提前拜谢各位大神了~


问题代码如下:
  1. Sub 测试代码_1()
  2. On Error GoTo line
  3. Dim a As Long
  4.   
  5.   For a = 10 To 6 Step -2
  6.     Debug.Print a
  7.   Next a
  8.   
  9. line:
  10.     MsgBox a
  11. End Sub
复制代码
问题代码的运行过程:a会依次取值10、8、6、4,并在取值为4的时候报错,进入Line模块。但我明明限制了a的范围是从10递减到6的。。。

正常代码如下:
  1. Sub 测试代码_2()
  2.   
  3.   Dim a As Long
  4.   
  5.   For a = 10 To 6 Step -2
  6.     Debug.Print a
  7.   Next a
  8.   
  9. End Sub
复制代码
正常代码执行情况符合预期。

TA的精华主题

TA的得分主题

发表于 2018-8-7 12:31 | 显示全部楼层
这个代码不可能报错,是你没有理解冯诺依曼先生的理论:程序依序执行。

for循环完,接着就执行msgbox语句,一点问题都没有。你不想msgbox,需要有退出机制,加一句:Exit Sub

Sub 测试代码_1()
On Error GoTo line
Dim a As Long
  
  For a = 10 To 6 Step -2
    Debug.Print a
  Next a
  Exit Sub
line:
    MsgBox a
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-7 12:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ivccav 发表于 2018-8-7 12:31
这个代码不可能报错,是你没有理解冯诺依曼先生的理论:程序依序执行。

for循环完,接着就执行msgbox语 ...

没有理解您的意思,我的msgbox函数是在Line 模块里的,难道不是在报错的情况下,才会触发这个Msgbox函数的吗?

TA的精华主题

TA的得分主题

发表于 2018-8-7 12:41 | 显示全部楼层
大虾小菜 发表于 2018-8-7 12:33
没有理解您的意思,我的msgbox函数是在Line 模块里的,难道不是在报错的情况下,才会触发这个Msgbox函数 ...

Line只是一个标签,如果出错,就goto转到该位置,这点你已经理解。

但如果程序不出错,计算机将依序执行所有的代码,Line标签后面的代码同样会执行。

所有的错误处理代码的标签前面,都有Exit Sub退出语句的,多看看、多练练吧,很简单的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-7 12:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ivccav 发表于 2018-8-7 12:31
这个代码不可能报错,是你没有理解冯诺依曼先生的理论:程序依序执行。

for循环完,接着就执行msgbox语 ...

按照您调整的代码执行了一下,的确没有问题了。但我还是有疑问,为啥我原来的代码需要加exit sub这个退出机制呢?

按照我原来的代码,我已经给a设定了区间和步长,就是从10到6,每次递减2,难道不是递减到6之后,就应该停止循环了吗?为什么还是继续循环到4,从而报错呢???

麻烦请教一下,谢谢~~~

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-7 13:03 | 显示全部楼层
ivccav 发表于 2018-8-7 12:41
Line只是一个标签,如果出错,就goto转到该位置,这点你已经理解。

但如果程序不出错,计算机将依序执 ...

我的理解是,既然我已经给a限定了10递减到6,那么即使没有报错也会运行Line标签后面的代码,那msgbox窗口也应该显示6,而不应该多循环递减到4,但是实际运行中就是递减到了4(msgbox显示的),而在debug窗口并没有显示4,因此可以肯定是for循环多循环一次,导致报错进入到了Line标签。

所以我就想问,为什么没有退出机制,for循环会超过我预先设定的范围,循环到了4???

谢谢大神

TA的精华主题

TA的得分主题

发表于 2018-8-7 13:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
For/Next按你设定的参数,以-2的步长依次递减,当a在设定的范围内(10递减到6),它就运行循环体中的指令。就像你理解的一样。
但,For它有个惯性,递减到6以后,它还继续递减,下一个a值自然是4,这个a值,显然超出了设定的范围,于是,For停止脚步,退出循环。
For a=1 to 10
Next
结束循环后,a值是11,而不是10,试试就明白。

TA的精华主题

TA的得分主题

发表于 2018-8-7 13:52 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 duquancai 于 2018-8-7 14:05 编辑
大虾小菜 发表于 2018-8-7 13:03
我的理解是,既然我已经给a限定了10递减到6,那么即使没有报错也会运行Line标签后面的代码,那msgbox窗口 ...


看过其它大多语言的 for循环吗?类比一下VBA中的for i 循环吧!原理一样。

for(i=10;i>=1;i--);

for(i=1;i<=10;i++);

for i=1 to 10 step 1
next
解释:i=1 赋初始值
to 10   相当于表达式 i<=10 用于条件判断,如果为真 循环,如果为假 退出循环
step 1  相当于 i++  相当于 i=i+1

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-7 13:57 | 显示全部楼层
山菊花 发表于 2018-8-7 13:33
For/Next按你设定的参数,以-2的步长依次递减,当a在设定的范围内(10递减到6),它就运行循环体中的指令。 ...

拜谢大神,终于解释了我的疑惑了,原来for是这么个原理,谢谢~~~~

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-7 14:33 | 显示全部楼层
duquancai 发表于 2018-8-7 13:52
看过其它大多语言的 for循环吗?类比一下VBA中的for i 循环吧!原理一样。

for(i=10;i>=1;i--);

谢谢大神,又学习了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 16:49 , Processed in 0.025443 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表