我使用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]
非常感谢任何指针。
答案 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功能,可以记录下来并进行简化。