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

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
412
Thích
180
Điểm
395
#23
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:

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
412
Thích
180
Điểm
395
#26
Tham gia ngày
7 Tháng mười hai 2018
Bài viết
4
Thích
0
Điểm
13
Tuổi
22
#27
Ơ 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

Phan Thế Hiệp

Thành viên tích cực
Tham gia ngày
10 Tháng mười 2017
Bài viết
1,541
Thích
4,247
Điểm
360
Tuổi
46
#29
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
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
412
Thích
180
Điểm
395
#30
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),"")
 

Phan Thế Hiệp

Thành viên tích cực
Tham gia ngày
10 Tháng mười 2017
Bài viết
1,541
Thích
4,247
Điểm
360
Tuổi
46
#31
-> @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
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
412
Thích
180
Điểm
395
#32
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
 

Phan Thế Hiệp

Thành viên tích cực
Tham gia ngày
10 Tháng mười 2017
Bài viết
1,541
Thích
4,247
Điểm
360
Tuổi
46
#33
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
 
Tham gia ngày
7 Tháng mười hai 2018
Bài viết
4
Thích
0
Điểm
13
Tuổi
22
#34
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
Cảm ơn anh, em làm đc rồi ^^
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
412
Thích
180
Điểm
395
#35
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í
 

CHAOQUAY

Thành viên thường trực
Tham gia ngày
24 Tháng tám 2018
Bài viết
200
Thích
129
Điểm
45
#36
@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
 
Top