我目前正在开发一个使用不同东西的列表模板,比如标题生成器。这个生成器根据给定的数据使用大量 if 语句。我已将此生成器分解为针对每种数据类型的不同函数,以便我可以编辑这些单独的函数以供以后使用。
我遇到的难题是创建一个引用不同单元格中公式的算法。我希望此算法根据给定的数据执行特定公式。例如,我可以在 A 列中输入数据类型,在 B 列中输入数据公式。对于 A 列中的每个项目,B 列中都有一个唯一的公式。这就是我的函数表中的内容。在另一张表中(我们称之为数据表),我有一个包含大量不同数据的表格。其中一列是数据类型,它包含的数据类型与我的公式表中的数据类型相同。在此表中,我希望根据此数据表中的数据类型执行公式表中的精确公式。
我使用了 formulatext(),它返回了我需要的公式。我的问题是我想执行这个公式,而不是接收一长串的公式。
答案1
如果你愿意相信我,某件事存在的时间足够长,值得你去真正尝试它,那么至少有一种方法。
在 VBA 之前,Excel 有一种宏语言。当他们将 VBA 添加到程序中时,他们保留了旧的宏语言。人们认为它是为了向后兼容,并且正如暗示的那样,它会在未来的某个版本中消失。好吧,它从未消失过。它实际上功能齐全,如果有人想激活它,一切都在那里。
不过,你并不需要“全部”功能,而且非常令人高兴的是,它所具有的那些有意义的功能,可以说,即使不使用完整软件包,现在仍然有效。事实上,微软的在线帮助中有证据表明它永远不会消失,所以它可能会永远存在,在他们开始说它可能会消失 25 年后,一切都会像以前一样工作。
但问题是,它们不能在(您的选择)实际的 Excel 4 宏(安装的整个过程,以及用它构建的宏页面)之外工作,OR
在命名范围之内,Excel 可以在宏用途之外理解这些功能。
EVALUATE()
是这里感兴趣的函数。它可以对公式字符串(任何在后面输入的字符串,如果输入的是构成正确地址的任何字符串,=
则有意义)执行什么操作。INDIRECT()
这正是您所要求的。除了 VBA 之外,您编写的实际“执行类型”宏或 UDF 就是the only way available in Excel
。因此,如果您不知道或不想使用 VBA 解决方案,而是需要可以在 中工作的东西Formula World
,那么这就是唯一的选择。老实说,几乎如此,但肯定是最简单、最容易理解和构建的。
因此,首先您需要进行设置。您有设置、想要输出所有内容的位置以及包含公式的位置。根据需要替换以下内容。下面我所做的是针对单元格 A1:A5 中的数据、我可能希望在 B1:B3 中使用的三个公式、C1 中的查找值、C2 中我想要的公式的单元格引用以及我现在要显示其内容的命名范围:
=EVALUATE(FORMULATEXT(INDIRECT(Sheet1!$C$2)))
再次强调,这个will not work cell-side
。它只在命名范围内起作用,在其他地方不起作用。
INDIRECT()
获取 C2 中的单元格引用并将其传递给FORMULATEXT()
在 C2 中指定的单元格中获取公式的函数。该文本字符串被传递给函数,EVALUATE()
该函数将其视为“真正的男孩”。输入公式:
=horse
(horse
这是我为命名范围使用的名称)
在您想要的单元格中,输出将给出您想要的内容。
另一种方法是将公式构建得非常相对。可能必须为工作中的每个单元格构建一个相对集合,以便它们可以输出结果。如果要将它们“复制”到列中,则必须格外小心。因此,即使可以想象这样做,但设置起来将是一场可怕的噩梦,扩展用途又是一场噩梦,而使用列又是一场噩梦。
EVALUATE()
另一方面,它简单而直接。它完全符合您已完成的工作。它是您在已完成的工作中需要的最后一步,简单易用。
但是尝试EVALUATE()
命名范围功能之外的功能,尝试在单元格内使用它,它会告诉你没有这样的功能。坚持这样做,你不会成功,而是会加入那些犯错的人的名单,然后坚持认为它根本不存在,而不是找出问题所在。我觉得你想要成功,所以记住:EVALUATE()
在命名范围内使用,否则就根本不用。