Nhờ các bạn giúp hộ hàm tính tổng các số có trong chuỗi kí tự!

Liên hệ QC

khocthet296

Thành viên mới
Tham gia
13/6/11
Bài viết
12
Được thích
2
Mình là mem mới của 4rum.
nhờ các bạn 1 hàm tính tổng các số có hoặc xuất hiện trong dãy có phân biệt bằng 1 kí tự.
Ví dụ như: chuỗi "8R+8L" mark là "+" khi tách số ra còn 88= 8+8 =16
nhưng cách mình làm chỉ làm đc với số có 1 chữ số, với những số có từ 2 chữ số trở lên thì không làm đc
ví dụ như mình đang cần làm chuỗi "12R+12L" thì mình chỉ làm tách số đc ra là 1212 và tính được tổng các chữ số trong chuỗi =6 chứ không phải =24, là đáp án mình cần.
Mình rất gà khoản này,
thanks các bạn giúp đỡ:D
 
Hình như SumTumLum luôn bằng 0 thực thụ (nếu không cần xét Option explicit).
 
Upvote 0
Các thầy giúp em nếu e cần cộng 1 chuỗi như sau
VD: 12(1)+13(2)+14(3)
Ra luôn kết quả chính xác là 39 với ạ
 
Upvote 0
Các thầy giúp em nếu e cần cộng 1 chuỗi như sau
VD: 12(1)+13(2)+14(3)
Ra luôn kết quả chính xác là 39 với ạ
Nếu ví dụ như vậy chỉ cần đơn giản như vầy. Muốn nữa thì học:
Regular Expression
Trong vòng 1 tiếng cho cơ bản:oops:

PHP:
' VBA -> Tools -> References...  Chọn Microsoft VBScript Regular Expressions <Version> (1.0 -> 5.5)
'và  Chọn Microsoft Scripting Runtime
Sub Test_TachBaiToan()
  Debug.Print reFormula("12(1)+13(2)+14(3)")
  Debug.Print reFormula("12(1)+13(2)+14(3)" , True)
End Sub
  Function reFormula(Text As String, Optional Eval As Boolean = False) As Variant
    'Dim iRegex As New VBScript_RegExp_55.RegExp 'Không cần  Microsoft Scripting Runtime
    Dim iRegex as Object: set iRegex = CreateObject("VbScript.RegExp")
    With iRegex
      .Global = True
      .Pattern = "[A-z]|\(\d*\)" 'Cach 2: "\(\d*\)|[^0-9\+\-\*\/\^\.]"
      reFormula = IIf(Eval, Evaluate(.Replace(Text, "")), .Replace(Text, ""))
    End With
  End Function


'Kiểm tra  Microsoft Scripting Runtime
Sub Test_CheckRefEnable()
  MsgBox CheckRefEnable(ActiveWorkbook, "VBScript_RegExp_55")
  MsgBox CheckRefEnable(ActiveWorkbook, "Scripting")
End Sub

'Chọn bằng VBA -  Microsoft Scripting Runtime
Sub EnableReference()
  On Error Resume Next
  ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\system32\vbscript.dll" ' \3
  ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\system32\scrrun.dll"
  On Error GoTo 0
End Sub
  Function CheckRefEnable(wbk As Workbook, sRefName As String) As Boolean
    On Error Resume Next
    CheckRefEnable = (wbk.VBProject.References(sRefName).name = sRefName)
  End Function



 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Ơ kìa. #23 bạn thử chưa. Chứ Viết hàm là các Anh chị Thầy cô mà có giúp bạn phải bỏ công nghỉ ra thuật toán. Căng lắm đó:oops:

Mã:
 Cells = reFormula("12(1)+13(2)+14(3)" , True)

Em muốn làm với 1 chuỗi bất kỳ thì như thế nào ạ. Ví dụ như file này
 

File đính kèm

  • test.xlsx
    8.3 KB · Đọc: 8
Upvote 0
Các thầy giúp em nếu e cần cộng 1 chuỗi như sau
VD: 12(1)+13(2)+14(3)
Ra luôn kết quả chính xác là 39 với ạ
Thử bằng công thức mảng:
A1=12(1)+13(2)+14(3)
Mã:
=SUM(IFERROR(--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(A1,"+",REPT(" ",100)),(ROW($1:$10)-1)*100+1,100)),"(",REPT(" ",100)),100),))
Kết thúc bằng Ctrl+Shift+Enter.

Công thức này cho <= 10 con số cộng với nhau, nếu muốn hơn chỉnh ROW($1:$10)-1, Vd: ROW($1:$20)-1 dành cộng <= 20 số.

Thân
 
Upvote 0
Thử bằng công thức mảng:
A1=12(1)+13(2)+14(3)
Mã:
=SUM(IFERROR(--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(A1,"+",REPT(" ",100)),(ROW($1:$10)-1)*100+1,100)),"(",REPT(" ",100)),100),))
Kết thúc bằng Ctrl+Shift+Enter.

Công thức này cho <= 10 con số cộng với nhau, nếu muốn hơn chỉnh ROW($1:$10)-1, Vd: ROW($1:$20)-1 dành cộng <= 20 số.

Thân
-> @Phan Thế Hiệp
Anh xem Hàm dưới đây (Hàm mượn) không phải dùng công thức mảng. Nhưng chỉ là lấy tất cả các chữ số trong chuỗi.
Nói về Hàm Excel thì em lười học quá. Anh xem và chuyển thể thành tính toán không biết là được không
Mã:
=IF(SUM(LEN(A2)-LEN(SUBSTITUTE(A2, {"0","1","2","3","4","5","6","7","8","9"}, "")))>0, SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("$1:$"&LEN(A2))),1))* ROW(INDIRECT("$1:$"&LEN(A2))),0), ROW(INDIRECT("$1:$"&LEN(A2))))+1,1) * 10^ROW(INDIRECT("$1:$"&LEN(A2)))/10),"")
 
Upvote 0
-> @Phan Thế Hiệp
Anh xem Hàm dưới đây (Hàm mượn) không phải dùng công thức mảng. Nhưng chỉ là lấy tất cả các chữ số trong chuỗi.
Nói về Hàm Excel thì em lười học quá. Anh xem và chuyển thể thành tính toán không biết là được không
Mã:
=IF(SUM(LEN(A2)-LEN(SUBSTITUTE(A2, {"0","1","2","3","4","5","6","7","8","9"}, "")))>0, SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("$1:$"&LEN(A2))),1))* ROW(INDIRECT("$1:$"&LEN(A2))),0), ROW(INDIRECT("$1:$"&LEN(A2))))+1,1) * 10^ROW(INDIRECT("$1:$"&LEN(A2)))/10),"")
Công thức bạn gửi chỉ bỏ đi các ký tự không phải số, chỉ giữ lại các con số. Ví dụ: A1=12(1)+13(2)+14(3) sẽ ra kết quả: 121,132,143.

Nếu vậy thì chỉ cần dùng công thức như sau:
Mã:
=--SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"(",""),")",""),"+","")
Chỉ Enter.

Do lấy toàn bộ các số nên không tính toán gì được.

Thân
 
Upvote 0
Công thức bạn gửi chỉ bỏ đi các ký tự không phải số, chỉ giữ lại các con số. Ví dụ: A1=12(1)+13(2)+14(3) sẽ ra kết quả: 121,132,143.

Nếu vậy thì chỉ cần dùng công thức như sau:
Mã:
=--SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"(",""),")",""),"+","")
Chỉ Enter.

Do lấy toàn bộ các số nên không tính toán gì được.

Thân
Hỏi Anh mà còn hỏi thiếu. Ý em là có + , - , * , / , ^. như một bài toán căn bản
 
Upvote 0
Hỏi Anh mà còn hỏi thiếu. Ý em là có + , - , * , / , ^. như một bài toán căn bản
Như bạn biết, tùy theo tình hình dữ liệu và yêu cầu ra sao thì mới có giải pháp thích hợp: nên dùng công thức (thường/mảng), có dùng thêm các bước chế biến phụ hay không, hoặc dùng công cụ có sẵn của Excel, hoặc phải dùng VBA.

Với công thức nó chỉ trong chừng mực, không thể miễn cưỡng đòi phải làm hết các yêu cầu vượt quá khả năng của nó.

Thân
 
Upvote 0
Thử bằng công thức mảng:
A1=12(1)+13(2)+14(3)
Mã:
=SUM(IFERROR(--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(A1,"+",REPT(" ",100)),(ROW($1:$10)-1)*100+1,100)),"(",REPT(" ",100)),100),))
Kết thúc bằng Ctrl+Shift+Enter.

Công thức này cho <= 10 con số cộng với nhau, nếu muốn hơn chỉnh ROW($1:$10)-1, Vd: ROW($1:$20)-1 dành cộng <= 20 số.

Thân
Thử bằng công thức mảng:
A1=12(1)+13(2)+14(3)
Mã:
=SUM(IFERROR(--LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(A1,"+",REPT(" ",100)),(ROW($1:$10)-1)*100+1,100)),"(",REPT(" ",100)),100),))
Kết thúc bằng Ctrl+Shift+Enter.

Công thức này cho <= 10 con số cộng với nhau, nếu muốn hơn chỉnh ROW($1:$10)-1, Vd: ROW($1:$20)-1 dành cộng <= 20 số.

Thân

Thanks anh, em làm đc rồi ^^
 
Upvote 0
Như bạn biết, tùy theo tình hình dữ liệu và yêu cầu ra sao thì mới có giải pháp thích hợp: nên dùng công thức (thường/mảng), có dùng thêm các bước chế biến phụ hay không, hoặc dùng công cụ có sẵn của Excel, hoặc phải dùng VBA.

Với công thức nó chỉ trong chừng mực, không thể miễn cưỡng đòi phải làm hết các yêu cầu vượt quá khả năng của nó.

Thân
Thì ở trên em có dòng này "chuyển thể thành tính toán không biết là được không". Lúc đầu nhìn Hàm thấy khó rồi. Nếu nghỉ thêm thuật toán chắc vỡ tâm trí
 
Upvote 0
@longnhongdichoi
Mới học RegExp, lấy bài của bạn làm thử
Mã:
Option Explicit
Sub Reg_abc()
Dim SArr, Res, i, k
SArr = Sheet1.Range("b6", Sheet1.Range("b1000000").End(xlUp))
k = UBound(SArr)
ReDim Res(1 To k, 1 To 1)
With CreateObject("Vbscript.RegExp")
    .Global = True
    .Pattern = "\([^\)]+\)"
    For i = 1 To k
        Res(i, 1) = Evaluate(.Replace(SArr(i, 1), ""))
    Next i
End With
With Sheet1
    .Range("c6").Resize(k, 1).ClearContents
    .Range("c6").Resize(k, 1) = Res
End With
End Sub
 
Upvote 0
Web KT
Back
Top Bottom