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

Liên hệ QC

Người dùng đang xem chủ đề này

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
 
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ỏi lại đây:
- Chuổi của bạn có phải luôn có 2 thành phần cách nhau bởi dấu cộng?
- Ký tự mà bạn muốn loại bỏ luôn là R và L?
Đúng không?
Nếu có khác hơn, tốt nhất cho file lên đây đi
 
Upvote 0
vâng, chính xác là như vậy, chuỗi luôn có 2 phần tách nhau bởi "+"
Kí tự thì không nhất thiết phải là L và R, có thể là TL&TR......
có file tham khảo bác thử hộ em với.
thanks bác rất nhiều.
 

File đính kèm

Upvote 0
vâng, chính xác là như vậy, chuỗi luôn có 2 phần tách nhau bởi "+"
Kí tự thì không nhất thiết phải là L và R, có thể là TL&TR......
có file tham khảo bác thử hộ em với.
thanks bác rất nhiều.
Bài này cũng hơi.. tê vì các ký tự không cố định
Thôi thì chơi kiểu bùn bằng cách đặt name
PHP:
Tmp1=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Sheet1!$A2,"0",""),"1",""),"2",""),"3",""),"4","")
PHP:
Tmp2=EVALUATE("{"""&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Tmp1,"5",""),"6",""),"7",""),"8",""),"9",""),"+",""",""")&"""}")
PHP:
=SUBSTITUTE(SUBSTITUTE(Sheet1!$A2,INDEX(Tmp2,,1),""),INDEX(Tmp2,,2),"")
PHP:
=IF(ISERROR(EVALUATE(Tmp)),"",EVALUATE(Tmp))
Công thức tại B2: =Eval rồi kéo fill xuống
 

File đính kèm

Upvote 0
vâng, chính xác là như vậy, chuỗi luôn có 2 phần tách nhau bởi "+"
Kí tự thì không nhất thiết phải là L và R, có thể là TL&TR......
có file tham khảo bác thử hộ em với.
thanks bác rất nhiều.

Tôi gửi bạn hàm viết bằng VBA. Code hàm dưới đây:

Mã:
Function SumStr(ByVal Text As String) As Double
    Dim I&, sChar$
    For I = 1 To Len(Text)
        sChar = Mid(Text, I, 1)
        If IsNumeric(sChar) Then
            SumStr = SumStr + CDbl(sChar)
        End If
    Next I
End Function

Bạn có thể download file đính kèm.
 

File đính kèm

Upvote 0
Tôi gửi bạn hàm viết bằng VBA. Code hàm dưới đây:

Mã:
Function SumStr(ByVal Text As String) As Double
Dim I&, sChar$
For I = 1 To Len(Text)
sChar = Mid(Text, I, 1)
If IsNumeric(sChar) Then
SumStr = SumStr + CDbl(sChar)
End If
Next I
End Function

Bạn có thể download file đính kèm.

Hình như không đúng ý chủ topic Thầy Tuân ơi, giống như cách của Thầy Ndu thì đúng hơn.
 
Upvote 0
Tôi gửi bạn hàm viết bằng VBA. Code hàm dưới đây:

Mã:
Function SumStr(ByVal Text As String) As Double
    Dim I&, sChar$
    For I = 1 To Len(Text)
        sChar = Mid(Text, I, 1)
        If IsNumeric(sChar) Then
            SumStr = SumStr + CDbl(sChar)
        End If
    Next I
End Function
Bạn có thể download file đính kèm.
Nếu dùng code thì bài này không cần vòng lập đâu Tuân à:
PHP:
Function EvalStr(ByVal Text As String) As Double
  On Error Resume Next
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9+]"
    EvalStr = Evaluate(.Replace(Text, ""))
  End With
End Function
Với lại hàm của Tuân là cộng từng ký tự... Ví dụ chuổi 20L+21R thì hàm của Tuân cho kết quả =5 mà lý ra phải =41 mới đúng
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dùng code thì bài này không cần vòng lập đâu Tuân à:
PHP:
Function EvalStr(ByVal Text As String) As Double
  On Error Resume Next
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9+]"
    EvalStr = Evaluate(.Replace(Text, ""))
  End With
End Function
Với lại hàm của Tuân là cộng từng ký tự... Ví dụ chuổi 20L+21R thì hàm của Tuân cho kết quả =5 mà lý ra phải =41 mới đúng

Em hiểu nhầm ý đồ tác giả rồi. :D
 
Upvote 0
Em hiểu nhầm ý đồ tác giả rồi. :D
đúng là như thế thầy ạ, em cũng làm như thế thì ví dụ như ở trên đã nêu, nếu là 20L+20R thì kết quả phải là 40 đơn vị, nhưng theo cách trên thì kết quả chỉ ra bằng 4.
mong các thầy giúp em ạ:D

Rất cảm ơn thầy Ndu và các thầy, em đã thử mẫu của thầy và kết quả rất ok.
 
Lần chỉnh sửa cuối:
Upvote 0
xin chào mọi người.

mình muốn tính tổng các số trong ô vd: ô a1: cd12, a2 : c8, a3 : d12,5. mình muốn hỏi có cách nào để tính tổng số 3 ô = 12+8+12.5= 32,5 ko? mong các bạn giúp đở.
 
Upvote 0
Xây dựng một bài giải tổng quát thì khó, nhưng khéo xử lý theo từng trường hợp tùy theo dữ liệu thực thì có lẽ không quá phức tạp, nhất là nếu bạn chỉ cần làm một lần.

Trong trường hợp này có thể tìm quy luật về số chữ có trong chuỗi 1, 2, 3 , ... chữ rồi xử lý cắt ra sau đó cộng chẳng hạn,
 
Upvote 0
nếu như chuỗi k phải 2 phần mà là 3 hoặc 4 phần thì sao ?
mình thử cách của bạn ndu thì k ra kết quả ?
vd : 10L+10R+10E = ??
 
Upvote 0
Nếu dùng code thì bài này không cần vòng lập đâu Tuân à:
PHP:
Function EvalStr(ByVal Text As String) As Double
  On Error Resume Next
  With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "[^0-9+]"
    EvalStr = Evaluate(.Replace(Text, ""))
  End With
End Function
Với lại hàm của Tuân là cộng từng ký tự... Ví dụ chuổi 20L+21R thì hàm của Tuân cho kết quả =5 mà lý ra phải =41 mới đúng
Thầy ơi nếu như chỉ tính tổng chuỗi, bỏ qua ô mà chỉ có số thì làm thế nào ạ? Ví dụ em chỉ tính tổng dãy các chuỗi có duy nhất ký tự D thì hàm trên cần thay đổi thế nào (Lưu ý trong dãy chuỗi đó có thể có ô có giá trị là "DN"
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy ơi nếu như chỉ tính tổng chuỗi, bỏ qua ô mà chỉ có số thì làm thế nào ạ? Ví dụ em chỉ tính tổng dãy các chuỗi có duy nhất ký tự D thì hàm trên cần thay đổi thế nào (Lưu ý trong dãy chuỗi đó có thể có ô có giá trị là "DN"
DD thì sao?
 
Upvote 0
Bỏ thì bỏ.
Hỏi tiếp: cái hàm trên nó không phân biệt kết quả tính ra 0 thực thụ (1-1=0) hay do chả có số nào để tính. Bây giờ nếu bỏ qua thì muốn nó trả về cái gì?
Trong dãy của em có
Tại ô A1: 1D
Tại ô B1: 0.95D
Tại ô C1: DN
Tại ô D1: P
Tại ô E1: 1

Em muốn ra kết quả cuối là 1.95
 
Upvote 0
Function SumTumLum(byVal rg As Range) As Double
Dim cll, str
for each cll in rg
str = Replace(cll.value, "D", "")
If Len(str) = Len(cll.Value) - 1 Then ' co 1 ky tu D
If IsNumeric(str) Then SumTumLum = SumTumLum + Val(sttr)
End If
next cll
 
Upvote 0
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

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

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

Back
Top Bottom