Nhờ các bác giúp em tính tổng các số có trong chuỗi với

Liên hệ QC

vonguyen3745

Thành viên hoạt động
Tham gia
18/7/09
Bài viết
145
Được thích
5
screenshot_1630419083.jpeg
Các bác tính giúp em theo yêu cầu trong hình với.
 

File đính kèm

  • demo.xlsx
    10.1 KB · Đọc: 20
Nếu dữ liệu như vầy bạn dùng công thức này, Ctrl+Shift+Enter
Mã:
=SUM(IFERROR(--TRIM(MID(SUBSTITUTE(D4," ",REPT(" ",100)),(ROW($1:$100)-1)*100+1,100)),))
Mình thấy công thức mà ghi "--" là mình rất ngại vì trông nó kỳ kỳ và dễ gõ sót (mặc dù nó chính là phủ định của phủ định) cho nên mình thường dùng "1*" cho dễ nhớ và không thấy kỳ kỳ. Hehe.
Mã:
=SUM(IFERROR(1*TRIM(MID(SUBSTITUTE(D5," ",REPT(" ",100)),(ROW($1:$100)-1)*100+1,100)),))
 
Bạn tham khảo hàm tự tạo xem sao.
Hàm này chỉ dúng với những số nhỏ hơn 10 à bác, nếu số lớn hơn 10 thì không đúng, Em sorry các bác là đưa file demo nó không tổng quát, ý em là tính tổng những số ở đầu chuỗi sau dấu , hoặc ;. Thanks các bác đã quan tâm
 
Hàm này chỉ dúng với những số nhỏ hơn 10 à bác, nếu số lớn hơn 10 thì không đúng, Em sorry các bác là đưa file demo nó không tổng quát, ý em là tính tổng những số ở đầu chuỗi sau dấu , hoặc ;. Thanks các bác đã quan tâm
Vậy là hàng thật không giống với quảng cáo rồi.
 
Bạn tham khảo hàm tự tạo xem sao.
Nếu mà dùng hàm tự tạo thì dùng hàm này nó OK hơn nè bạn:

1630425219964.png

PHP:
Function SumInText(ByVal strTextNum As String) As Double
    Dim strTemp As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\D+"
        strTemp = .Replace(strTextNum, Space(1))
    End With
    SumInText = Evaluate(Replace(Trim(strTemp), Space(1), "+"))
End Function
 
Nếu mà dùng hàm tự tạo thì dùng hàm này nó OK hơn nè bạn:

View attachment 265177

PHP:
Function SumInText(ByVal strTextNum As String) As Double
    Dim strTemp As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\D+"
        strTemp = .Replace(strTextNum, Space(1))
    End With
    SumInText = Evaluate(Replace(Trim(strTemp), Space(1), "+"))
End Function
Hay quá anh, em đang nghĩ mà chưa ra được ạ.
 
Nếu mà dùng hàm tự tạo thì dùng hàm này nó OK hơn nè bạn:

View attachment 265177

PHP:
Function SumInText(ByVal strTextNum As String) As Double
    Dim strTemp As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\D+"
        strTemp = .Replace(strTextNum, Space(1))
    End With
    SumInText = Evaluate(Replace(Trim(strTemp), Space(1), "+"))
End Function
CreateObject("VBScript.RegExp") và hàm Evaluate khá nặng, nếu gọi nhiều lần tốc độ sẽ chậm
 
Bạn có thể dùng hàm FILTERXML nếu phiên bản excel >= 2013.

.=SUM(FILTERXML("<p><i>"&SUBSTITUTE(D4," ","</i><i>")&"</i></p>","//i"))

Ctrl + Shift + Enter.
- Nếu trước hoặc sau số không có dấu cách thì số đó không được tính nên kết quả sai.
- Nếu chuỗi có vd. ký tự "&" thì công thức trả về #VALUE!

Nếu dữ liệu như bài #10; tức trong D4 có:

1 gà; 1 chó, 3 vịt, 4 ngỗng 2 ngan, 3 chó; 5 tho & 2 ngan, +3 chó; 5 thỏ 2 ngan, 3 chó; 5 thỏ 2 ngan, 3 chó; 5 thỏ và cộng thêm 20 con ma, 8 con quỷ, 600con yêu tinh

Thì có lỗi #VALUE! do chuỗi có ký tự "&". Nếu thay bằng "và" thì kết quả chỉ là 77 do mất 600 vì sau nó không có dấu cách.

Chỉ có hàm SumInText cho kết quả đúng với dữ liệu như bài #10, tức D4 như trên. Rất có thể tác giả bài #10 cố tình bịa ra kiểu dữ liệu như thế - có ký tự "&" và thiếu dấu cách trước sau số. :D

Với dữ liệu của chủ thớt thì thêm vài công thức đúng.
 
Giải trí mùa dịch:
PHP:
Function MySum(ByVal txt As String) As Double
    Dim i As Long
    For i = 1 To Len(txt)
        If Mid(txt, i, 1) Like "[0-9.]" = False Then Mid(txt, i, 1) = " "
    Next i
    MySum = Evaluate(Replace(Application.Trim(txt), " ", "+") & "+0")
End Function

Dữ liệu là: "1.5 kg thịt chó", Hàm bài 10 sẽ có kết quả là 6
 
Lần chỉnh sửa cuối:
Hình như phần lớn mọi người từ mấy tuần nay ngồi nhà thì phải. Việt Nam khổ quá. Liên tục hàng ngày hơn 10 000 ca, mấy trăm người chết.
Mọi người chung lòng chống dịch nhé. Nhiều khi một người làm cho công sức của hàng ngàn người đổ xuống sông xuống biển đấy.
 
Dữ liệu là: "1.5 kg thịt chó", Hàm bài 10 sẽ có kết quả là 6
Bài #10 cũng chỉ là tạm thời đúng với dữ liệu như bà̀i #10 thôi. Vì thực tế là chủ thớt cho 2 ví dụ mà toàn là số con vật nên không thể có 1.5 con chó được. Nếu ta bàn về số lượng thịt chó thì phải tính rộng hơn. Rất có thể dữ liệu có được từ việc nối chuỗi. Vd. cột A là tên các con vật, cột B là số lượng thịt của con vật đó trong mỗi đơn nhập. Và cột D là nối chuỗi các ô trong A và B của tất cả các dòng dữ liệu. Nếu là tôi nhập liệu thì rõ ràng tôi phải nhập với dấu phẩy là dấu thập phân vì thiết lập của tôi là vậy. Vậy nếu tôi có D4 = "2 kg ngan; 3,5 kg chó" thì công thức của bạn trả về 10 chứ không phải là 5,5.
Khi xét cả số có phần thập phân thì phải xét cả khi dấu thập phân là dấu chấm hoặc dấu phẩy. Hàm chạy trên máy này cho kết quả đúng nhưng trêh máy khác chưa chắc. Tất nhiên yêu cầu đặt ra cho hàm là do mỗi người quyết định theo nhu cầu của mình. Nếu ai đó khăng khăng là anh ta chỉ dùng cho mình thôi, và thiết lập của anh ta luôn là dấu chấm, nếu thế thì cũng phải chấp nhận thôi. Việc của anh ta, anh ta muốn thế nào là quyền của anh ta.
 
Góp vui với phép tính cộng từ từ của nông dân, tuy dài dòng nhưng tốc độ khá nhanh
Mã:
Function Sum_ABC(strNum As String) As Double
  Dim i&, fNum&, tmp#
  For i = 1 To Len(strNum)
    If fNum = 0 Then
      If Mid(strNum, i, 1) Like "#" Then fNum = i
    ElseIf Mid(strNum, i, 1) Like "[0-9.]" = False Then
      tmp = tmp + Val(Mid(strNum, fNum, i - fNum))
      fNum = 0
    End If
  Next
  Sum_ABC = tmp
End Function
Các số thập phân ngăn cách bằng dấu chấm "."
 
Web KT
Back
Top Bottom