Tạo dòng “Tổng cộng cuối trang”

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Tạo ra dòng 'tổng đến hết trang' và 'số mang sang' cho bảng tính nhiều trang

Vọng Phúc

Khi in bảng tính trong Exel, làm thế nào để khi in ra các trang trong 1 sheet đều có dòng cuối trang của sheet đó ( dòng này là dòng tổng cộng do mình tạo ra không phải footer) ?

Ví dụ như trên sổ quỹ tiền mặt, cuối mỗi trang ta phải có dòng tổng, và sang đầu trang sau phải có số dư mang sang từ trang trước

Dòng tổng cộng này là rất cần thiết với thủ quỹ hay kế toán bằng tay trong việc cộng sổ hay kiểm tra sai sót. Đối với kế toán máy thì có thể bỏ qua

Muốn tạo ra dòng tổng cộng này, và cả dòng mang sang từ trang trước, ta thực hiện một macro đặt page setup và cố định độ cao dòng, mục đích là để có số dòng cố định trên 1 trang giấy in. Sau đó ta thực hiện insert dòng tổng phía dưới trang, insert dòng tiêu đề của trang sau, insert dòng mang sang từ trang trước, và đặt công thức tính toán vào các ô tương ứng

Trong trường hợp ta cần tính toán lại, hoặc thêm bớt dòng dữ liệu, nên ta cũng cần làm một cái macro ngược lại, tức là xóa đi những dòng dữ liệu đã thêm vào

www.giaiphapexcel.com/diendan/threads/t%E1%BA%A1o-d%C3%B2ng-t%E1%BB%95ng-c%E1%BB%99ng-cu%E1%BB%91i-trang.820/

Ứng dụng AI và Chat GPT trong Quản trị nhân sự
Khóa học SprinGO phù hợp

Ứng dụng AI và Chat GPT trong Quản trị nhân sự

Học xong khóa này, học viên có thể: Hiểu đúng bản chất AI, các nhóm AI phổ biến và cách AI “hoạt động” ở...

Xem khóa học
★★★★★ 5 ★ 1 👤 7 ▥ 0
Quảng cáo

Bạn nên đọc

7 Responses

  1. hands says:

    Paulsteigel

    Cái ông Excel nhiều khi cũng làm chúng ta ốm, cụ thể là trong trường hợp với các dấu ngắt trang.
    + Nếu bạn ở chế độ view normal – chắc đếm số dấu ngắt trang sẽ chẳng bao giờ chính xác cả.
    + Nếu bạn chưa đặt PrintArea, bạn cũng chẳng đếm được dấu ngắt trang.
    Nguyên nhân thì có lẽ phải hỏi ông Microsoft – chắc là trong một số bài tiếp tớ sẽ giải thích về cơ chế hiển thị print preview trong excel.
    Quay lại vấn đề của Cường. Để đặt được dấu ngắt trang chính xác, ta cần phải nói rõ cho Excel vùng in là khoảng nào, như thế thì không cần bật sang chế độ Print Preview, Excel cũng tự động xếp trang chính xác cho ta được.
    Tuy nhiên kể cũng có lắm rắc rối khi thực hiện điều này:
    [Cường có 5 trang, có các dòng có độ cao khác nhau, 4 trang đầu khi in ở chế độ preview thì đầy trang còn trang sau lửng lơ nửa chừng xuân. Excel sẽ đặt dấu ngắt trang ở cuối vùng in (và nó nằm ở đó đấy ạ). Dấu ngắt này sẽ không giãn xuống cuối trang đâu, vì thế nếu muốn in dòng chữ cám ơn nào đó vào cuối trang, bạn phải giãn vùng in đến sát cuối trang rồi mới thêm chữ …]
    Với cách đặt vấn đề này, tớ đề xuất một cách củ chuối như sau:
    1. Thiết lập vùng in với vùng dữ liệu hiện thời (UsedRange). Ghi lại số dấu ngắt trang hiện thời.
    2. Giãn vùng in 20 dòng một lần, sau mỗi lần giãn, đếm số Hpagebreak (dấu ngắt trang ngang)
    3. Khi số dấu ngắt trang mới lớn hơn số dấu ngắt trang cũ thì dừng lại và sử dụng dấu ngắt trang ngay sau dấu ngắt trang cũ làm mốc (Vì có thể ta thêm 20 dòng làm phát sinh 2 trang mới thì sao… hihi.
    4. Co vùng in về đúng sát vị trí của dấu ngắt trang mới liền kề dấu cũ này.
    5. Đưa đoạn text chào mừng vào ô ngay trên ô dính với dấu ngắt trang cuối cùng. Thuộc tính location của dấu ngắt trang trả về đối tượng Cell ngay dưới nó mà.
    Và kết thúc.
    Sau đây là thủ tục
    Sub test()
    ' Cái này chạy hơi chậm tẹo
    Dim OldPageCount As Long
    Dim NewPageCount As Long
    Dim tSheet As Worksheet, LastPage As HPageBreak

    ' Tắt chế độ làm tươi màn hình – quan trọng lắm đấy không thì bạn có thể làm màn hình nhảy disco liên tục và căn bản là nó sẽ chậm đáng kể – thủ tục đã chạy chậm nay còn chạy chậm hơn
    Application.ScreenUpdating = False
    ' Đưa chế độ view về chế độ PageBreak
    ActiveWindow.View = xlPageBreakPreview
    ' Ví dụ trang tính của ta có tên là php chẳng hạn
    Set tSheet = Worksheets("php")
    ' Nào gán vùng in vào vùng tính toán
    tSheet.PageSetup.PrintArea = IncrementPrintArea(tSheet.UsedRange.Address)
    ' Đếm số dấu ngắt trang hiện thời
    OldPageCount = tSheet.HPageBreaks.Count
    While tSheet.HPageBreaks.Count = OldPageCount
    ' Giãn vùng in để tìm dấu ngắt trang mới
    tSheet.PageSetup.PrintArea = IncrementPrintArea(tSheet.PageSetup.PrintArea)
    Wend
    Set LastPage = tSheet.HPageBreaks(tSheet.HPageBreaks.Count)
    ' Gán giá trị của ô cuối cùng/ trang cuối cùng
    LastPage.Location.Offset(-1).Value = "Hi there!"
    ' Và co vùng in về đến ô này thôi
    tSheet.PageSetup.PrintArea = tSheet.UsedRange.Address
    Set tSheet = Nothing
    ' Đưa excel về trạng thái bình thường như không có gì xảy ra… hih
    ActiveWindow.View = xlNormalView
    Application.ScreenUpdating = True
    End Sub

    Private Function IncrementPrintArea(LastArea As String, Optional numRow As Long = 20) As String
    Hàm này thực hiện việc tăng vùng in lên bằng vùng in cũ + 20 dòng mới
    Dim i As Long
    For i = Len(LastArea) To 1 Step -1
    If Mid(LastArea, i, 1) = "$" Then
    IncrementPrintArea = Left(LastArea, i) & Val(Mid(LastArea, i + 1)) + numRow
    Exit For
    End If
    Next
    End Function

    Để thử nghiệm, bạn đặt một nút bấm vào trang tính nhé, gắn cho nó macro là Test và thử xem nào … hihi

  2. hands says:

    Cám ơn bác đã đưa ra giải pháp. Để vấn đề thảo luận rõ ràng hơn, em xin được mô tả lại yêu cầu cụ thể như sau:
    Do yêu cầu công việc, em phải in một loạt báo giá sản phẩm vật liệu xây dựng, mỗi sản phẩm có nhiều mức giá cho mỗi đối tượng khác nhau.
    Dữ liệu được xử lý trên Excel.
    Trên mỗi báo giá, tại dòng cuối cùng của trang cuối cùng phải có dòng chữ "Cám ơn Quý khách hàng đã quan tâm đến sản phẩm của chúng tôi!". Nếu ít thì sẽ không đáng bàn, nhưng đây có đến mấy chục báo giá, mà lại in thành nhiều đợt khác nhau. Em có một thủ tục mà khi mỗi lần chọn nhãn hiệu sản phẩm, thì in luôn báo giá nhãn hiệu đó. Vấn đề là không thể xác định được dòng cuối cùng của trang cuối cùng để đưa dòng chữ đó vào.
    Em đã chạy thử chương trình của bác và thấy có thể áp dụng được. Nhưng em thấy có vẻ nó chưa được tối ưu lắm. Em chờ version mới của bác nhé!
    Dưng mà cậu phải cho tớ yêu cầu chứ – và cần nêu ra những cái bất tiện của đoạn mã tớ giới thiệu.. nếu không thì làm sao viết được phiên bản mới chứ .. hihi
    Đây, tớ gửi theo file làm ví dụ nhé/…./
    Ở đây có 2 ví dụ –
    file 1 là thể hiện ví dụ tìm ra điếm cuối cùng của trang in (Nếu trang cuối lơ lửng vài dòng thì dòng text vẫn in ở dòng cuối cùng trang đó).
    File 2 là ví dụ thêm dòng tổng trang vào mỗi trang. Hiện tại còn lỗi liên quan đến việc xác định dòng chính xác của cuối trang, tôi tìm cách sửa sau, các cao thủ xem giùm nhá. Và … cái ví dụ này của tôi chạy khá chậm, các bác có cao kiến gì thì xin đăng tải.

    Dear all,
    ——–
    Xuất phát từ yêu cầu, để giải quyết một công việc nào đó buộc chúng ta phải tìm hiểu và cải tiến các thủ tục. Bài toán của tôi như đã nêu trên có thể được coi là một ví dụ. Sau khi giải quyết được, ngoài niềm vui là công việc được giải quyết, niềm vui lớn hơn là hiểu được vấn đề và vận dụng. Cũng từ "bài tập" này có thể giải quyết được các "bài tập" khác, như cộng tổng cuối trang.
    Tôi muốn nói đến dòng tổng cộng cuối trang của sổ kế toán. Ý nghĩa của dòng này đã có dịp được bàn luận ở chủ đề khác ([URL='https://www.webketoan.com/forum/showthread.php?t=41'%5DHoàn thiện hình thức kế toán). Ở đây, nếu thực sự nó vẫn cần thiết đối với kết toán – đặc biệt là kế toán bằng MS Excel thì vấn đề này cũng đáng bàn lắm!
    Không phải đến đây mới bàn luận, các giải pháp đưa ra đều rất hay và thoả đáng. Song tôi vẫn cảm thấy giải pháp đưa ra dường như hoặc thiếu đi tính linh động (NHATKYCHUNG.xls của Adamtran chỉ thực hiện khi view và chỉ thực hiện cho 1 trang) hoặc phải qua nhiều khâu xử lý trung gian (TEST.xls của Paulsteigel) (?).
    Trước khi bàn bạc sâu đến giải pháp tính tổng cuối trang, tôi xin phép được minh hoạ cách mà tôi thực hiện rất hiệu với dòng cuối cùng của trang cuối cùng như đã mô tả như sau:
    Một số quy ước:
    – Độ cao của các dòng phải được cố định.
    – Một trang tiêu chuẩn (Standard Page)là trang được tạo ra bởi 2 dấu ngắt trang (HPageBreaks)
    – Nếu báo cáo chỉ có dưới 3 trang (tức là không có trang tiêu chuẩn) thì việc tạo dòng cuối cùng được xác định theo địa chỉ tuyệt đối.
    Sau đây là mã lệnh:

    With wshBAOGIA_XLS 'Worksheet hiện hành để in
    Dim lngPageRowCount As Long ' Lưu trữ số trang đếm được của một trang tiêu chuẩn
    Dim strThanksRange As String ' Tham chiếu cho vùng đặt lời cảm ơn
    Select Case .HPageBreaks.Count ' Đếm dấu ngắt trang
    Case 0 ' Chỉ có 1 trang
    strThanksRange = IIf(.Range("B53") = "", "B53", "B54")
    Case 1 ' Chỉ có 2 trang
    strThanksRange = IIf(.Range("B107") = "", "B107", "B108")
    Case Else ' Nhiều hơn 2 trang ---> có trang tiêu chuẩn
    lngPageRowCount = .HPageBreaks.Item(.HPageBreaks.Count).Location.Row - .HPageBreaks.Item(.HPageBreaks.Count - 1).Location.Row ' Tính số dòng của một trang tiêu chuẩn
    strThanksRange = "B" & .HPageBreaks.Item(.HPageBreaks.Count).Location.Row + lngPageRowCount - 4 ' Dòng cuối cùng sau khi đã trừ hao phần đầu của báo cáo (Header Report)
    End Select
    .Range(strThanksRange) = "Rất mong nhận được sự quan tâm của Quý khách hàng các bạn!"
    End with

    Vận dụng:
    Từ ví dụ này có thể thấy lngPageRowCount là tham số quan trọng trong thủ tục xử lý (cho đến bây giờ 3/11/2006 nó không còn là giải [URL='https://www.giaiphapexcel.com/forum/showthread.php?p=4715#post4715'%5Dpháp tối ưu nữa). Tham số này chỉ ra số dòng của một trang tiêu chuẩn. Chúng ta có thể dùng một vòng để duyệt qua các trang in. Qua mỗi bước nhảy chúng ta có thể xác định được dòng cuối cùng của mỗi trang. Kết hợp một vài xử lý cộng luỹ tích địa chỉ dòng, chúng ta hoàn toàn điều khiển được điểm cuối cùng của mỗi trang in.
    Hi vọng rằng giải pháp trên có thể giúp ích cho công việc kết toán bằng excel – trong những trường hợp bắt buộc và cũng rất mong sớm nhận được đoạn mã chương trình xử lý tính tổng cuối trang của các bạn.
    Chúc thành công!

    Paulsteigel Post :

    Case Else ' Nhiều hơn 2 trang ---> có trang tiêu chuẩn
    lngPageRowCount = .HPageBreaks.Item(.HPageBreaks.Count).Location.Row - .HPageBreaks.Item(.HPageBreaks.Count - 1).Location.Row ' Tính số dòng của một trang tiêu chuẩn
    strThanksRange = "B" & .HPageBreaks.Item(.HPageBreaks.Count).Location.Row + lngPageRowCount - 4 ' Dòng cuối cùng sau khi đã trừ hao phần đầu của báo cáo (Header Report)
    End with

    Rất thông minh – cách này rất hay, tốc độ – quá ổn!
    Nhưng cần chú ý, mình cũng đã dùng đến việc đếm Hpagebreak – nhưng bạn cần thêm dòng chuyển chế độ xem trang từ Normal sang Pagebreak Preview nhé – Chẳng hiểu sao Excel rất dở trong việc đếm pagebreak mà nếu ta không ở trong chế độ view pagebreak.
    Vậy quay lại bài toán tổng cuối trang, chắc hẳn các bạn sẽ thấy khá thú vị đây…. Hò zô nào, kéo pháo ta lên nào….

    bạn cần chuyển chế độ xem trang từ Normal sang Pagebreak Preview nhé – Chẳng hiểu sao Excel rất dở trong việc đếm pagebreak mà nếu ta không ở trong chế độ view pagebreak…
    Diem yeu cua doan code:
    ' Neu kich thuoc cac dong cua van ban Excel la khac nhau cua cac trang
    ' Hay che do Wraptext cua cell de o che do True – thi doan ma tren khong lam duoc
    ' Neu van ban co Print Area thi cung co van de/ cai nay co the sua duoc
    ' Cac loi xay ra thi deu co the giai quyet bang cach chuyen ve che do pagebreakpreview
    ' la xong
    ' Loi 1: Neu co dong lo lung nhu vay va dang o che do page view normal thi khong duoc
    ' loi nay minor – khong quan trong
    ' Chi tiet loi: Sub Script Out of range
    ' Neu van ban co trang cuoi cung la trang kin thi bi loi
    ' lngPageRowCount = .HPageBreaks.Item(.HPageBreaks.Count).Location.Row – .HPageBreaks.Item(.HPageBreaks.Count – 1).Location.Row
    ' Chi tiet loi: Sub Script Out

  3. hands says:

    Hi! các cao thủ.

    Mình có bài toán này nhờ các đại ca giải đáp giúp.

    ví dụ Mình có sheet sổ cái TK 111 có 10 trang. Mình muốn hiện dòng "Tổng cộng cuối trang" và tại cột số tiền có tính tổng số tiền từ đầu trang đến cuối trang.
    Khi sang đầu trang 2 có dòng "Cộng mang sang" và tại cột số tiền có số tổng của cuối trang 1. Và tiếp … cho các trang còn lại.

    Mong các đại ca giải giúp (rất gấp)

    Xin đa tạ.

    Thân chào

    Dear Thien,
    ———–
    Bạn tham khảo [URL="https://www.giaiphapexcel.com/forum/showthread.php?t=116&highlight=HPageBreaks"%5Dchủ đề này.
    Sau đây là đoạn code minh hoạ chèn dòng cộng hết trang theo cấu trúc For…Next mà tôi đã áp dụng để tạo sổ kế toán.
    Bạn có thể cải tiến thủ tục tối ưu hơn bằng cách:
    – Sử dụng vòng lặp For Each…Next
    – Copy-insert công thức 2 dòng cuối trang để thay thế sự kiện "Edit" trong vòng lặp nhằm tăng tốc độ chương trình.

    [COLOR=darkgreen]'Các lệnh thực hiện kết xuất sổ bên trên
    'blnChitiet là biến toàn cục kiểu Boolean để kiểm tra người dùng chọn in 
    'loại sổ tổng hợp hay chi tiết (cấu trúc 2 loại sổ này khác nhau)
    '....[/COLOR]
    
    With shREPORT [COLOR=darkgreen]'Worksheet báo cáo[/COLOR]
    Dim lngPageCount As Long
    Dim lngPageSumRow As Long
    Dim i  As Long
    Dim strPageEndRow As String [COLOR=darkgreen]' Địa chỉ dòng có dấu ngắt trang
    [/COLOR]lngPageCount = .HPageBreaks.Count [COLOR=darkgreen]'Tổng số trang trong báo cáo[/COLOR]
    For i = 1 To lngPageCount
        lngPageSumRow = .HPageBreaks(i).Location.Row - 1
        .Rows(lngPageSumRow & ":" & lngPageSumRow + 1).Insert xlShiftDown
        If blnChitiet Then Range("H" & lngPageSumRow & ":H" & _
    lngPageSumRow + 1).Value = Range("H" & lngPageSumRow - 1).Value
        Cells(lngPageSumRow, 4) = "Cộng chuyển sang trang sau"
        Cells(lngPageSumRow + 1, 4) = "Số trang trước chuyển sang"
        Cells(lngPageSumRow, 6) = "=SUBTOTAL(9,F13:F" & lngPageSumRow - 1 & ")"
        Cells(lngPageSumRow, 6).Copy
        Cells(lngPageSumRow, 7).PasteSpecial xlPasteFormulas
        Cells(lngPageSumRow + 1, 6).Formula = Cells(lngPageSumRow, 6).Formula
        Cells(lngPageSumRow + 1, 7).Formula = Cells(lngPageSumRow, 7).Formula
        strPageEndRow = "A" & lngPageSumRow & ":" & IIf(blnChitiet, "H", "G") & lngPageSumRow + 1
        .Range(strPageEndRow).Font.Bold = True
        .Range(strPageEndRow).Borders(xlEdgeTop).LineStyle = xlContinuous
        .Range(strPageEndRow).Borders(xlInsideHorizontal).LineStyle = xlContinuous
        .Range(strPageEndRow).Borders(xlEdgeBottom).LineStyle = xlContinuous
    Next
    End With
    [COLOR=darkgreen]'...
    'Các lệnh xử lý tiếp theo[/COLOR]

    Trong thí dụ này bạn sẽ thấy tác dụng tuyệt vời mà dường như chỉ có SUBTOTAL(9,<reference>) làm được.

    Thủ tục đã được cải tiến

    Dear all,
    ——–
    Dưới đây là thủ tục đã được cải tiến:

    Public Sub cmbEndPageSum_Click()
    Application.ScreenUpdating = False
    Dim myPage As HPageBreak
    Dim lngPageCount As Long
    With SOKT
    For Each myPage In SOKT.HPageBreaks
        TEMP.Range("CONGHETTRANG").Copy
        Rows(myPage.Location.Row - 1).Insert xlShiftDown, True
    Next
    End With
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End Sub

    Các bạn tham khảo trong file đính kèm:

  4. hands says:

    Dear Đào Việt Cường.

    Thật cảm ơn bạn đã giải đáp giúp.
    Bạn vui lòng giữ nguyên cấu trúc file mà mình gửi mail cho bạn.
    Mong bạn giúp mình (gửi qua mail)

    Thân chào bạn

    PS: do mình ứng dụng code đó vào file của mình nó báo lỗi.
    ngay dòng này:
    lngPageCount = .HPageBreaks.Count

    Dear Thien,
    ———–

    Bạn vui lòng giữ nguyên cấu trúc file mà mình gửi mail cho bạn.

    Để xác định đúng số trang cũng như cột số phát sinh để chèn ròng tổng cộng, bạn cần phải sửa lại bảng dữ liệu cho phù hợp, không có dữ liệu dư thừa. Bạn chú ý các cột bị ẩn nên chuyển về cuối bảng để phép cộng được chính xác. Mặt khác, quá trình chèn dòng rất chậm nên bạn cần hạn chế tối đa quá trình tính toán trên Worksheet, không nên để công thức cũng như sự kiện Worksheet_Change().
    Vì lý do đó mình không thể áp dụng file của bạn được.

    Mình ứng dụng code đó vào file của mình nó báo lỗi.
    ngay dòng này:
    lngPageCount = .HPageBreaks.Count

    Lỗi này xảy ra là do bạn đã không bổ xung từ khoá With…End With để làm việc với HPageBreaks. Bạn cũng có thể xử lý bằng cách bổ xung đối tượng worksheet mà bạn đang làm việc trước .HPageBreaks.Count, ví dụ:
    – Worksheet(<Sổ kế toán của bạn>).HPageBreaks.Count, hoặc:
    – Me.HPageBreaks.Count (nếu thủ tục nằm trong worksheet Sổ kế toán)
    Chúc bạn ứng dụng thành công vào file của mình.

    Dear Đào Việt Cường

    Rất cảm ơn bạn đã nhiệt tình giúp đỡ. Mình đã ứng dụng thành công đoạn code rất hay của bạn vảo file của mình rồi. Vẫn giữ nguyên cấu trúc file của mình, chỉ chỉnh lại code 1 chút theo sự hướng dẫn của bạn cho phù hợp với cấu trúc file của mình là thành công.

    Một lần nữa mình xin đa tạ bạn đã giành thời gian giải quyết khó khăn giúp mình.

    Xin cảm ơn nhiều.

    PS: có 1 điều mình vẫn chưa biết tại sao phải qua chế độ Page break preview thì nó mới chạy được. Còn ở chế độ Normal view nó cư trơ ra.

    +-+-+-+ +-+-+-+ +-+-+-+ :., :., :., :., :.,

    Dear Thien,
    ———–
    Mình cũng chỉ hiểu theo logic thôi:
    Ở chế độ Page Break Preview, MSE xác định vùng dữ liệu hiện có trên Worksheet và căn cứ vào định dạng trang in của máy in để xác định số trang rồi hiển thị trên màn hình. Và HPageBreak chính là đối tượng để chúng ta làm việc.
    Các dấu ngắt trang trong Excel (HPageBreak) được xác định từ trên xuống dưới và từ trái qua phải. Chính vì vậy, nếu số liệu của bạn dàn trải theo chiều ngang thì thủ tục sẽ không còn chính xác nữa.
    Bạn cũng hiểu rằng ở chế độ này Excel sẽ làm việc chậm chạp hơn chế độ Normal.

  5. hands says:

    TigerTiger đã phát triển lại CODE của Đào Việt Cường (gần như đổi hoàn toàn)

    Giờ cho phép cộng chuyển trang, cộng dồn, rồi tổng quát hóa các trang cho phép ký lun (định nghĩa qua name ở sheet TEMP) – trang cuối có footer khác hẳn
    Tigertiger đã thử với chiều cao dòng bất kỳ
    Dĩ nhiên là các công thức cộng chuyển đúng với file ví dụ -> file khác thì cần sửa lại tt cột trong code cho hợp lý

    Option Explicit

    Public Sub AddFooterX()
    Application.ScreenUpdating = False
    Dim myPage As HPageBreak, iP As Integer, iRb As Integer, iRe As Integer, nRbt As Integer, iReE As Integer
    Dim nP As Integer

    SOKT.Range("A13").Select
    SOKT.Cells.RemoveSubtotal

    iRb = TEMP.Range("DongBatDau").Value
    iReE = TEMP.Range("DongCuoiCung").Value + 1
    nRbt = TEMP.Range("CONGHETTRANG").Rows.Count

    nP = SOKT.HPageBreaks.Count
    SOKT.Range("A" & iReE).Value = 1
    SOKT.Range("A" & iReE + 1 & ":A" & (iReE + nP * nRbt)).Formula = "=RC+1"

    nP = SOKT.HPageBreaks.Count
    SOKT.Range("A" & iReE & ":A" & (iReE + nP * nRbt)).ClearContents

    iP = 0
    With SOKT

    For iP = 1 To nP + 1
    If iP <= nP Then
    iRe = SOKT.HPageBreaks(iP).Location.Row – nRbt + 1
    TEMP.Range("CONGHETTRANG").Copy
    Else
    iRe = nP * nRbt + TEMP.Range("DongCuoiCung").Value + 1
    TEMP.Range("CongTrangCuoi").Copy
    End If
    Rows(iRe).Insert xlShiftDown, True
    .Range("F" & iRe).Formula = "=SUBTOTAL(9,F" & iRb & ":F" & (iRe – 1) & ")"
    .Range("G" & iRe).Formula = "=SUBTOTAL(9,G" & iRb & ":G" & (iRe – 1) & ")"

    .Range("F" & iRe + 1).Formula = "=SUBTOTAL(9,F" & TEMP.Range("DongBatDau").Value & ":F" & (iRe – 1) & ")"
    .Range("G" & iRe + 1).Formula = "=SUBTOTAL(9,G" & TEMP.Range("DongBatDau").Value & ":G" & (iRe – 1) & ")"
    If iP <= nP Then
    .Range("F" & (iRe + nRbt – 1)).Formula = .Range("F" & (iRe + 1)).Formula
    .Range("G" & (iRe + nRbt – 1)).Formula = .Range("G" & (iRe + 1)).Formula
    Else
    .Range("F" & iRe + 2).Formula = "=F" & TEMP.Range("DongBatDau").Value – 1 & "+F" & (iRe + 1) _
    & "-G" & TEMP.Range("DongBatDau").Value – 1 & "-G" & (iRe + 1)
    If .Range("F" & iRe + 2).Value < 0 Then
    .Range("G" & iRe + 2).Formula = "=-F" & TEMP.Range("DongBatDau").Value – 1 & "-F" & (iRe + 1) _
    & "+G" & TEMP.Range("DongBatDau").Value – 1 & "+G" & (iRe + 1)
    .Range("F" & iRe + 2).ClearContents
    End If

    End If
    iRb = iRe + nRbt
    Next iP
    End With
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    End Sub

    mong nhận được góp ý

    xem file gửi kèm – cách nhập thông số trong sheet TEMP

    Cảm ơn bác vì dòng này.

    SOKT.HPageBreaks(iP).Location.Row

    Góp ý :
    – Việc chèn dòng nên chèn từ dưới chèn lên, như vậy vừa chính xác, code lại ngắn hơn.
    – Việc xác định dòng đầu tiên của 1 trang (SOKT.HPageBreaks(iP).Location.Row) thì nên dựa vào chế độ ActiveWindow.SelectedSheets.PrintPreview sẽ chính xác hơn (Kinh nghiệm kiểm chứng+Nhiều người nói vậy)

    Thân!

  6. hands says:

    Cái cách này của TigerTiger quả thật rất hay.

    Tôi đã cải tiến thêm một ít từ code của TigerTiger.

    – Làm thêm menu.
    – Cho phép lưu nhiều mẫu và cho chọn mẫu bằng 1 cái userform – hãy còn thô sơ.
    – Cho phép chèn vào khi mở file khác (không cần copy vào file mẫu).
    – Cho chọn cột cần cộng dồn (1,2,3 hoặc nhiều cột…)
    – Có tính đến việc chèn vào sẽ làm thay đổi số trang in (tăng thêm so với không chèn các dòng tổgn cộng).

    – …

  7. hands says:

    Em cũng mượn file này để diễn giải: em Nhập báo cáo hàng ngày (12 tháng trên 01 file excel), nhưng cuối mỗi tháng em phải in báo cáo cho tháng đó. Trang cuối cùng phải có tổng cộng và người lập (họ tên), người duyệt (Họ tên). (Em không dùng header/footer được, Vì header/footer lại nằm cuối trang giấy). Hướng dẫn giúp em giải quyết khó khăn này. Cảm ơn Anh/Chị.

    Bạn tham khảo file này xem có thỏa í bạn không nha.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm