excel - 将一个范围从一个 VB 函数传递到另一个函数

标签 excel vba

我正在为工作编写一些 VBA 函数,并遇到了一个应该很容易解决的问题,但不知何故我无法解决,尽管我尽了最大努力在这里和 Google 上找到答案。我编写了一个函数,它应该给出列中两个字符串之间的范围:

Function FindRng(StartRng As String, EndRng As String) As Variant
Dim TopOfRange As Single
Dim BottomOfRange As Single

TopOfRange = WorksheetFunction.Match(StartRng, Sheets("InfCom").Range("B:B"), 0)
BottomOfRange = WorksheetFunction.Match(EndRng, Sheets("InfCom").Range("B:B"), 0)

FindRng = Range(Sheets("InfCom").Cells(TopOfRange, 2), Sheets("InfCom").Cells(BottomOfRange, 2)) 
End Function

因此,如果输入 A 和 B 位于第 100 行和第 105 行,则应返回 B100:B105。当我通过调整代码来读取 FindRng = Range(...).Address 来测试这一点时,我确实得到了 $B$100:$B$105。

但是,当我将 FindRng 的结果输入自定义索引匹配函数时,出现错误。功能如下:

 Function subsetPBPC(rngReturn As Range, LookupValueH As Variant, TopOfRange As String, BottomOfRange As String, LookupValueV As Variant) As Variant

subsetPBPC = sPBPC(rngReturn, LookupValueH, FindRng(TopOfRange, BottomOfRange), LookupValueV)

 End Function

问题在于,它似乎不是将 FindRng 的输出读取为范围,而是读取为该范围的内容:当我在嵌入另一个公式的 FindRng 上使用“评估公式”工具时,它将 FindRng 的输出显示为 { A,B,C,D,E} 而不是 $B$100:$B$105,其中 A 到 E 是范围内单元格的内容。我感觉解决方案非常简单,但我不明白。定制索引匹配功能的底层功能已经过测试,一切都非常有效。

最佳答案

设置而不是让。 Let 将表达式的值赋给变量。 Set 将对象引用分配给变量。您想要返回对范围对象的引用,而不是返回范围对象的默认属性生成的值。

用VBA编写

FindRng = Range(...)

正在隐式写入

Let FindRng = Range(...)

随心所欲

Set FindRng = Range(...)

编辑1:
了解 VBA 中对象引用和值之间的区别非常重要。这是与按值或按引用传递参数类似的概念。希望这两个链接有所帮助:
The Let statement on MSDN
The Set statement on MSDN

编辑2:
哦,我想我应该谈谈默认属性!某些对象(例如范围)具有默认属性。如果将范围视为值而不是对象,它将使用默认属性而不是抛出错误,因为它是对象而不是值。对于范围,默认属性是Value。因此,如果您说 A = Range("A1"),那么您实际上是在说 Let A = Range("A1").Value,而您的意思可能是 >设置 A = 范围("A1")。因此,您将获取单元格 A1 中包含的值,而不是表示该单元格的范围对象。

关于excel - 将一个范围从一个 VB 函数传递到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886850/

相关文章:

vba - 更改存档所有工作表中的单元格公式

.net - 通过 COM 将对象从 VBA 传递到 .NET 时不一致

excel - 使用具有动态范围的自动过滤器

excel - 如何在VBA中高效创建子数组?

python - pandas 支持按列标签读取 Excel 数据吗?

python - pandas 中导入 Excel 文件的多重索引问题

python - 在 Excel 列中将文本与 URL 分开

python - 读取 excel 并将索引转换为 datetimeindex Pandas

excel - 打开用户指定的 Excel 工作簿并将数据范围复制到另一个工作簿

vba - 区分VBA中同名的类成员和参数?