Viết Code VBA tính tổng ngắn gọn hơn (1 người xem)

Liên hệ QC

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

phulien1902

GPE - My love
Tham gia
6/7/13
Bài viết
3,543
Được thích
4,425
Chào mọi người
Hiện tại tôi đang dùng Code dưới đây để tính tổng cho các giá trị, nhưng thấy code vẫn dài.
Ai đó có thể giúp tôi viết Code gọn hơn.
Xin cảm ơn !

Mã:
Sub Abc()
    Dim StartRow As Integer
    Dim EndRow As Integer
    StartRow = 1
    EndRow = 25
    For i = StartRow To EndRow
        If Cells(i, "A") = "" And Cells(i, "b") = "" And Cells(i, "c") = "" And Cells(i, "d") = "" And Cells(i, "e") = "" Then
            Cells(i, "A").Formula = "=SUM(A" & StartRow & ":A" & i - 1 & ")"
            Cells(i, "b").Formula = "=SUM(b" & StartRow & ":b" & i - 1 & ")"
            Cells(i, "c").Formula = "=SUM(c" & StartRow & ":c" & i - 1 & ")"
            Cells(i, "d").Formula = "=SUM(d" & StartRow & ":d" & i - 1 & ")"
            Cells(i, "e").Formula = "=SUM(e" & StartRow & ":e" & i - 1 & ")"
            StartRow = i + 1
        End If
    Next
End Sub
 
Chào mọi người
Hiện tại tôi đang dùng Code dưới đây để tính tổng cho các giá trị, nhưng thấy code vẫn dài.
Ai đó có thể giúp tôi viết Code gọn hơn.
Xin cảm ơn !
[/CODE]
Bạn thử đoạn code này xem sao. Không có File nên không Test được!
Mã:
Sub Abc()
Dim StartRow As Integer, EndRow As Integer
Dim i As Long, j As Long
StartRow = 1: EndRow = 25
For i = StartRow To EndRow
For j = 1 To 5
    If Cells(i, j) = "" Then Cells(i, j).Formula = "=SUM(j" & StartRow & ":j" & i - 1 & ")"
Next j
Next
End Sub
 
Upvote 0
Bạn thử đoạn code này xem sao. Không có File nên không Test được!
Mã:
Sub Abc()
Dim StartRow As Integer, EndRow As Integer
Dim i As Long, j As Long
StartRow = 1: EndRow = 25
For i = StartRow To EndRow
For j = 1 To 5
    If Cells(i, j) = "" Then Cells(i, j).Formula = "=SUM(j" & StartRow & ":j" & i - 1 & ")"
Next j
Next
End Sub
Cảm ơn bạn chuot0106.
Code của bạn cho kết quả vẫn chưa đúng như Code bài #1.
 
Upvote 0
Chào mọi người
Hiện tại tôi đang dùng Code dưới đây để tính tổng cho các giá trị, nhưng thấy code vẫn dài.
Ai đó có thể giúp tôi viết Code gọn hơn.
Xin cảm ơn !

Mã:
Sub Abc()
    Dim StartRow As Integer
    Dim EndRow As Integer
    StartRow = 1
    EndRow = 25
    For i = StartRow To EndRow
        If Cells(i, "A") = "" And Cells(i, "b") = "" And Cells(i, "c") = "" And Cells(i, "d") = "" And Cells(i, "e") = "" Then
            Cells(i, "A").Formula = "=SUM(A" & StartRow & ":A" & i - 1 & ")"
            Cells(i, "b").Formula = "=SUM(b" & StartRow & ":b" & i - 1 & ")"
            Cells(i, "c").Formula = "=SUM(c" & StartRow & ":c" & i - 1 & ")"
            Cells(i, "d").Formula = "=SUM(d" & StartRow & ":d" & i - 1 & ")"
            Cells(i, "e").Formula = "=SUM(e" & StartRow & ":e" & i - 1 & ")"
            StartRow = i + 1
        End If
    Next
End Sub
Thử vầy xem
PHP:
Sub Abc()
    Dim StartRow As Long, EndRow As Long
    StartRow = 1:    EndRow = 25
    For i = StartRow To EndRow
        If Application.WorksheetFunction.CountA(Cells(i, 1).Resize(, 5)) = 0 Then
            Cells(i, "A").Resize(, 5).FormulaR1C1 = "=SUM(R" & StartRow & "C:R[-1]C)"
            StartRow = i + 1
        End If
    Next
End Sub
 
Upvote 0
Thử vầy xem
PHP:
Sub Abc()
    Dim StartRow As Long, EndRow As Long
    StartRow = 1:    EndRow = 25
    For i = StartRow To EndRow
        If Application.WorksheetFunction.CountA(Cells(i, 1).Resize(, 5)) = 0 Then
            Cells(i, "A").Resize(, 5).FormulaR1C1 = "=SUM(R" & StartRow & "C:R[-1]C)"
            StartRow = i + 1
        End If
    Next
End Sub

Cảm ơn bạn huuthang_bd.
Chuẩn quá rồi!
 
Upvote 0
Chào mọi người
Hiện tại tôi đang dùng Code dưới đây để tính tổng cho các giá trị, nhưng thấy code vẫn dài.
Ai đó có thể giúp tôi viết Code gọn hơn.
Xin cảm ơn !

Mã:
Sub Abc()
    Dim StartRow As Integer
    Dim EndRow As Integer
    StartRow = 1
    EndRow = 25
    For i = StartRow To EndRow
        If Cells(i, "A") = "" And Cells(i, "b") = "" And Cells(i, "c") = "" And Cells(i, "d") = "" And Cells(i, "e") = "" Then
            Cells(i, "A").Formula = "=SUM(A" & StartRow & ":A" & i - 1 & ")"
            Cells(i, "b").Formula = "=SUM(b" & StartRow & ":b" & i - 1 & ")"
            Cells(i, "c").Formula = "=SUM(c" & StartRow & ":c" & i - 1 & ")"
            Cells(i, "d").Formula = "=SUM(d" & StartRow & ":d" & i - 1 & ")"
            Cells(i, "e").Formula = "=SUM(e" & StartRow & ":e" & i - 1 & ")"
            StartRow = i + 1
        End If
    Next
End Sub

Code này có chạy được đâu mà kêu sửa
 
Upvote 0
Bạn thử xóa dòng 1 rồi chạy lại code xem có được không?
(Ý tôi nói code chạy không được chính là chỗ này đấy)
Đúng là như vậy.
Vậy anh cho em hỏi đối với trường hợp có những dòng trống phía trên bảng số liệu thì phải dùng Code như thế nào? Chắc anh đã có câu trả lời cho bài toán này.
Anh hãy viết vài dòng Code giúp em.
Cảm ơn anh!
 
Upvote 0
Bài này mấu chốt là tìm dòng tính tổng. Nếu chỉ căn cứ vào dòng trống thì gặp trường hợp dòng dữ liệu trống lập tức code nhầm tưởng thành dòng tổng.
Bạn nắm dữ liệu gốc và yêu cầu thì bạn sẽ xác định chính xác nhất, ngoài ra nếu không căn cứ vào dòng trống thì chỉ là võ đoán (dòng tô màu nền chẳng hạn)
 
Upvote 0
Đúng là như vậy.
Vậy anh cho em hỏi đối với trường hợp có những dòng trống phía trên bảng số liệu thì phải dùng Code như thế nào? Chắc anh đã có câu trả lời cho bài toán này.
Anh hãy viết vài dòng Code giúp em.
Cảm ơn anh!
Khi dòng đầu chứa toàn ô trống thì công thức tại A1=sum(A0) sẽ bị lỗi Subscript out of range.
Để sửa thì bạn thay vòng For thành
For i=StartRow+1 to EndRow
 
Upvote 0
Khi dòng đầu chứa toàn ô trống thì công thức tại A1=sum(A0) sẽ bị lỗi Subscript out of range.
Để sửa thì bạn thay vòng For thành
For i=StartRow+1 to EndRow
Cảm ơn bạn
Tuy nhiên Code vẫn chưa ngon lành đâu. Giả sử không phải 1 dòng trống phía trên của bảng dữ liệu , mà là 2,3,4....thì khi chay code các dòng trống khi nãy thì giờ cho kết quả toàn là số 0.
Vậy Code vẫn chưa được trọn vẹn, hii.
Tôi nghĩ rằng ý của anh ndu là khi chạy Code thì các dòng trống phía trên số liệu sẽ "trắng trơn", chỉ cho kết quả tổng vào các dòng trống phía dưới dữ liệu.
 
Upvote 0
Với dạng dữ liệu tạm bợ thì đừng mong có code ngon lành.
 
Upvote 0
Cảm ơn bạn
Tuy nhiên Code vẫn chưa ngon lành đâu. Giả sử không phải 1 dòng trống phía trên của bảng dữ liệu , mà là 2,3,4....thì khi chay code các dòng trống khi nãy thì giờ cho kết quả toàn là số 0.
Vậy Code vẫn chưa được trọn vẹn, hii.
Tôi nghĩ rằng ý của anh ndu là khi chạy Code thì các dòng trống phía trên số liệu sẽ "trắng trơn", chỉ cho kết quả tổng vào các dòng trống phía dưới dữ liệu.
Bạn thử code này xem sao, nếu vẫn không được thì bạn nên nói rõ lại yêu cầu.
Mã:
Sub XXX()
    Dim StartRow&, EndRow&, i&, j&, chk As Boolean
    StartRow = 1
    EndRow = 25
    j = StartRow
    For i = StartRow To EndRow
        If Application.WorksheetFunction.CountBlank(Range("A" & i, "E" & i)) = 5 Then
            If chk Then
                Range("A" & i).Formula = "=SUM(A" & j & ":A" & (i - 1) & ")"
                Range("A" & i, "E" & i).FillRight
                chk = False
                j = i + 1
            End If
        Else
            chk = True
        End If
    Next
End Sub
 
Upvote 0
Bạn thử code này xem sao, nếu vẫn không được thì bạn nên nói rõ lại yêu cầu.
Mã:
Sub XXX()
    Dim StartRow&, EndRow&, i&, j&, chk As Boolean
    StartRow = 1
    EndRow = 25
    j = StartRow
    For i = StartRow To EndRow
        If Application.WorksheetFunction.CountBlank(Range("A" & i, "E" & i)) = 5 Then
            If chk Then
                Range("A" & i).Formula = "=SUM(A" & j & ":A" & (i - 1) & ")"
                Range("A" & i, "E" & i).FillRight
                chk = False
                j = i + 1
            End If
        Else
            chk = True
        End If
    Next
End Sub

Cảm ơn bạn! Code chuẩn rồi.

Ban đầu khi tôi dùng Code bài #1 để tính tổng cho các dòng trống phía dưới DL mà chưa lường được khả năng xảy ra như anh ndu đã nói. Đến giờ toán của tôi đã được giải quyết xong 1 cách trọn vẹn.
Tôi xin gửi lời cảm ơn đến tất cả các anh, em trên diễn đàn GPE đã giành thời gian quý báu của mình để chia sẻ và giải đáp vấn đề vướng mắc của tôi.
 
Upvote 0

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

Back
Top Bottom