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

我正在编写几个VBA函数来处理工作,遇到了一个应该很容易解决的问题,但是不pipe怎么样,尽pipe我在这里和Google上find了答案,但我仍然无法做到。 我写了一个函数,应该给我一个列中的两个string之间的范围:

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 

所以如果inputA和B在行100和105上,它应该返回B100:B105。 当我通过调整代码来读取FindRng = Range(…)。Address来testing这个,我确实得到$ B $ 100:$ B $ 105。

但是,当我然后将FindRng的结果input到一个自定义的索引匹配函数中时,我得到一个错误。 function如下:

  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的输出不是范围,而是作为该范围的内容:当我在另一个公式中embedded的FindRng上使用评估公式工具时,它将FindRng的输出显示为{A,B ,C,D,E}而不是$ B $ 100:$ B $ 105,其中A到E是范围内单元格的内容。 我有这样的感觉,解决scheme非常简单,但我没有看到。 定制的索引匹配function的function已经过testing,所有function都像魅力一样。

设置而不是让。 让一个expression式的值赋给一个variables。 Set将一个对象引用赋给一个variables。 您想要返回对范围对象的引用,而不是返回由范围对象的默认属性生成的值。

在VBA写作

 FindRng = Range(...) 

是隐含的写作

 Let FindRng = Range(...) 

随你怎么便

 Set FindRng = Range(...) 

编辑1:
了解VBA中的对象引用和值之间的区别是非常重要的。 这是一个类似的概念,通过价值或参照传递参数。 希望这两个链接有助于一些:
在MSDN上的Let语句
MSDN上的Set语句

编辑2:
哦,我想我应该碰到默认属性! 像范围这样的对象具有默认属性。 如果将范围视为值而不是对象,则它使用默认属性,而不是抛出错误,因为它不是一个对象。 在范围的情况下,默认属性是Value 。 所以,如果你说A = Range("A1") ,你实际上说的是Let A = Range("A1").Value当你可能意味着Set A = Range("A1") 。 所以你得到的是包含在单元格A1中的值,而不是代表该单元格的范围对象。

拿起你目前的代码应该都

  • 根据AndADM的通信使用Set
  • 维度SetRng作为范围而不是Variant

你可以简化你的function如下(这可以节省时间,如果你是反复调用它)

此外,你可以testing这个范围是Nothing (如果你的两个stringwerentfind),而你当前的代码将错误,如果任何string丢失。

 Function SetRng(str1 As String, str2 As String) As Range With Sheets("infCom").Columns(2) Set SetRng = Range(.Find(str1, , xlValues, xlWhole), .Find(str2, , xlValues, xlWhole)) End With End Function