是否可以在 MS Excel 中将文本(如“=A1+A2”)解析/转换为公式?我想从文本中构建一个公式 - 其中一些只能由用户稍后输入。
如果 INDIRECT() 函数不仅适用于引用单元格,那么我可以输入这个 =INDIRECT("=A1+A2")。
我知道您可以通过简单地添加更多隐藏列来进行子计算来解决这个问题。但是为了可扩展性和效率,我宁愿做类似上面的事情。
现实世界的问题:
继续阅读以更好地了解您为什么要执行上述操作
设想
列表中的每个项目都由一个字符串组成,每个字符串包含 1 到 5 个帐户名称。每个帐户名称后跟括号中的帐户编号。数字的长度决定了帐户的类型。帐号的一部分是日期,日期格式取决于帐户类型。此外,每个帐户类型可能有超过 1 个关联的帐号长度,尽管每个 number-length[*] 仅与 1 个帐户类型相关联。
目标
- 从列表中提取帐户名称及其各自的帐号和帐户类型。
- 从帐号中假设帐户类型
- 通过检查名称中的数字和元素的构建来验证此假设
- 根据帐号类型检查帐号的有效性。
棘手的部分(这是我的问题所在)帐户类型及其各自的帐号长度事先不知道,并且由工作表的用户输入到表格中,指定帐户类型和号码-与此帐户类型关联的长度。用户应该把它输入到一个列表中——不要去修改精致的公式
到目前为止完成
- A 列:包含原始数据(每个单元格最多有 5 个名称和数字)
- B..F 列:每列提取 1 个名称,如果已提取所有名称,则保持为空
- G..K 列:每列在 B..F 列中提取与其名称对应的 1 个数字,如果所有列都已提取,则保持为空
- L..P 列:每列计算 G..K 列中对应数字的长度
现在,用户将以下详细信息输入到为某些数字长度分配帐户类型的表中:
TYPE2, BUSINESS, (OR(length=13,length=6))
其中长度稍后将替换为包含计算的帐号长度。
我现在想做什么
Q..U 列:G..K 列中都应
指明相应帐号的帐号类型。这个想法是使用上面指定的用户输入的标准来构建一个嵌套的 if-elseIf-elseIf 公式。elseIF 语句之一的示例:
SUBSTITUTE(CONCATENATE("=IF(", criteria ,",", type ,",", errCode )),"length","O10"))
所有这些 elseIf 语句将连接在一起形成一个主公式,然后需要将其解析/转换为计算帐户类型的公式
该提案仅使用 5 列(每个帐号 1 列,包含主公式)和一个指定帐户类型和标准的表格,同时也使用户远离公式。编辑 1 行代码(条件)将更新所有公式。高效且可扩展。
由于用户永远不应该修补引擎盖下的公式,所以一个简单的 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)
Jane (870811) Livingstone (6901/2005) Janette Appel (8503250647056) James (900111)
我知道通过巧妙地使用 VBA,这一切可能会更容易实现,消除了在电子表格上模拟抽象、封装、多维数组和函数式编程的所有需要。但在我可以用 VBA 编程之前,工作表公式将是我的避难所。
[*]:帐号长度也可以描述为数字中的位数或如下公式所示:LEN(accNumber)