Em cần giúp đỡ: Cách tính tổng các con số trong dãy số

  • Thread starter Thread starter Plaza
  • Ngày gửi Ngày gửi
Liên hệ QC

Plaza

Thành viên mới
Tham gia
14/10/10
Bài viết
42
Được thích
3
Em có 1 file số exel như sau:

Hình minh họa:
File.JPG

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 !
 

File đính kèm

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
 
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 !
 

File đính kèm

Có thể dùng công thức :
=MOD(INT(A2/10^0);10)+MOD(INT(A2/10^1);10)+MOD(INT(A2/10^2);10)+MOD(INT(A2/10^3);10)+MOD(INT(A2/10^4);10)+MOD(INT(A2/10^5);10)+MOD(INT(A2/10^6);10)+MOD(INT(A2/10^7);10)+MOD(INT(A2/10^8);10)+MOD(INT(A2/10^9);10)+MOD(INT(A2/10^10);10)
 
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
Đố biết có cách nào không vòng lập mà vẫn tính được?
Ẹc... Ẹc...
 
Thank các bác nhiều ạ...tất cả đều rất hay !!!!!
 
Dùng công thức mảng này xem sao:
=SUM(--MID(A2, ROW(INDIRECT("1:" & LEN(A2))),1))
 
Đọc câu đố này "nhức đầu" à nghe!
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...
 
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.
 
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.

Đại khái vầy nè:
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
Chổ màu đỏ là chổ đánh dấu để ta thay thế đó
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)
 
Đại khái vầy nè:
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
Chổ màu đỏ là chổ đánh dấu để ta thay thế đó
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)

Thấy anh làm 1 lần thế này rồi thì mới có thể làm theo được. Quá hay.
 
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è:
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
Chổ màu đỏ là chổ đánh dấu để ta thay thế đó
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)

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
 
Lần chỉnh sửa cuối:
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

Sao code này không chạy được nhỉ ?
 
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
[/QUOTE]
Tôitưởng code này tính được >15 số ?. >15 số thì chạy sai hết
 
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
Tôi tưởng code này tính được >15 số ?. >15 số thì chạy sai hết
Bạn thử sao mà nói SAI vậy?
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom