提取字符串中分号之前的所有数字并求和

问题描述 投票:0回答:1

我有一个不同类别的打印列表,并且想输入完成打印输出的任何日期以及打印了多少页,因此:

产品 拿督 普里斯
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)

function extract libreoffice-calc
1个回答
0
投票

当然,您的问题有多种解决方案。例如,您可以尝试使用 使用 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))}

© www.soinside.com 2019 - 2024. All rights reserved.