Excel宏陷入无限循环:循环调用函数时无法递增
问题根源:参数传递篡改了循环变量
你的无限循环问题核心出在函数参数的传递机制上:
VBA自定义函数的参数默认是ByRef(按引用传递),也就是说BldQty里的scol和主宏的循环变量x指向同一内存地址。当函数内执行scol = scol - 1时,主宏里的x会被同步减1。
主宏循环是x = 9 To 14,每次调用函数后x被减回8,下一次循环开始又被重置为9,永远无法达到14,最终陷入无限循环。
修复方案
1. 修改参数为按值传递
把BldQty的scol参数声明改为ByVal scol As Integer,这样函数内对scol的修改只会作用于局部变量,不会影响主宏的循环变量x:
Function BldQty(xRng As Range, ByVal scol As Integer) As Long Dim shrt As Worksheet: Set shrt = Worksheets("Shortages") Dim sTbl As ListObject: Set sTbl = shrt.ListObjects("Shortages_T") Dim use As Worksheet: Set use = Worksheets("Useage") Dim uTbl As ListObject: Set uTbl = use.ListObjects("UseTable") Dim Cell As Range Dim mdl As String Dim qp As Double Dim div As Double Dim minVal As Double BldQty = xRng(1).Value scol = scol - 1 ' 现在修改的是局部变量,不会影响主宏的x minVal = Application.WorksheetFunction.Min(xRng) For Each Cell In xRng If minVal <= 0 Then BldQty = 0 Exit For Else mdl = Cell.Offset(0, -scol).Value ' 处理Find可能找不到的情况 Dim findResult As Range Set findResult = uTbl.ListColumns("Component").DataBodyRange.Find(mdl) If Not findResult Is Nothing Then qp = findResult.Offset(0, 1).Value div = Cell.Value / qp If div < BldQty Then BldQty = div End If Else BldQty = 0 Exit For End If End If Next Cell End Function
2. 额外优化点
- 提前计算
xRng的最小值,避免每次循环重复调用Min函数,提升效率 - 增加
Find方法的空值判断,避免因找不到匹配组件导致的运行时错误
修复后执行逻辑
修改后,主宏的x会正常从9递增到14,每次调用BldQty传递的是x的副本,函数内的修改不会干扰循环变量,从而跳出无限循环。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

