![Excel:使用公式中的单元格引用来引用另一个单元格中的公式](https://linux22.com/image/1516320/Excel%EF%BC%9A%E4%BD%BF%E7%94%A8%E5%85%AC%E5%BC%8F%E4%B8%AD%E7%9A%84%E5%8D%95%E5%85%83%E6%A0%BC%E5%BC%95%E7%94%A8%E6%9D%A5%E5%BC%95%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%8D%95%E5%85%83%E6%A0%BC%E4%B8%AD%E7%9A%84%E5%85%AC%E5%BC%8F.png)
我加入只是为了问这个问题,因为我不确定没有 VBA 是否可以实现。
在 AI 列中有一个值列表,假设 A1:A9 分别包含值“1000”到“9000”。
在 B1 中,我正在像这样计算值(在单元格中添加文本)=“SDLT“&COUNT(A4,A7)&“单位”,结果为“SDLT 2单位”。
我的问题是如何让 C3 显示 B1 中引用的单元格的组合值?(本例中结果应为“11000”)。
我尝试使用 INDIRECT 和 MID 来寻找参考,但没有成功。
提前致谢
答案1
根据我的评论,您可以例如在以下位置执行此操作C1
:
=SUM(INDIRECT(MID(FORMULATEXT(B1),FIND("(",FORMULATEXT(B1))+1,2)),INDIRECT(MID(FORMULATEXT(B1),FIND(")",FORMULATEXT(B1))-2,2)))
这做出了一些假设:
- 公式中只指定了两个单元格
B1
- A 列中的值列表永远不会超出第 9 行
- 中的公式
B1
仅包含一对括号
这些问题也可以通过其他方式解决,但希望以上内容至少能为您提供解决方案的起点。
答案2
以下工作:
=SUM(INDIRECT(FILTERXML("<group><element>"&SUBSTITUTE(MID(FORMULATEXT(B1),SEARCH("COUNT(",FORMULATEXT(B1))+6,SEARCH(")",FORMULATEXT(B1),SEARCH("COUNT(",FORMULATEXT(B1)))-(SEARCH("COUNT(",FORMULATEXT(B1))+6)),",","</element><element>")&"</element></group>","/*/*")))
我们过去常常以这种方式编写函数,除了使用GET.FORMULA()
旧的 Excel 4 宏命令。当然,现在FORMULATEXT()
完全没有必要这样做了。
然后,从字符串中剥离出所需的内容,将各部分放入(辅助)命名范围中,并使用EVALUATE()
旧宏命令将它们重新组合到实际命名范围内,以处理任何无法简单排列的内容。但经过更多努力,现在可以使用上述创建 XML 字符串并解析它的技巧轻松地将参数的各个部分(这里是一个简单的参数,因此不需要花费太多精力)分开FILTERXML()
。
然而,INDIRECT()
仍然需要将这些文本结果转化为SUM()
可以正确使用的真实参考。
(如果感兴趣的话,创建函数的旧方法基本上就是调用某个东西,比如也许,然后它会通过旧的和以后的SPLITCELL
方式使用,如下所示:ISERROR()
IFERROR()
=IFERROR(OURLOOKUP(A3,D1:F2000,-2),OURLOOKUP)
并且,当然它会错误地返回命名范围本身,其辅助命名范围会分解上述公式以获取参数字符串并将适当的内容返回到最终结果命名范围(OURLOOKUP
在本例中)。
正如我所说和指出的,随着 Excel 不断添加功能,许多工作都得到了简化,尤其LET()
是允许您使用单元格内命名范围而不是文字传统命名范围的功能。但做到这一点从来都不是一件容易的事,而且您永远不会将其构建为采用所有可能的方式将参数提供给普通 Excel 函数。您期望的方式只是让您自己的用户输入它们。因此,可能OURLOOKUP
只接受单个单元格引用,而不是范围、命名范围、表引用、数组常量……作为查找值,并且可能只接受文字范围作为查找范围。但我们的(INDEX/MATCH
在后台使用)可以采用“负”返回列。(老板从来没有理解过INDEX/MATCH
的逻辑。实际上,使用OURLOOKUP
阻碍了我很多年,因为我很少需要使用它,因为我更喜欢VLOOKUP()
几种方式,并且自己在任何工作中都使用它INDEX/MATCH
。
一旦完成,就无需费力工作。只需将函数导入到需要它的电子表格中,但我们只需将一个页面从包含该函数的电子表格复制到新电子表格,然后删除该页面,就大功告成了!
现在LAMBDA()
应该为我们做这种事情,但是...它也需要导入到每个电子表格中...但它需要所有参数类型,这是一个巨大的改进。而且不再需要解析和转换,或者使用IFERROR()
,这两者都非常好,并且增加了许多便利性。我们仍然有OURLOOKUP
虽然和其他一些。另一件好事是,LAMBDA()
它的创建容易应该让我们比以前更多地使用它,但我们还没有用太多。奇怪。
但是无论微软如何宣传“图灵完备”等等,您始终可以仅使用桌面资源编写自己的函数,而不需要 VBA,尽管从技术上讲,当我们必须调用 Excel 4 宏命令时,那是在使用非桌面资源,所以...在我看来是 potAto、potAHto,但我想,在别人的书中不是这样。)
当然,以上内容有助于了解LET()
2016 年所没有的年份,如果需要的话,也可以将其制成LAMBDA()
。
然而,它确实展示了一种使用源公式作为衍生利益的基础的简单方法,这样做可以确保每个公式中的指称项保持链接在一起。
这并不是说该方法是强大的,因为对源公式结构的变化(特别是从直接单元格引用更改为范围等,会破坏其构造假设 - 并且许多其他变化可能需要后续工作)。
如今 (2022),可能有一个公式中LAMBDA()
包含IF()
分支的函数,这样如果单元格地址是 B1,它就会执行字符串,如果是 C3,它就会执行字符串,SUM()
这样输入参数就可以以任何 Excel 可以接受的方式输入,而输出始终使用完全相同的输入,对于每个单元格,这样它们就始终连接在一起了。将任何一个结果移动到另一个单元格只需要对测试IF()
本身进行简单的更改,而不是参数或公式,因此易于维护。