我正在 Excel 2007 中创建 VBA 函数。其中一个函数有一个原型:
Function ToLevelCode_Range(val As Double, ByRef R As Range)
我可以这样调用它,并且得到正确的结果:
=ToLevelCode_Range(B2, Categories!D1:D4)
有一个例子,我希望第二个参数是一组特定的值:
=ToLevelCode_Range(B2, { 0.38, 0.78, 1.18, 1.58 })
这导致#VALUE,并且我甚至无法到达函数中的第一个断点。
我正在以编程方式生成电子表格,并且数组中的值的数量是可变的,因此我无法使用具有 5 个参数的函数等来执行此操作。我不知道 VBA 是否具有可变参数列表语法,但这将是一个选择。
我怎样才能让它工作?
答案1
ByRef 意味着您必须将对现有对象的引用(地址)作为参数传递,这样它才能与实际对象一起工作;而 ByVal 意味着您传递一个值,并且该值将被复制到接收参数中。
因此,您不能将值列表作为引用传递,您需要创建一个包含值的 Range 对象,然后将该对象(对该对象的引用)作为该参数传递。
这里的问题是,Range
Excel 中的对象是一组实际的单元格的表示,但我相信命名范围类将允许您以编程方式创建一个“虚拟”Range 对象,其中包含包含您的值的虚拟单元格,但我个人从未使用过它。:)
我相信 StackOverflow 上的这个问题与您的问题基本相同,值得一看:
答案2
如果将函数参数更改为
Function ToLevelCode_Range(val As Double, R As Variant)
它将接受范围和数组
当然,你需要在函数代码中处理不同的数据类型
当调用=ToLevelCode_Range(B2, Categories!D1:D4)
R 时将类型为Variant/Object/Range
当调用=ToLevelCode_Range(B2, { 0.38, 0.78, 1.18, 1.58 })
R 时将类型为Variant/Variant(1 to 4)