我想在工作表(Sheet2)上创建一个包含产品和公式的表。对于不同的产品,适用不同的配方。 我想从该表中检索公式,但使用Sheet1中行的行号
如何输入使用Sheet1中正确的行号进行评估的公式。
我有一个可以评估文本字符串的UDF eval:
=eval(vlookup(Product;Table;2;false)
从表中检索的公式应该使用eval()所在的实际行的行号。
我尝试了以下内容:
="D"&ROW(Sheet2!$A16)&"/G"&ROW(Sheet2!$A16)&"/F"&ROW(Sheet2!$A16)&"*5"
这将检索公式,但eval()不会计算结果。
答案 0 :(得分:0)
在您的示例中, product 位于表第一列的16 th 行的Sheet2上。如果您想在工作表上使用16 th 行,则可以在完整列引用上使用MATCH function,放弃structured references 的ListObject表或者您可以在结构化表引用上使用MATCH并通过表进行调整来补偿' 表中的'位置标题行。
这可能令人困惑,所以这里有一个例子。
要找到 bcd 所在的实际工作表行,您可以使用其中一个公式。
=MATCH("bcd", Sheet2!B:B, 0)
=MATCH("bcd", Table2[a], 0)+ROW(Table2[#Headers])
第一个只返回工作表上的 6 行。第二个返回 2 ,因为bcd位于ListObject的.DataBodyRange property的第二行,并且由.HeaderRowRange property所在的行调整;例如2 + 4 = 6。
现在一切都很清楚,您需要做的就是使用其中一个公式的结果作为INDEX function中的 row_number 参数。
=INDEX(D:D, MATCH("bcd", Sheet2!B:B, 0))/
INDEX(G:G, MATCH("bcd", Sheet2!B:B, 0))/
INDEX(F:F, MATCH("bcd", Sheet2!B:B, 0))*5
'or,
=INDEX(D:D, MATCH("bcd", Table2[a], 0)+ROW(Table2[#Headers]))/
INDEX(G:G, MATCH("bcd", Table2[a], 0)+ROW(Table2[#Headers]))/
INDEX(F:F, MATCH("bcd", Table2[a], 0)+ROW(Table2[#Headers]))*5
您自己的公式可以使用一系列INDIRECT function来将构造的字符串转换为实际的单元格引用。但是,INDIRECT被认为是不稳定的,如果可能,最好避免使用。
=INDIRECT("D"&ROW(Sheet2!$A6))/INDIRECT("G"&ROW(Sheet2!$A6))/INDIRECT("F"&ROW(Sheet2!$A6))*5
答案 1 :(得分:0)
此解决方案基于Excel引用R1C1样式的单元格的功能。要使用它,您必须转到文件 - >选项 - > “公式”选项卡,并选中“使用公式”组中的“R1C1参考样式”框。 此外,您的 eval()函数必须能够评估此类公式。
一旦完成所有这些,您只需要检索公式。 为了使事情清楚,我将专注于一个例子。
下表是Sheet1(产品的“数据库”)的内容。
“公式”栏中包含相关公式:
对于苹果:RC [-2] + RC [-1]
对于巴南:RC [-2] * RC [-1]
柠檬:RC [-2] / RC [-1]
下表是Sheet2的内容:
这里的“公式”列包含从Sheet1中检索的公式。 “公式”栏的公式如下:
=FORMULATEXT(INDEX(Sheet1!R2C1:R4C4,MATCH(RC[-3],Sheet1!R2C1:R4C1,0),4))
可以在Excel帮助中找到此处使用的每个函数的说明( formulatext ,索引和匹配)。
可以看出,以R1C1样式表示的检索公式在Sheet2的上下文中是正确的,如果产品排列不同,并且可能出现不止一次。唯一剩下的工作是在适应评估R1C1风格的参考公式之后应用 eval()函数。
我希望它有所帮助。