Sum có điểm dừng (7 người xem)

Liên hệ QC

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

Lúc trước ta quét từ dưới lên, khi gặp cell rổng thì gán công thức
Giờ ta thêm 1 điều kiện nữa: Quét ngược từ dưới lên, nếu gặp cell rổng hoặc cell chứa công thức thì sẽ gán công thức mới
(chẳng hạn là If Cells(i, 2) = "" Or Cells(i, 2).HasFormula Then)
Đơn giản thế thôi

Uh hen, vậy đâu cần phải 2 vòng lặp làm chi! Cám ơn Thầy!

PHP:
Sub TongCong()
    Dim Er As Long, i As Long, iM As String
    Range([B5], [B65536].End(xlUp)).Font.Bold = False
    Er = [B65536].End(xlUp).Row
    For i = Er To 5 Step -1
        With Cells(i, 2)
            If iM = vbNullString Then iM = .Address(0, 0)
            If .Value = vbNullString Or .HasFormula Then
                .Value = "=SUM(" & Cells(i + 1, 2).Address(0, 0) & ":" & iM & ")"
                .Font.Bold = True: iM = vbNullString
            End If
        End With
    Next i
End Sub

p/s: Nếu chỉ có công thức SUM ở cột B như vậy thôi thì áp dụng cái thủ tục này, nhưng nếu các mục là công thức cập nhật từ nguồn khác thì dùng thủ tục 2 vòng lặp như bài trước!
 
Lần chỉnh sửa cuối:
p/s: Nếu chỉ có công thức SUM ở cột B như vậy thôi thì áp dụng cái thủ tục này, nhưng nếu các mục là công thức cập nhật từ nguồn khác thì dùng thủ tục 2 vòng lặp như bài trước!
Nói chung là tuy từng trường hợp mà viết code
Tuy nhiên xin nói rõ rằng: Mọi code đều dựa trên CSDL thực tế và dữ liệu đương nhiên phải có 1 quy luật nào đó (để bám vào mà viết code) ---> Vậy nên chẳng có 1 code nào có thể đáp ứng cho mọi trường hợp cả (nhất là dạng dữ liệu lung tung)
 
Lúc trước ta quét từ dưới lên, khi gặp cell rổng thì gán công thức
Giờ ta thêm 1 điều kiện nữa: Quét ngược từ dưới lên, nếu gặp cell rổng hoặc cell chứa công thức thì sẽ gán công thức mới
(chẳng hạn là If Cells(i, 2) = "" Or Cells(i, 2).HasFormula Then)
Đơn giản thế thôi

Cư bài nào gặp trên diễn đàn mà do thày Ndu, thày Ptm0412 giải thì gần như là một thương hiệu tốt nhất, có thể coi là chuẩn mực mà mọi người tin tưởng; về mặt thuật toán như câu trên đơn thuần về mặt tư duy thì có thể suy luận được nhưng phần bôi đen ở trên sao em đọc các quyển sách VBA chẳng thấy nói đến. Xin thày chỉ cho em cách tìm các "từ vựng" đó ở đâu ah.
 
Lần chỉnh sửa cuối:
Cư bài nào gặp trên diễn đàn mà do thày Ndu, thày Ptm0412 giải thì gần như là một thương hiệu tốt nhất, có thể coi là chuẩn mực mà mọi người tin tưởng; về mặt thuật toán như câu trên đơn thuần về mặt tư duy thì có thể suy luận được nhưng phần bôi đen ở trên sao em đọc các quyển sách VBA chẳng thấy nói đến. Xin thày chỉ cho em cách tìm các "từ vựng" như thế nào ah.
Làm sao biết được cell chứa công thức thì sẽ liên quan đến HasFormula? Thường thì trong cửa sổ VBA, tôi sẽ bấm F1, gõ từ khóa nào đó (mà tôi quan tâm) xem phần trợ giúp trả lời điều gì... Còn như vẫn tìm không ra, ta có google để làm gì? Gõ từ khóa vào mà tìm (có thể bằng tiếng Anh hoặc tiếng Việt)
-------------
Ngoài ra, khi rảnh, tôi vẫn thường "voc" tùm lum trong cửa sổ VBA... Ví dụ tôi viết thế này khi muốn tìm hiểu các thuộc tính có liên quan đến Range

untitled.JPG


Sau khi đã chọn 1 phương thức hoặc 1 thuộc tính, để tìm hiểu thêm, có thể bôi đen nó rồi F1, phần trợ giúp sẽ trả lời cho bạn (thậm chí có cả ví dụ minh họa)
Nói ngắn gọn hơn: Làm nhiều tự nhiên biết nhiều (và cảm thấy... ngu thêm nhiều)
Ẹc... Ẹc...
 
Bài này với những ai mới học VBA tiếp cận là hay, tuy nhiên nó chưa tổng quát lắm, bởi nhiều khi trong công việc các cột số thứ tự và cột cần tính tổng không cố định, năm ngoái em được thày concogia và thày ptm0412 giúp cho bài này http://www.giaiphapexcel.com/forum/showthread.php?45238-có-cách-nào-kết-hợp-lọc-để-tính-tổng-có-thể-copy-nhanh-không-ạh/page3vào đúng đêm 30 tết năm ngoái, đến giờ em vẫn nhớ như in. Gửi bạn Dauthivan xem tham khảo bài này sẽ giúp cho bạn rất nhiều.

Hiển nhiên là chủ đề này quá cũ, đến chính tác giả cũng không nhớ chính mình đã từng hỏi.
Nay lấy lại file cũ, vẫn để hàm SubSum như cũ, (có 1 lỗi như hàm subtotal là khi filter nó ra kết quả kỳ cục). Ngoài ra, viết 1 thủ tục chọn ô (hoặc cột) chứa điều kiện tính tổng, chọn ô (hoặc cột) cần tính tổng, chọn ô (hoặc cột) cần để công thức, rồi chạy code.

[video=youtube_share;6Kc4xf1Hsfk]http://youtu.be/6Kc4xf1Hsfk[/video]
 

File đính kèm

Theo em cái này cũng đơn giản thôi, thêm câu lệnh xóa để thực hiện nguyên tắc dòng nào mà cột A có số thứ tự sẽ lập tức xóa nội dung cột B của dòng đó đi (cho ô B trở về rỗng như bài toán gốc), sau khi xong thao tác này mới thực hiện lện như thày ndu ở trên.
Xét ô rỗng để gán công thức, hoặc xét ô chứa công thức, xoá đi cho rỗng để gán công thức mới, đó là xét cái ngọn.
Tại sao không xét cái gốc là nếu cột A khác rỗng thì ghi công thức vào cột B? Trống cũng ghi mà có công thức cũ cũng ghi đè lên?

Ngay cả file gốc của anhtuan1066 bài #3 và code của ndu bài #8, cũng xét cái gốc là cột A không rỗng. Càng cải tiến càng đi xa cái gốc. Như code của minhthien, ban đầu thì 2 vòng lặp, 1 vòng để xoá công thức cũ. Sau khi cải tiến thì:
Mã:
[COLOR=#000000][COLOR=#007700]For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Er To 5 Step [/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1
        With Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
            If [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString Then iM [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700])
            If .[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][/COLOR][COLOR=#ff0000]vbNullString Or .HasFormula [/COLOR][COLOR=#000000][COLOR=#0000BB]Then
                [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"=SUM(" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#DD0000]":" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]")"
                [/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Font[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Bold [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]True[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString
            End [/COLOR][COLOR=#007700]If
        [/COLOR][COLOR=#0000BB]End With
    Next i[/COLOR][/COLOR]

Tại sao không phải là

Mã:
[COLOR=#000000][COLOR=#007700]For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Er To 5 Step [/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000BB]1
        [/COLOR][COLOR=#007700]    If [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString Then iM [/COLOR][COLOR=#007700]= .[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700])
            [/COLOR][/COLOR][COLOR=#ff0000]If Cells(i, 1)= vbNullString [/COLOR][COLOR=#000000][COLOR=#0000BB]Then
                [/COLOR][/COLOR][COLOR=#0000cd]Cells(i, 2)[/COLOR][COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Value [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#DD0000]"=SUM(" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000BB]Address[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]) & [/COLOR][COLOR=#DD0000]":" [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]& [/COLOR][COLOR=#DD0000]")"
                [/COLOR][/COLOR][COLOR=#0000cd]Cells(i, 2)[/COLOR][COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Font[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Bold [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]True[/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]iM [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]vbNullString
            End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000BB]    Next i[/COLOR][/COLOR]
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom