Worksheet_Change事件添加多组Do Until循环遇超限问题求助
问题分析与解决方案
核心问题
添加第二个循环后无法正常退出的主要原因有两点:
- 事件递归触发:修改E22单元格时会再次触发
Worksheet_Change事件,导致循环被重复调用,看起来像是无限循环 - 变量未重新初始化:如果复用同一个
i变量,第一个循环结束后i的值已经超过19,第二个循环直接从该值开始,导致循环条件判断失效
修正后的代码
Private Sub Worksheet_Change(ByVal Target As Range) ' 禁用事件,防止修改单元格时递归触发本事件 Application.EnableEvents = False ' 处理E21与I21的循环逻辑 CalculateCellPair Range("E21"), Range("I21") ' 处理E22与I22的循环逻辑 CalculateCellPair Range("E22"), Range("I22") ' 恢复事件触发 Application.EnableEvents = True End Sub ' 封装通用计算逻辑,避免重复代码 Private Sub CalculateCellPair(ByVal targetE As Range, ByVal targetI As Range) Dim i As Long i = 1 ' 初始化E列单元格值 targetE.Value = i ' 循环直到I列值小于1.02,或E列值达到19 Do Until targetI.Value < 1.02 Or targetE.Value = 19 targetE.Value = i ' 提前判断,满足条件则退出循环 If targetI.Value < 1.02 Then Exit Do End If i = i + 1 ' 强制终止条件:i超过19时退出 If i > 19 Then targetE.Value = 19 ' 确保最终E列值设为19 Exit Do End If Loop End Sub
关键改进点
- 禁用事件递归:在修改单元格前关闭
Application.EnableEvents,操作完成后恢复,避免事件反复触发 - 封装通用逻辑:把重复的循环代码封装成独立子过程
CalculateCellPair,只需传入对应的E、I列单元格,避免重复编写循环,同时保证每个循环的变量i独立初始化 - 明确终止逻辑:当
i超过19时,主动将E列单元格设为19,确保最终值符合要求,避免循环残留异常值
内容的提问来源于stack exchange,提问作者alex guna
相关产品推荐
相关产品推荐

