Excel:如何parsing/投射文字为公式?

是否可以在MS Excel中parsing/投射文本(如“= A1 + A2”)作为公式? 我想从文本中创build一个公式 – 其中一些只会在稍后由用户input。

如果INDIRECT()函数不仅仅用于引用单元格,那么我可以input这个= INDIRECT(“= A1 + A2”)。

我知道你可以通过简单地添加更多的隐藏列来进行子计算来解决这个问题。 但为了可扩展性和效率,我宁愿做上面的事情。

我在这里和这里发现了一个类似的问题,但他们不能解决我的问题。


现实世界的问题:

请继续阅读,以便更好地理解为什么要这样做

脚本

列表中的每个项目都包含一个string,每个string包含1到5个帐户名称。 每个帐户名称后面都有括号中的帐号。 数字的长度决定了帐户的types。 帐号的一部分是date,其date格式取决于帐户的types。 此外,每个账户types可能有更多的账户号码长度与它相关,尽pipe每个号码长度[*]只与1个账户types相关联。

目标

  • 从列表中提取帐户名称及其各自的帐号和帐号types。
  • 从账号中对账户types做一个假设
  • 通过检查名称中的数字和元素的构build来validation这个假设
  • 根据帐户types检查帐户号码的有效性。

棘手的部分 (这是我的问题所在)账户types和他们各自的账户号码长度是不知道的,并由表格的用户input到表格中,指定账户types和数量与此帐户types相关联的长度。 用户应该把它列入清单 – 不要用微妙的公式去修补

做到目前为止

  • 列A:包含原始数据(每个单元最多有5个名称和数字)
  • 列B..F:每列提取1个名称,如果全部已经提取,则保留为空
  • 列G..K:每列在B..F列中提取与其名称相对应的1个数字,如果全部已经提取,则保留为空
  • 列L..P:每列计算G..K列中相应编号的长度

现在,用户可以在一个表格中input以下详细信息,该表格指定一个账号types的特定数字长度:
TYPE2,BUSINESS,(OR(长度= 13,长度= 6))
其中长度稍后将被包含计算的账号长度的单元格地址replace。

我现在想做什么

列Q..U:
应该都在G..K列中指出相应账号的账户types。 这个想法是使用上面指定的用户input的条件构build一个嵌套的if-elseIf-elseIf公式。 其中一个elseIF语句的示例:
SUBSTITUTE(CONCATENATE(“= IF(”, criteria ,“,”, type ,“,”, errCode )),“length”,“O10”))
所有这些elseIf语句将被连接在一起形成一个主公式,然后需要将其parsing/转换为公式来计算帐户types

该提案仅使用5列(每个账号包含1个,包含主公式)以及一个指定账户types和标准的表,也使用户远离公式。 编辑1行代码(标准)将更新所有公式。 高效和可扩展。

由于用户不应该使用引擎盖下的公式,所以简单的1列if-elseIf-elseIf是不可能的。 上述的替代办法是制作一个单独的列来testing每个账号的每个账号types。 将每个testing分离/抽象到自己的列会导致更好的可读性,更容易的编辑和更less的debugging – 除非您喜欢多屏幕广泛的公式。 例如:5个帐号* 10个可能的帐号types= 50个额外的列。 每个对任何条件的编辑都需要复制到其他4个不相邻的列,并拖放10,000行(列不能相邻,因为它实际上是一个5×5的列数组)。 效率不高,也不可扩展。 除非我错过了一次更新非相邻公式的优雅方式

其余的validation错误指示是微不足道的。

样本数据

Tshepo Trust(6901/2005)Marlene Mead(8602250646085)
Great Force Inv 67 Pty Ltd(200602258007)
Jane(870811)Livingstone(6901/2005)Janette Appel(8503250647056)James(900111)


我知道所有这一切可能会更容易实现聪明的使用VBA,消除了在电子表格上模拟抽象,封装,multidimensional array和函数式编程的所有需求。 但直到我可以在VBA编程,工作表公式将成为我的避难所。

[*]:账户号码长度也可以被描述为数字中的数字或者这个公式所指示的: LEN(accNumber)

在VBA中,您可以访问Cell.Formula。 我通常使用Range来通过地址来查看单元格。

我不确定这是否会回答您的问题(这是一个非常详细的问题!),但是如果您的用户在表格中input帐号(我称之为“RefTable”),那就是:

Length of account number | business type ---------------------------------------- 6 | Accountant 8 | Advisor 

那么你可以在帐号的长度上使用vlookup,因为你已经把它们分开了。

 =vlookup(len(accNumber), Reftable, 2, false) 

请确保您使用的是dynamic范围名称,或者在RefTable中指定下面的大量空间,以便在用户添加types时不会丢失。

另外,如果你有两个不同的帐户,长度相同,这可能会让你陷入困境。