Excel:如何将文本解析/转换为公式?

Excel:如何将文本解析/转换为公式?,excel,parsing,casting,Excel,Parsing,Casting,是否可以在MS Excel中将文本(如“=A1+A2”)解析/转换为公式?我想从文本片段构建一个公式,其中一些文本片段只会在以后由用户键入 如果INDIRECT()函数不仅适用于引用单元格,那么我可以键入this=INDIRECT(“=A1+A2”) 我知道您可以通过简单地添加更多隐藏列来进行子计算来解决这个问题。但是为了可伸缩性和效率,我宁愿做上面的事情 我发现了一个类似的问题,但它们并没有解决我的问题 现实世界的问题: 请继续阅读,以便更好地理解您为什么要执行上述操作 脚本 列表中的每个

是否可以在MS Excel中将文本(如“=A1+A2”)解析/转换为公式?我想从文本片段构建一个公式,其中一些文本片段只会在以后由用户键入

如果INDIRECT()函数不仅适用于引用单元格,那么我可以键入this=INDIRECT(“=A1+A2”)

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

我发现了一个类似的问题,但它们并没有解决我的问题



现实世界的问题: 请继续阅读,以便更好地理解您为什么要执行上述操作

脚本 列表中的每个项目都由一个字符串组成,每个字符串包含1到5个帐户名。每个帐户名后面都有一个括号中的帐户编号。数字的长度决定了帐户的类型。账号的一部分是日期,日期格式取决于账户类型。此外,每个帐户类型可能有多个与其关联的帐户编号长度,尽管每个编号长度[*]仅与一个帐户类型关联

目标
  • 从列表中提取帐户名称及其各自的帐户编号和帐户类型
  • 根据账号对账户类型进行假设
  • 通过检查名称中数字和元素的构建来验证此假设
  • 根据账号类型检查账号的有效性
棘手的部分(这就是我的问题所在) 账户类型及其各自的账号长度目前尚不清楚,由工作表用户输入表格,指定账户类型以及与该账户类型相关的账号长度。用户应该将其输入列表中,而不是去修改微妙的公式

迄今为止已完成
  • 列A:包含原始数据(每个单元格最多有5个名称和数字)
  • B..F列:每列提取一个名称,如果已提取所有名称,则保留为空
  • G..K列:每列提取与B..F列中的名称对应的1个数字,如果已提取所有数字,则保留为空
  • 列L..P:每列计算列中相应数字的长度 G..K
现在,用户将在一个表中键入以下详细信息,该表为帐户类型分配特定的数字长度:
类型2,业务,(或(长度=13,长度=6))
其中length稍后将替换为包含计算出的帐号长度的单元格地址

我现在想做什么 Q..U列:
均应在G..K列中指明相应账号的账户类型。其思想是使用上面指定的用户键入的条件构建嵌套的if-elseIf-elseIf公式。elseIF语句之一的示例:
替换(连接(“=IF(”,条件,“,”,类型,“,”,错误代码)),“长度”,“O10”))
所有这些elseIf语句将连接在一起,形成一个主公式,然后需要将其解析/转换为公式来计算帐户类型

此建议仅使用5列(每个帐号1列,包含主公式)和一个指定帐户类型和条件的表,同时使用户远离公式。编辑一行代码(标准)将更新所有公式。高效且可扩展

因为用户永远不应该在引擎盖下修改公式,所以如果elseIf elseIf,那么简单的1列是不可能的。上述方法的替代方法是为每个账号的每个账户类型创建一个单独的列进行测试。将每个测试分离/抽象到它自己的列中会导致更好的可读性、更容易的编辑和更少的调试——除非您喜欢多屏幕范围的公式。示例:5个帐号*10个可能的帐号类型=50个额外列。 对任何条件的每次编辑都需要复制到其他4个非相邻列,并向下拖动10000行(列不能相邻,因为它实际上是一个5x5列数组)。不高效也不可扩展。除非我错过了一些在一次单击中更新非相邻公式的优雅方式

其余的验证错误指示无关紧要

样本数据 切波信托(6901/2005)玛琳·米德(8602250606085)
大力士投资67私人有限公司(200602258007)
简(870811)利文斯通(6901/2005)珍妮特·阿佩尔(8503250647056)詹姆斯(900111)


我知道,聪明地使用VBA可能更容易实现这一切,从而消除了在电子表格上模拟抽象、封装、多维数组和函数编程的所有需要。但在我能用VBA编程之前,工作表公式将是我的避难所


[*]:帐号长度也可以描述为数字中的位数或由以下公式表示:LEN(accNumber)

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

Length of account number | business type
----------------------------------------
             6           |  Accountant
             8           |  Advisor
然后你可以在账号的长度上使用vlookup,因为你已经把它们分开了

=vlookup(len(accNumber), Reftable, 2, false)
确保使用动态范围名称,或者在RefTable中指定足够的空间,以便用户添加类型时不会丢失


此外,如果您有两个长度相同的不同帐户,这可能会给您带来麻烦。

在VBA中,您可以访问Cell.Formula。
我通常使用Range按地址查看手机。

是的,这会非常有效-尽管我今天才看到你的答案(大约4年后),谢谢。到那时为止,我只在单元格公式中使用过,但当时我不得不深入研究vba宏,它解决了大量的p