【发布时间】:2019-01-22 11:58:38
【问题描述】:
简略问题:
如果我有一个串联的字符串“|#|#|#|...|#|”,我如何对每个数字应用一个乘数并更新串联的文本?例如,对于 |4|12|8|,乘以因子 2 并将连接的文本更新为 |8|24|16|。
背景
我有三列感兴趣。第一列包含日期,第二列包含金额或因子,第三列将数据连接成格式“|#|#|...|#|” (例如,|2|5|、|2|5|12|、|4|12| 等)。有时,需要对级联数据应用乘数,并且需要相应地更新各个数字。
一个例子是——
Date Amt Concatenated Data
01/01/18 2 |2|
01/05/18 5 |2|5|
02/06/18 12 |2|5|12|
03/25/18 -3 |4|12|
03/31/18 8 |4|12|8|
04/01/18 F2 |8|24|16| (factor of 2 applied)
04/15/18 12 |8|24|16|12|
04/01/18 F1/4 |2|6|4|3| (factor of 1/4 applied)
使用公式,我如何将因子应用于连接数据,并更新各个数字?
我受以下条件的约束:
- Excel 2007,所以没有 TEXTJOIN 函数
- 没有 VBA 或 UDF(由于安全策略)
- 个别数字是动态的(即,我不能为 SUBSTITUTE 公式的“old_text”参数使用静态值)
- 连接数据中单个数字的数量也是动态的(可能包含一个数字,也可能包含几十个不同的数字)
我可以使用数组公式提取单个数字。我什至可以将这些数字乘以因子以产生数组结果。但是,我无法重建连接的数据,因为 CONCATENATE 不适用于数组。我也尝试过 SUBSTITUTE,但我无法遍历“|”分隔符。我只能替换给定的段(例如,将“|2|”的所有条目更改为“|4|”)。嵌套 SUBSTITUTE 或使用单个列将不起作用,因为它可能涉及数十个实例。
只是添加一些关于连接数据的信息:
- Amt>0,然后将值连接到前一个连接值的末尾
- Amt
- Amt 减少仅限于先前 CV 的单个数字的总和(例如,对于 |4|12|,减少不能超过 16)
- Amt=F#,表示乘数,CV的数字需要更新
- CV 没有最大值(可能有几十到几百个单独的数字,数字从 1 到 100,000+),除了 Excel 本身对字符串长度应用的任何最大值
【问题讨论】:
-
你能解释一下逻辑吗?例如,为什么我们从
|2|5|12|转到|4|12|? -
这些数字本质上是在记录单个交易。正数连接到前一个条目的末尾。但是,负数会减少现有条目。
-
怎么样?看这个例子还很不清楚。请edit您的问题与解释
-
连接的条目跟踪各个交易的余额。例如,|2|5|12|表示 2、5 和 12 的现有余额。当 -3 的条目出现在 18 年 3 月 25 日时,它将 2 减少为 0(消除该余额),并将 5 减少为 4。连接条目被调整为反映新的余额。就各自的余额而言,它看起来像 |0|4|12,但余额为 |0|被删除。
-
对帐户进行递减和应用因子的复杂性要求采用迭代方法,尤其是因为连接帐户的数量是可变的。我无法想象一个解决方案,你可以用每行一个公式来做到这一点。但是,可以在
Amt和Concatenated Data之间添加一堆公式列。您必须为可以连接的最大帐户数创建公式列。然后您可以有条件地将它们组合到您的|#|#|#|#|#|字符串中。它仍然会相当复杂,但不使用 VBA 可能是可行的。
标签: excel excel-formula concatenation substitution