因为比较复杂,直接用公式书写麻烦、不易实现,建议使用VBA
Alt+F11,调出VBA,然后“插入”——“模块”
问题1:
Function Suma(Rng As Range) As Integer
Dim Tmp As String, Arr
Tmp = Rng.Text
Tmp = Replace(Tmp, "空粒(板、袋、装量不足)(", "")
Tmp = Replace(Tmp, ") 残(半)片(粒)(", ",")
Tmp = Replace(Tmp, ")双(多)片(粒)(", ",")
Tmp = Replace(Tmp, ")漏粉(液)(", ",")
Tmp = Replace(Tmp, ")异物(", ",")
Tmp = Replace(Tmp, ")空胶囊(", ",")
Tmp = Replace(Tmp, ")板面不净(", ",")
Tmp = Replace(Tmp, ")双帽(", ",")
Tmp = Replace(Tmp, ")", "")
Arr = Split(Tmp, ",")
Suma = 0
For i = 0 To 6
If Arr(i) <> "" Then Suma = Suma + Arr(i) * IIf(i = 0, 10, 1)
Next i
End Function
如果数据在A1,在B1可以输入公式:=Suma(A1) 就可以得到和,82
问题2: 也可以用VBA循环得到,但是建议将数据先单独取出来再计算。用VBA:
Function EachData(Rng As Range, n) As Integer
Dim Tmp As String, Arr
Tmp = Rng.Text
Tmp = Replace(Tmp, "空粒(板、袋、装量不足)(", "")
Tmp = Replace(Tmp, ") 残(半)片(粒)(", ",")
Tmp = Replace(Tmp, ")双(多)片(粒)(", ",")
Tmp = Replace(Tmp, ")漏粉(液)(", ",")
Tmp = Replace(Tmp, ")异物(", ",")
Tmp = Replace(Tmp, ")空胶囊(", ",")
Tmp = Replace(Tmp, ")板面不净(", ",")
Tmp = Replace(Tmp, ")双帽(", ",")
Tmp = Replace(Tmp, ")", "")
Arr = Split(Tmp, ",")
EachData = IIf(Arr(n - 1) = "", 0, Arr(n - 1))
End Function
使用方法:
如果这样,其实问题一的求和不用单独写一个VBA。得到每个项的数字,在后面直接计算就行。纵向计算也方便。
问题3:没看懂
这种写法的格式,造成了写函数的复杂性
格式一致,最好分列,然后处理数据。
可以用正则提取出数字,再进行计算。
但是需要确定表格中的文本的格式是否规律、一致。
例如:是否每个单元格都有这几项,数量是否都在括号中,数量括号中是否一定有数字,文本是半角还是全角输入的等等,最好上传一部分数据。