Tách số ký tự nằm trong ngoặc của chuỗi

Liên hệ QC

neyugngnort

Thành viên chính thức
Tham gia
27/2/12
Bài viết
54
Được thích
23
Giới tính
Nữ
Chào các anh chị
Em xin anh chị giúp đỡ 1 dòng code để tách những ký tự ở trong ngoặc đơn và tính tổng nó lại như ví dụ
chuỗi : 1,4,5,7(3),34,34(2),99(3),2 Kết quả : 3+2+3 =8
chuỗi : 100(10),99,124. Kết quả : 10
chuỗi : 5,8,615,546,884,22 Kết quả : 0
Cảm ơn anh chị
 
Chào các anh chị
Em xin anh chị giúp đỡ 1 dòng code để tách những ký tự ở trong ngoặc đơn và tính tổng nó lại như ví dụ
chuỗi : 1,4,5,7(3),34,34(2),99(3),2 Kết quả : 3+2+3 =8
chuỗi : 100(10),99,124. Kết quả : 10
chuỗi : 5,8,615,546,884,22 Kết quả : 0
Cảm ơn anh chị
Thử UDF này xem
PHP:
Function TongTrongNgoac(Cll As Range) As Double
Dim Val As String, Pos1 As Long, Pos2 As Long, Tong As Double
    Val = Cll.Value
    Pos1 = InStr(Val, "(")
    Do While Pos1 > 0
        Pos2 = InStr(Pos1, Val, ")")
        If Pos2 = 0 Then MsgBox "Thieu dong ngoac": Exit Function
        Tong = Tong + Mid(Cll, Pos1 + 1, Pos2 - Pos1 - 1)
        Pos1 = InStr(Pos2, Val, "(")
    Loop
TongTrongNgoac = Tong
End Function
 
Upvote 0
Bạn có thể tham khảo đoạn code sử dụng biểu thức chính quy dưới đây.
=addNumberInBlocks("1,4,5,7(3),34,34(2),99(3),2")


PHP:
Function addNumberInBlocks(ByVal text$)
  Dim M, t!
  With VBA.CreateObject("VBScript.RegExp")
    .Global = True
    .pattern = "\(([-+]?\d+?(?:\.\d+)?)\)"
    For Each M In .Execute(text)
      t = t + CSng(M.SubMatches(0))
    Next
  End With
  addNumberInBlocks = t
  Set M = Nothing
End Function
 
Upvote 0
Góp vui.
PHP:
Function Tong(ByVal txt As String) As Double
Dim v As Variant, i As Long
v = Split(Replace(txt, ")", "("), "(")
For i = 1 To UBound(v) Step 2
    Tong = Tong + v(i)
Next
End Function
 
Upvote 0
Chào các anh chị
Em xin anh chị giúp đỡ 1 dòng code để tách những ký tự ở trong ngoặc đơn và tính tổng nó lại như ví dụ
chuỗi : 1,4,5,7(3),34,34(2),99(3),2 Kết quả : 3+2+3 =8
chuỗi : 100(10),99,124. Kết quả : 10
chuỗi : 5,8,615,546,884,22 Kết quả : 0
Cảm ơn anh chị
Dùng Regex, không dùng vòng lặp

PHP:
Function s_sum(ByVal str As String) As Long
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "[^)]*?(?=\(\d+\))"
    If .test(str & "(0)") Then s_sum = Evaluate("(0)" & Replace(.Replace(str & "(0)", "+"), "++", "+"))
End With
End Function
Bài đã được tự động gộp:

Dùng Regex, không dùng vòng lặp

PHP:
Function s_sum(ByVal str As String) As Long
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "[^)]*?(?=\(\d+\))"
    If .test(str & "(0)") Then s_sum = Evaluate("(0)" & Replace(.Replace(str & "(0)", "+"), "++", "+"))
End With
End Function
Làm công thức cũng được, Ctrl+Shift+Enter
Mã:
=SUM(IFERROR(--RIGHT(SUBSTITUTE(MID(A1,1,FIND("|",SUBSTITUTE(A1,")","|",ROW($1:$50)))-1),"(",REPT(" ",100)),100),))
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể tham khảo đoạn code sử dụng biểu thức chính quy dưới đây.
=addNumberInBlocks("1,4,5,7(3),34,34(2),99(3),2")


PHP:
Function addNumberInBlocks(ByVal text$)
  Dim M, t!
  With VBA.CreateObject("VBScript.RegExp")
    .Global = True
    .pattern = "\(([-+]?\d+?(?:\.\d+)?)\)"
    For Each M In .Execute(text)
      t = t + CSng(M.SubMatches(0))
    Next
  End With
  addNumberInBlocks = t
  Set M = Nothing
End Function
Cảm ơn anh mong anh chỉ thêm code RegExp
Để chọn ra số trong dấu ngoặc theo 1 tham số
ví du:
Loc ( 7; "1(4),7(2),5(2)" ) =2
Loc ( 1; "1(4),7(2),5(2),1(2)" )=4+2=6
Cảm ơn ạ!
Bài đã được tự động gộp:

Dùng Regex, không dùng vòng lặp

PHP:
Function s_sum(ByVal str As String) As Long
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "[^)]*?(?=\(\d+\))"
    If .test(str & "(0)") Then s_sum = Evaluate("(0)" & Replace(.Replace(str & "(0)", "+"), "++", "+"))
End With
End Function
Bài đã được tự động gộp:


Làm công thức cũng được, Ctrl+Shift+Enter
Mã:
=SUM(IFERROR(--RIGHT(SUBSTITUTE(MID(A1,1,FIND("|",SUBSTITUTE(A1,")","|",ROW($1:$50)))-1),"(",REPT(" ",100)),100),))
cảm ơn anh!
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thấy mọi người đã làm cho bạn trong khi bạn không mô tả dữ liệu.

Câu hỏi: trong ngoặc () luôn là số chẵn hay có thể là số thập phân? Tại sao tôi hỏi? Vì tôi thấy HeSanbi muốn phục vụ cả số thập phân. Nếu có thể là số thập phân thì các code sẽ sai, kể cả code của Hesanbi. Tôi cho ví dụ:
- trong system dấu phẩy "," là dấu thập phân.
- chuỗi là "1,4,5,7(3,5),34,34(2),99(3),2"

Câu hỏi tiếp: dữ liệu có thể có dạng "(1,4,5,7(3),34,34(2),99(3),2)" hay không? Nếu có thì code HanSanbi vẫn đúng còn code excel_lv1.5 sai.

Nên luôn luôn mô tả dữ liệu.
 
Upvote 0
Tôi thấy mọi người đã làm cho bạn trong khi bạn không mô tả dữ liệu.

Câu hỏi: trong ngoặc () luôn là số chẵn hay có thể là số thập phân? Tại sao tôi hỏi? Vì tôi thấy HeSanbi muốn phục vụ cả số thập phân. Nếu có thể là số thập phân thì các code sẽ sai, kể cả code của Hesanbi. Tôi cho ví dụ:
- trong system dấu phẩy "," là dấu thập phân.
- chuỗi là "1,4,5,7(3,5),34,34(2),99(3),2"

Câu hỏi tiếp: dữ liệu có thể có dạng "(1,4,5,7(3),34,34(2),99(3),2)" hay không? Nếu có thì code HanSanbi vẫn đúng còn code excel_lv1.5 sai.

Nên luôn luôn mô tả dữ liệu.
chỉ là các số tự nhiên tập N
 
Upvote 0
chỉ là các số tự nhiên tập N
Thế thì HeSanbi lo xa rồi. Do bạn không mô tả dữ liệu mà. Và nếu là số tự nhiên (nguyên dương) thì sẽ chỉ có vd. (3) chứ không có (+3), đúng không? Với tập N thì pattern đơn giản hơn nhiều

Thế còn vụ "(1,4,5,7(3),34,34(2),99(3),2)"?
 
Upvote 0
Có thể đặt nhiều điều kiện:
=addIfs( "1(4),7(2),5(2)", 2 , 7, 4253, 45656)

Điều kiện từ 1 đến 5:
=addIfs( "1(4),7(2),5(2)", "[1-5]" )


PHP:
Function addIfs(ByVal text$, ParamArray conditions())
  Dim M, t!, c
  c = "(?:" & Join(conditions, "|") & ")"
  With VBA.CreateObject("VBScript.RegExp")
    .Global = True
    .pattern = c & " *\(( *[-+]?\d+?(?:\.\d+ *)?)\)"
    For Each M In .Execute(text)
      t = t + CSng(M.SubMatches(0))
    Next
  End With
  addIfs = t
  Set M = Nothing
End Function
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom