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?