将范围从一个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