R1C1表示法中的HLOOKUP

时间:2014-10-16 13:17:16

标签: excel excel-vba excel-formula vba

我使用Excel VBA在给定行的末尾插入HLOOKUP函数。我一直试图在VBA中使用R1C1功能来插入HLOOKUP函数,该函数在Excel中应如下所示:

=HLOOKUP(D2,'DM NYASSOV'!3:34,32,0)

我的问题是我需要HLOOKUP足够动态,它可以引用要粘贴HLOOKUP函数的同一行中的变量。

目前我的VBA内容如下:

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)"

RC[-17]引用了我正在寻找的变量;
RC[-19]是基础书/标签标识符;
RC[2]包含初始行值和
RC[3]包含最后一行参考范围。

我的主要问题是正确识别动态范围选择:

'DM NYASSOV'!3:34 / 'DM RC[-19]!'RC[2]:RC[3]

非常感谢任何指针。

1 个答案:

答案 0 :(得分:1)

我认为你在这里有一些问题。首先是使用VBA动态构建一个公式,然后计算第三个值,然后在最终计算结果的公式中使用该值。对于可以使用在前端构建的公式或通过后端的VBA计算的值,这似乎是一个不必要的运行周期。第二个是所有动态查找。这不是一个问题,而是当你跳过四个篮球时要记住很多。同样......

HLOOKUP的第一个参数可以是“SM1804”之类的值,也可以是对包含“SM1804”的单元格的引用。您可以使用VBA将此值直接带入公式,并通过必须在公式处理时查找该值来保存Excel一些处理:

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(" & Sheets(selectTab).Cells(r, 21).Offset(0, -17).value & ",'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)"

或者你可以在那里坚持对细胞的引用(这就是你现在正在做的事情):

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],'DM RC[-19]!'RC[2]:RC[3],RC[3]-RC[2]+1,0)"

关于第二个参数...我相信你在DM!RC[-19]中有一个工作表名称这是完全正常的,但你需要使用'间接'将该工作表名称输入HLOOKUP公式:< / p>

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],Indirect("'" & DM!RC[-19] & "'!RC[2]:RC[3]"),RC[3]-RC[2]+1,0)"

......这就是事情变得有点棘手的地方。例如,如果在DM!RC [-19]中你有工作表名称“Sheet1”,那么间接将返回:'Sheet1'!RC [2]:RC [3]并且您的HLOOKUP将使用该范围来执行查找...在具有两个单元格的范围上执行HLOOKUP没有多大意义。因此,我假设您在RC[2]RC[3]中有数字值表示行。所以间接看起来应该是这样的:

ThisWorkbook.Sheets(selectTab).Cells(r, 21).FormulaR1C1 = "=HLOOKUP(RC[-17],Indirect("'" & DM!RC[-19] & "'!R" & RC[2] & "C:R" & RC[3] & "C"),RC[3]-RC[2]+1,0)"

现在,如果您的RC[2]的值为“4”且RC[3]的值为“20”,则您的间接将返回:'Sheet1'!R4C:R20C并且您的HLOOKUP将使用该值作为范围它将会查找。

您还在RC[2]RC[3]对这些值进行了一些数学运算,因此可能都很好,不需要更改。你只需要记住VBA将作为一个公式返回什么,然后从Indirect得到什么样的公式,然后得到HLOOKUP得到的结果。

通过直接在单元格中编写公式并向下复制,或者直接在VBA中直接执行HLOOKUP功能,可以记录下来并进行简化。