Dùng hàm tự tạo là khoẻ nhất
PHP:Public Function tong(cell As Range) As Long Dim i As Byte, kq As Long For i = 1 To Len(cell) kq = kq + Val(Mid(cell, i, 1)) Next tong = kq End Function
EM gửi kèm file trên đó, bác viết giúp em cái nhé. Khoản này em mù tịt! E cảm ơn nhiều !
Em có 1 file số exel như sau:
Hình minh họa:
View attachment 86592
Cần tính tổng các con số ở cột A và cho kết quả tương xứng ở cột B
Như ví dụ đang tính dở ở cột B: B2 = 0+9+1+5+1+8+9+6+9+5 = 53)
Em cảm ơn nhiều !
Đố biết có cách nào không vòng lập mà vẫn tính được?Dùng hàm tự tạo là khoẻ nhất
PHP:Public Function tong(cell As Range) As Long Dim i As Byte, kq As Long For i = 1 To Len(cell) kq = kq + Val(Mid(cell, i, 1)) Next tong = kq End Function
Đọc câu đố này "nhức đầu" à nghe!Đố biết có cách nào không vòng lập mà vẫn tính được?
Ẹc... Ẹc...
Gợi ý: Hãy dùng CreateObject("VBScript.RegExp") để từng ký tự cách nhau bời 1 khoảng trắng. Xong, TRIM nó 1 phát rồi biến khoảng trắng này thành dấu "+". Cuối cùng Evaluate cái là ra kết quảĐọc câu đố này "nhức đầu" à nghe!
Em cũng đã nghĩ đến cái này rồi, chỉ có cái này là không dùng vòng lập nhưng tối qua ngồi làm hoài mà không biết làm sao đưa cái khoảng trắng vô giữa các ký tự. Anh làm 1 cái cho em học đi.Gợi ý: Hãy dùng CreateObject("VBScript.RegExp") để từng ký tự cách nhau bời 1 khoảng trắng. Xong, TRIM nó 1 phát rồi biến khoảng trắng này thành dấu "+". Cuối cùng Evaluate cái là ra kết quả
Ẹc... Ẹc...
Em cũng đã nghĩ đến cái này rồi, chỉ có cái này là không dùng vòng lập nhưng tối qua ngồi làm hoài mà không biết làm sao đưa cái khoảng trắng vô giữa các ký tự. Anh làm 1 cái cho em học đi.
Function SumDigits(ByVal Num As String) As Long
Dim tmp As String
tmp = Val(Replace(Num, " ", ""))
If Len(tmp) Then
With CreateObject("VBScript.RegExp")
.Global = True: [COLOR=#ff0000][B].Pattern = ""[/B][/COLOR]
tmp = Trim(.Replace(tmp, " "))
End With
SumDigits = Evaluate(Replace(tmp, " ", "+"))
End If
End Function
Đại khái vầy nè:
Chổ màu đỏ là chổ đánh dấu để ta thay thế đóMã:Function SumDigits(ByVal Num As String) As Long Dim tmp As String tmp = Val(Replace(Num, " ", "")) If Len(tmp) Then With CreateObject("VBScript.RegExp") .Global = True: [COLOR=#ff0000][B].Pattern = ""[/B][/COLOR] tmp = Trim(.Replace(tmp, " ")) End With SumDigits = Evaluate(Replace(tmp, " ", "+")) End If End Function
Từ đây ta có thể nghĩ đến bài toán khác: Tách từng ký tự của một chuổi và cho vào mảng, đúng không (bằng cách dùng thêm Split)
Gợi ý: Hãy dùng CreateObject("VBScript.RegExp") để từng ký tự cách nhau bời 1 khoảng trắng. Xong, TRIM nó 1 phát rồi biến khoảng trắng này thành dấu "+". Cuối cùng Evaluate cái là ra kết quả
Ẹc... Ẹc...
Đại khái vầy nè:
Chổ màu đỏ là chổ đánh dấu để ta thay thế đóMã:Function SumDigits(ByVal Num As String) As Long Dim tmp As String tmp = Val(Replace(Num, " ", "")) If Len(tmp) Then With CreateObject("VBScript.RegExp") .Global = True: [COLOR=#ff0000][B].Pattern = ""[/B][/COLOR] tmp = Trim(.Replace(tmp, " ")) End With SumDigits = Evaluate(Replace(tmp, " ", "+")) End If End Function
Từ đây ta có thể nghĩ đến bài toán khác: Tách từng ký tự của một chuổi và cho vào mảng, đúng không (bằng cách dùng thêm Split)
Function SumDigits(ByVal Num As String) As Long
Dim tmp As String, RegExp As Object
Set RegExp = CreateObject("VBScript.RegExp")
With RegExp
.Global = True
.pattern = "[^0-9]"
' xóa tất cả các ký tự không là chữ số. Chỗ này thay cho hàm VAL để phục vụ chuỗi có > 15 chữ số
tmp = .Replace(Num, "")
If Len(tmp) Then
' dùng "\B\B" để không bị chèn ở đầu và cuối
.pattern = [COLOR=#ff0000]"\B\B"
[/COLOR] tmp = .Replace(tmp, "+")
If Len(tmp) = 1 Then
SumDigits = tmp
Else
SumDigits = Evaluate(tmp)
End If
End If
End With
Set RegExp = Nothing
End Function
Tôi nghĩ là hàm của bạn ndu:
1. Không hỗ trợ các chuỗi dài. vd. nếu ta có chuỗi "12345678987654321" thì nó có tận 17 chữ số nên sau câu lệnh tmp = Val(Replace(Num, " ", "")) ta sẽ có dạng tmp = "1,23456789876543E+16" (tổng cộng chỉ có 15 chữ số thôi). Vậy các thao tác tiếp theo sẽ sai hết.
2. Nếu chuỗi ngắn thì kết quả đúng với chuỗi có ít nhất 2 chữ số - vì vd. nếu chuỗi là "5" thì Evaluate("5") sẽ gây lỗi.
Nhưng code chưa hay lắm. Sao ta phải làm 2 bước Replace - 1 để chèn các dấu cách " ", sau đó lại thay dấu cách bằng dấu "+"? Chèn luôn dấu "+" thôi. Và không có dùng thêm hàm TRIM làm gì.
Mà dùng Pattern là "" không hay lắm. Dùng "\B\B" thì không bị chèn ở đầu và cuối.
Tôi mạn phép sửa code như sau:
Mã:Function SumDigits(ByVal Num As String) As Long Dim tmp As String, RegExp As Object Set RegExp = CreateObject("VBScript.RegExp") With RegExp .Global = True .pattern = "[^0-9]" ' xóa tất cả các ký tự không là chữ số. Chỗ này thay cho hàm VAL để phục vụ chuỗi có > 15 chữ số tmp = .Replace(Num, "") If Len(tmp) Then ' dùng "\B\B" để không bị chèn ở đầu và cuối .pattern = [COLOR=#ff0000]"\B\B" [/COLOR] tmp = .Replace(tmp, "+") If Len(tmp) = 1 Then SumDigits = tmp Else SumDigits = Evaluate(tmp) End If End If End With Set RegExp = Nothing End Function
Công thức tại B2 là =SumDigits(A2)Sao code này không chạy được nhỉ ?
Function SumDigits(ByVal Num As String) As Long
Dim tmp As String, RegExp As Object
Set RegExp = CreateObject("VBScript.RegExp")
With RegExp
.Global = True
.pattern = "[^0-9]"
' xóa tất cả các ký tự không là chữ số. Chỗ này thay cho hàm VAL để phục vụ chuỗi có > 15 chữ số
tmp = .Replace(Num, "")
If Len(tmp) Then
' dùng "\B\B" để không bị chèn ở đầu và cuối
.pattern = [COLOR=#ff0000]"\B\B"
[/COLOR] tmp = .Replace(tmp, "+")
If Len(tmp) = 1 Then
SumDigits = tmp
Else
SumDigits = Evaluate(tmp)
End If
End If
End With
Set RegExp = Nothing
End Function
Bạn thử sao mà nói SAI vậy?Tôi tưởng code này tính được >15 số ?. >15 số thì chạy sai hếtMã:Function SumDigits(ByVal Num As String) As Long Dim tmp As String, RegExp As Object Set RegExp = CreateObject("VBScript.RegExp") With RegExp .Global = True .pattern = "[^0-9]" ' xóa tất cả các ký tự không là chữ số. Chỗ này thay cho hàm VAL để phục vụ chuỗi có > 15 chữ số tmp = .Replace(Num, "") If Len(tmp) Then ' dùng "\B\B" để không bị chèn ở đầu và cuối .pattern = [COLOR=#ff0000]"\B\B" [/COLOR] tmp = .Replace(tmp, "+") If Len(tmp) = 1 Then SumDigits = tmp Else SumDigits = Evaluate(tmp) End If End If End With Set RegExp = Nothing End Function
Mời thầy xem hộ em với, không biết là sai ở đâu,? thầy xem cái file thứ 2.Bạn thử sao mà nói SAI vậy?
2 file cho kết quả y chang nhau... Vậy bạn thắc mắc cái gì đây?Mời thầy xem hộ em với, không biết là sai ở đâu,? thầy xem cái file thứ 2.
Chắc là nhẩm tính tổng các con số 1,23457E+14. Bỏ chữ E và dấu cộng (+) ra, tổng "trật lấc" đó mà.2 file cho kết quả y chang nhau... Vậy bạn thắc mắc cái gì đây?
Chắc là nhẩm tính tổng các con số 1,23457E+14. Bỏ chữ E và dấu cộng (+) ra, tổng "trật lấc" đó mà.
Ẹc...
Đọc là tỷ tỷ thôi, là thật tôi cộng vẫn thấy sai ... bạn thử giúp điCái này là anh đoán thôi nha, nhưng sao lại có số lớn quá vậy hén. Đọc không được luôn nè. Nếu 15 số đọc là 100 ngàn tỷ hả?
Đọc là tỷ tỷ thôi, là thật tôi cộng vẫn thấy sai ... bạn thử giúp đi
"123456789987654321". cho số này vào trong bảng thì =92
"-------------------------". cho vào cột để cộng thì = 90.
Mời thầy xem hộ em với, không biết là sai ở đâu,? thầy xem cái file thứ 2.
hic, công thức cùi bắp này (ở bài số 10):
=SUM(--MID(A2, ROW(INDIRECT("1:" & LEN(A2))),1))
cũng tính tổng các chữ số "123456789987654321" ra 90.
hehe có cách đấy thử vào hỏi bác goodle thần chưởng xem bác ý có biết không mấy anh
Thế nếu ô A2 được định dạng là TEXT và người dùng gõ 123456789987654321????
Thì lúc đó SumDigits sẽ trả về 90. Còn cùi bắp trả về bao nhiêu tôi không thử.
Sao bạn không test thử, nếu số trên định dạng là số thì công thức của bạn là bao nhiêu?Còn khi định dạng là kiểu text thì hàm của Hoangvuluan là OK