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

时间:2013-08-03 05:31:49

标签: excel parsing casting

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

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

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

我发现了类似问题herehere,但他们没有解决我的问题。


<小时/>

现实问题:

继续阅读,以便更好地了解您为什么要执行上述操作

方案

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

目标

  • 从列表中提取帐户名称及其各自的帐号和帐户类型。
  • 根据帐号
  • 对帐户类型进行假设
  • 通过检查名称
  • 中的数字和元素的构建来验证此假设
  • 根据帐号类型检查帐号的有效性。

棘手的部分(这是我的问题所在) 帐户类型及其各自的帐号长度不是事先知道的,并且由工作表的用户键入表格,指定帐户的类型和与该帐户类型相关联的数字长度。用户应该将其键入一个列表 - 不要去修改精致的公式

到目前为止

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

现在,用户可以在表格中键入以下详细信息,该表格为帐户类型指定某些数字长度:
TYPE2,BUSINESS,(或(长度= 13,长度= 6))
其中 length 稍后将替换为包含计算的帐号长度的单元格地址。

我现在想做什么

列Q..U:
是否所有都应在G..K列中指明相应帐号的帐户类型。我们的想法是使用上面指定的用户输入的条件构建嵌套的if-elseIf-elseIf公式。其中一个elseIF语句的示例:
替代(CONCATENATE(&#34; = IF(&#34;,标准,&#34;&#34;,,&#34;,& #34;, ERRCODE )),&#34;长度&#34;&#34; O10&#34))
然后将所有这些elseIf语句连接在一起形成一个主公式,然后需要将其解析/转换为公式来计算帐户类型

此提案仅使用5列(每个帐号为1,包含主公式)和指定帐户类型和条件的表,同时使用户远离公式。编辑1行代码(条件)将更新所有公式。高效的&amp;可扩展性。

由于用户不应该修改引擎下的公式,因此一个简单的1列if-elseIf-elseIf是不可能的。上述方法的替代方法是为每个帐号编制一个单独的列来测试每个帐户类型。将每个测试分离/抽象到其自己的列导致更好的可读性,更容易编辑和更多。更少的调试 - 除非你喜欢多屏幕公式。示例:5个帐号* 10个可能的帐户类型= 50个额外列。 对任何条件的每次编辑都需要复制到4个其他非相邻列并向下拖动10,000行(列不能相邻,因为它实际上是5x5列数组)。不高效也不可扩展。除非我错过了一次点击更新非相邻公式的优雅方法

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

样本数据

Tshepo Trust(6901/2005)Marlene Mead(8602250646085)
Great Force Inv 67 Pty Ltd(200602258007)
简(870811)利文斯通(6901/2005)珍妮特·阿佩尔(8503250647056)詹姆斯(900111)


我知道通过巧妙使用VBA可以更容易实现这一切,消除了在电子表格上模拟抽象,封装,多维数组和函数式编程的所有需求。但是直到我可以在VBA中编程,工作表公式将成为我的避难所。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不确定这是否能回答你的问题(这是一个非常详细的问题!),但是如果你的用户在表格中输入了帐号(我称之为'RefTable'),那就是:< / p>

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

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

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

确保您使用动态范围名称,或在RefTable中指定下面足够的空间,这样当您的用户添加类型时,它们就不会丢失。

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