VBA宏中Find方法重置行参数,如何保留子过程的行范围?
问题原因与修复方案
原因
这是VBA参数传递机制导致的:CPEarson的SearchCodeModule函数里,SL、EL这类行号参数是按**引用传递(ByRef)**声明的。当你把原有的Start_row、End_row直接作为实参传进去时,函数内部找到匹配后修改这些参数的值,会直接同步到你代码里的原变量上,相当于把你原本的搜索范围给覆盖了,自然后续循环没法用原来的范围。
修复方法
有两种简单可行的解决方式:
临时变量隔离法:每次调用
SearchCodeModule前,先把原范围的行号复制到临时变量里,用临时变量作为参数传入。比如:Dim tempSL As Long, tempEL As Long tempSL = Start_row tempEL = End_row ' 用tempSL和tempEL调用函数 Call SearchCodeModule(..., tempSL, tempEL, ...)这样函数修改的只是临时变量,原有的
Start_row和End_row能保持初始值,不影响后续循环。强制按值传递:在调用函数时,给实参加上括号,强制VBA按值传递参数(传递副本),函数内部的修改就不会影响原变量。比如:
Call SearchCodeModule(..., (Start_row), (End_row), ...)注意这种方式只适用于Sub过程,要是函数有返回值,调用时可能需要调整写法。
如果能拿到SearchCodeModule的源码,也可以把参数声明改成ByVal(按值传递),但要是用的现成模块,前面两种方法更省事。
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

