将值而不是范围传递给VBA功能


0

我正在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是否具有可变参数列表语法,但是将是一个选择。

我该如何工作?

Answers:


2

ByRef意味着您必须将对现有对象(地址)的引用作为参数传递,以便它可以与该实际对象一起使用。vs. ByVal,这意味着您将传递一个值,并且该值将被复制到接收参数中。

因此,您不能将值列表作为引用传递,您需要创建一个保存值的Range对象,然后将(对该对象的引用)作为该参数传递。

这里的问题是RangeExcel 中的对象表示一组实际的单元格,但是我相信NamedRange类将允许您以编程方式创建一个“虚拟” Range对象,其中虚拟单元格包含您的值,但是我已经从未亲自使用过。:)

我相信StackOverflow上的这个问题(基本上)与您的相同,并且值得一试:

Microsoft Excel:以编程方式创建隐藏的命名范围


您的谷歌搜索技能掩盖了您的编程本能。
surfasb 2011年

@surfasb你知道,直到我问了你,直到现在我才终于掌握了你的意思,以及如何理解它。:)在这种情况下,我使用半熟练的谷歌搜索技巧来确保自己(仍然)理解VBA中的指针,并使用链接填写答案。;)
Ƭᴇcʜιᴇ0072011年

是的,我可能应该这样说:“……掩盖了您缺乏编程的本能:)”这种矛盾会使反讽更加明显。
surfasb 2011年

0

如果将功能参数更改为

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.