我有一个不同类别的打印列表,并且想输入完成打印输出的任何日期以及打印了多少页,因此:
产品 | 拿督 | 普里斯 |
---|---|---|
A4 s/k éi | 2024 年 5 月 4 日 | −£ 0,41 |
A4 s/k 至 | 2024 年 5 月 1 日:1; 2024 年 5 月 4 日:9; 2024 年 5 月 5 日:4 | −£ 0,26 |
A4 法格 éi | £ 0,00 | |
A4 远去 | 2024 年 5 月 4 日:2 | −£ 10,09 |
A4 s/k éi, fin | £ 0,00 | |
A4 s/k 至,鳍 | £ 0,00 | |
A4 法尔格 éi,鳍 | £ 0,00 | |
A4 法吉至,鳍 | £ 0,00 | |
图书馆,每 | £ 0,00 | |
布莱克 | £ 0,00 | |
托纳尔 | £ 0,00 |
我们将A、B、C三列称为A、B、C列。A列是打印费用的种类; B 列是日期和打印输出的数量; C 列中是一个
VLOOKUP
,它收集每种打印输出类型的页面成本并将其乘以 B 列中的数字。
B 列始终采用
d.m.yyyy: x;
格式,其中 x 是页数。日期和月份可以是两位数。
我想要做的是找到某种方法来提取冒号和分号之间的所有 B 列数字,将它们加在一起并将它们乘以 C 中的
VLOOKUP
值。在 Calc 中有没有办法做到这一点?到目前为止,我只找到了一种在一个实例中效果很好的方法:TEXTBEFORE
,尽管我认为 Calc 中不存在该公式,并且无论如何它只适用于单一情况。怎么解决这个问题?
主要问题: 如何提取冒号和分号之间的每个数字并将它们全部求和?
P。 S.:我目前有以下公式来提取冒号的数量并将其乘以价格;这是我得到的最接近的:
=IF(D56="";"";(LEN(E56)-LEN(SUBSTITUTE(E56;":";"")))*VLOOKUP(D56;Utskriftspris;2;0)*-1)
当然,您的问题有多种解决方案。例如,您可以尝试使用 使用 REGEX() 函数的复杂公式来提取数字求和,或者尝试使用 FILTERXML(SUBSTITUTE()) 或提出更复杂的方法。
但是,如果您清楚地了解需要对现有字符串执行什么操作,那么在 BASIC 中编写自己的函数会更容易、更快捷。例如这样:
Function SplitAndSum(sSourceText As String, sPrefix As String, sSuffix As String) As Double
Dim aPairs() As String, sPair As String
Dim aPages() As String
Dim dResult As Double
dResult = 0
aPairs = Split(sSourceText, sPrefix)
For Each sPair In aPairs
aPages = Split(sPair, sSuffix)
If UBound(aPages) > 0 Then
dResult = dResult + CLng(aPages(1))
Else
dResult = dResult + 1
EndIf
Next sPair
SplitAndSum = dResult
End Function
现在的公式如下
=-SPLITANDSUM(E56;";";":")*VLOOKUP(D56;Utskriftspris;2;0)
将完全按照您在问题中要求的计算进行计算。
但是,如果您将订单注册表更改为如下所示,您将大大简化您自己和 Calc 的任务: |Dato|Antal|产品|Pris| |---|---|---|---| |05.01.2024|1|A4 s/k 至|-0.26| |05.04.2024|9|A4 s/k 至|-2.34| |05.04.2024|1|A4 s/k éi|-0.41| |05.04.2024|2|A4 票价至|-20.18| |05.05.2024|4|A4 s/k 至|-1.04|
只需逐行、逐日、按顺序输入您的数据即可。
这样的公式将帮助您以问题中显示的形式创建汇总表:
{=TEXTJOIN(";";1;IF($E$79:$E$1087=C90;TEXT($C$79:$C$1087;"M.D.YY")&": "&$D$79:$D$1087))}