Tạo dòng "Tổng cộng cuối trang" (2 người xem)

Liên hệ QC

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

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,443
Nghề nghiệp
Bác sĩ
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
 
KKBS Post


Trong trường hợp cần kiểm tra từng bút toán như vậy, tôi nghĩ là ta có thể tạo một cột phụ thay cho macro bằng cách sau (không biết có đúng với yêu cầu của bạn không) :

Giả sử cột A là cột chứa các số tiền trong các bút toán, cột B là cột phụ dùng để kiểm tra, ta tạo công thức cho cột B để cộng dồn như sau :

B1 = A1
B2 = A2 + B1
copy công thức ô B2 cho B3, B4....
Như vậy ở cuối mỗi trang ta có số luỹ kế đến cuối trang đó. Dùng kỹ thuật này lần nữa nếu bạn muốn số luỹ kế trang trước được in ở trang sau.
 
Upvote 0
OverAC​

Có một ý tưởng cho việc viết VBA cho chuyên này:
1. Dùng worksheet_BeforePrint để chèn thêm các dòng cộng mang sang trang sau và trang trước mang sang.
2. Vấn đề là đếm số dòng mang trước khi in được ra giấy
 
Upvote 0
Ngân Giang Post

Ngân Giang - www.webketoan.com

OverAC đã viết:
Có một ý tưởng cho việc viết VBA cho chuyên này:
1. Dùng worksheet_BeforePrint để chèn thêm các dòng cộng mang sang trang sau và trang trước mang sang.
2. Vấn đề là đếm số dòng mang trước khi in được ra giấy.
OverAC
Giống như ý tưởng của OverAC, chương trình chỗ mình họ (đội thiết kế BC) cũng cộng cuối mỗi trang in, rồi in số mang sang ở đầu trang sau. Giải pháp này khó đấy nhé. Mình đã phải test nhiều lần, thế mà khi người dùng thay đổi thông số in lại bị lỗi (Cộng dồn chẳng giống ai)
Thế thì trong Excel dùng giải pháp:
KKBS đã viết:
Giả sử cột A là cột chứa các số tiền trong các bút toán, cột B là cột phụ dùng để kiểm tra, ta tạo công thức cho cột B để cộng dồn như sau :

B1 = A1
B2 = A2 + B1
copy công thức ô B2 cho B3, B4....
Như vậy ở cuối mỗi trang ta có số luỹ kế đến cuối trang đó. Dùng kỹ thuật này lần nữa nếu bạn muốn số luỹ kế trang trước được in ở trang sau.

Thân,
KKBS.
Theo mình nhìn bản in như thế không được đẹp nhưng chính xác.
Làm sao để che không in tất cả các số liệu của cột B nhỉ (Chỉ in những ô xuất hiện ở đầu trang với cuối trang ấy mà)
Ai tìm ra giải pháp hay cho mình học với nhé.
 
Upvote 0
Adam_tran Post :

Theo tớ đã dùng kế toán máy thì cần gì phải in dòng cộng cuối trang chi cho mệt. Nhưng tớ cũng có ý tưởng như thế này:

- Tính toán xem 1 trang chừng bao nhiêu dòng.
- Đầu sheet để 1 dòng số mang sang. Cuối sheet để 2 dòng: Subtotal chứa số cuối trang và grandtotal chứa số mang sang cộng số đầu trang. Trên 2 dòng này, cột STT đặt 2 công thức tính Subtotal Max và Min của STT.
- Tạo 1 macro căn cứ vào tổng số dòng để tính số trang. Mỗi trang chỉ cho in tối đa bấy nhiêu dòng, trừ trang đầu. In từng trang 1 bằng lệnh Advanced Filter. Tính số đầu trang, cuối trang dựa vào giá trị Min (dòng đầu của trang) và Max (dòng cuối của trang). Trang cuối cho in các thứ linh tinh chữ ký...
Diễn giải khó, để mai có thời gian làm thử!
 
Upvote 0
Đào Việt Cường Post :

Bác cho em hỏi, trong VBA làm thế nào để biết được dấu ngắt trang của excel nhỉ? Nếu có dấu hiệu này thì ta có thể điều khiển được điểm cuối cùng một trang đấy bác nhỉ, chẳng hạn như là tính tổng cuối trang chẳng hạn!
 
Upvote 0
Paulsteigel Post :

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
PHP:
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
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Đào Việt Cường Post :

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é!
 
Upvote 0
Đào Việt Cường đã viết:
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.
 
Upvote 0
Đào Việt Cường Post :

Đào Việt Cường đã viết:
Tôi xin được mô tả lại yêu cầu cụ thể như sau:
Do yêu cầu công việc, tôi 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. Tôi muốn 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à cần xác định được dòng cuối cùng của trang cuối cùng để đưa dòng chữ đó vào.
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 (Hoà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:
Thủ tục xử lý cuối báo cáo Đào Việt Cường đã viết:
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 phá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!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
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....
 
Upvote 0
Đào Việt Cường Post :

paulsteigel đã viết:
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
Dear Paulsteigel,
---------------
Hay thật!!! Vậy mà em cứ cắm cái cúi để làm mà không bắt các lỗi này.:hacker:
Các bạn lưu ý giúp nhé!
 
Upvote 0
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
 
Upvote 0
Dear Thien,
-----------
Bạn tham khảo chủ đề 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.
Mã:
[COLOR=darkgreen]'Các lệnh thực hiện kết xuất sổ bên trên[/COLOR]
[COLOR=darkgreen]'blnChitiet là biến toàn cục kiểu Boolean để kiểm tra người dùng chọn in [/COLOR]
[COLOR=darkgreen]'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]
[COLOR=darkgreen]'....[/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]'...[/COLOR]
[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.
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Đào Việt Cường

Mình không biết cách đặt đọan code trên vào module để chạy.
Mong bạn cụ thể hơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dear Thien,
-----------
Để trả lời bài viết, bạn ấn vào nút POST REPLY bên trái. Nếu trích dẫn bài viết quá dài thì cố gắng tóm tắt và chỉ nên trích dẫn phần nội dung muốn đề cập. Làm như vậy là để mọi người dễ đọc.
Để chạy được đoạn mã trên có thể cần có file minh hoạ, mình sẽ cố gắng tải lên trong thời gian sớm nhất.
 
Upvote 0
Thủ tục đã được cải tiến

Dear all,
--------
Dưới đây là thủ tục đã được cải tiến:
Mã:
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:
 

File đính kèm

Upvote 0
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
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Thien,
-----------
Thien đã viết:
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.
Thien đã viết:
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.
 
Upvote 0
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.

+-+-+-+ +-+-+-+ +-+-+-+ :., :., :., :., :.,
 
Upvote 0
Thien đã viết:
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.
 
Upvote 0
Chà... đọc mãi, ù hết cả tai, vấn đề chốt lại ở đây là có pác nào làm ra được sản phẩm hoàn thiện chưa, nếu có thì post thử để bà con load về, xem cấu trúc trực tiếp sẽ dễ hiểu hơn.
 
Upvote 0
Chào các thành viên!
Tôi đã đọc qua bài này, đây là việc có thể làm được ở Excel97-2003. Vậy trong Excel2007 thì phải làm như thế nào để có thể tạo được như thế. Mong các thành viên chỉ giúp em!
 
Upvote 0
Các bạn ơi, có phải vị trí ngắt trang chỉ đúng khi Pagesetup.Zoom = 100 thì phải, nếu khác 100 nó toàn tìm về dòng ở của chế độ zoom =100. Bạn nào biết thử đính chính hộ mình với.
 
Upvote 0
Chào bạn
Bạn gởi file và nêu yêu cầu cụ thể hơn xem. Mình đọc nội dung yêu cầu bạn đã nêu so với tiêu đề thì hình như không liên quan nhau thì phải.

TDN
 
Upvote 0
Mình xin gửi kèm file nhờ các bạn xem hộ. Nếu trong pagesetup mình đặt Scale =100% Normal size thì macro chạy đúng, nhưng nếu đặt là 90% thì kẻ phân trang không đúng nữa, không hiểu tại sao?
 

File đính kèm

Upvote 0
Tự động ngắt trang có tiêu đề đầu, cuối trang và cộng tổng

Kính gửi các anh các chị và các bạn GPE
Em có một sheet số liệu dài và muốn sau mỗi trang có dòng tổng cộng của trang đó, có tiêu đề đầu trang và cuối trang. (yêu cầu của công việc cụ thể em đã viết trong file gửi kèm)
Kính mong các anh các chị giúp đỡ.
Xin chân trọng cảm ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xem File kèm theo, nếu được thì xài nhé.
 

File đính kèm

Upvote 0
thanhan đã viết:
Kính gửi các anh các chị và các bạn GPE
Em có một sheet số liệu dài và muốn sau mỗi trang có dòng tổng cộng của trang đó, có tiêu đề đầu trang và cuối trang. (yêu cầu của công việc cụ thể em đã viết trong file gửi kèm)
Kính mong các anh các chị giúp đỡ.
Xin chân trọng cảm ơn!

Chào bạn,
Mình đã làm thử và chỉ đc một vế câu hỏi của bạn đó là khi ngắt trang thì sẽ có dòng tiêu đề như bạn muốn, bạn làm theo nhé. cứ để file mở vào file/file setup/sheet/ở box row bạn kích chuột vào sau đó bạn rê chuột từ A1:A8 như bạn mong muốn sẽ đc như ý, còn để có luôn dòng tổng cộng thì mình chưa kết hợp vào đc. Mong các bác trong GPE biết chỉ dùm thêm. Chúc vui- NHT
 
Upvote 0
Thuyan.acc đã viết:
Kính đề nghị xin được hướng dẫn cách thực hiện này.
Em có xem thấy rất hay. Nhưng không rõ cách làm.
Thanks.
1. Phần Page Header chắc là dễ rồi
2. Phần Page Footer không làm được vì không hỗ trợ cả dòng không tính toán lẫn có tính toán. Do đó phải ăn gian bằng sub-total:
- Trước tiên định dạng chiều cao tất cả các dòng dữ liệu là cao bằng nhau (row height), không được wrap text, nếu cột nào có nội dung dài phải cắt bớt. Hoặc nếu không cắt bớt phải wrap text, thì các dòng còn lại cũng phải có cùng chiều cao.
- Thêm cột STT
- Mở Print Preview xem trang 1 (có Header) dữ liệu đến dòng số TT bao nhiêu, trong thí dụ là 26, trừ 1 dòng cộng ta có 25.
- Chèn 1 cột kế bên cột STT (cột B, đã bị dấu), trong đó có công thức chia nhóm cứ 25 dòng cùng 1 nhóm. Nếu số dòng khác 25 thì thay số đó vào công thức. Tiêu đề cột là N hay là gì tuỳ ý.
- Đánh dấu chọn vùng dữ liệu kể cả dòng tiêu đề (không merge cell)
- Mở Menu - Data - SubTotal chọn theo thứ tự từ trên xuống:
- For eachchange in: N
- Use Function: Sum
- Add Sub total to: chọn các cột cần tính tổng
- OK
- Xong dấu cột B.

Ở ngoài cùng bên trái xuất hiện các dấu cộng hoặ trừ, đừng quan tâm, xem các số 1, 2, 3 trong các ô vuông trên đâu của thanh dọc đó, nhấn số 2. Tất cả các dấu trừ chuyển thành dấu cộng, các dòng subtotal nằm sát nhau. Sửa hàng loạt những " 0 Sub total", "1 Sub Total" thành Cộng. Sửa Grand Total thành Tổng cộng. Sửa thành in đậm, hoặc tô màu nếu muốn.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em có xem qua bài giảng cũng như file mẫu của Thầy đã gởi. Em khá hiểu. Trong quá trình em làm bài tập lại nếu không rõ Kính xin Thầy chỉ cho em thêm.

Chèn 1 cột kế bên cột STT (cột B, đã bị dấu), trong đó có công thức chia nhóm cứ 25 dòng cùng 1 nhóm. Nếu số dòng khác 25 thì thay số đó vào công thức. Tiêu đề cột là N hay là gì tuỳ ý.
Đoạn này em cũng còn hơi lờ mờ

Nhờ Thầy giải thích công thức này tại sao lại phải chia 25.0001 (Con số 25 "Hai mươi lăm" là mình đã định trong 1 trang đó có dữ liệu là 25, còn 0001 em chưa hiểu ý chỗ này lắm.

--------------
P/S : Kính chúc Thầy 1 mùa Giáng Sinh vui vẻ, hạnh phúc, sức khỏe dồi dào. Công việc nhiều thành đạt.
 
Upvote 0
1. Đừng gọi là thầy, nghe ngượng chết, gọi chú hay anh là được. Old but not very old, coi chữ ký thì biết.
2. nếu chia 25 chẵn thì STT = 24 --> 0, nhưng STT 25 --> 1, STT 50 --> 2, ta không có đúng số 25 dòng trong nhóm.
3. Nhưng nếu chia 25,0001 thì STT 25:25,0001 = 0,99999 --> int() của nó vẫn bằng 0, cùng nhóm với STT 24.
Hiểu không? Nhóc?
 
Upvote 0
ptmo412 đã viết:
1. Đừng gọi là thầy, nghe ngượng chết, gọi chú hay anh là được. Old but not very old, coi chữ ký thì biết.
2. nếu chia 25 chẵn thì STT = 24 --> 0, nhưng STT 25 --> 1, STT 50 --> 2, ta không có đúng số 25 dòng trong nhóm.
3. Nhưng nếu chia 25,0001 thì STT 25:25,0001 = 0,99999 --> int() của nó vẫn bằng 0, cùng nhóm với STT 24.

Sao không chia cho 26 lun (=25+1) / hay cũng chính là số dòng đếm được trong 1 trang phải hay hơn k??? Dễ nhớ dễ thuộc
.
 
Upvote 0
ptm0412 đã viết:
1. Đừng gọi là thầy, nghe ngượng chết, gọi chú hay anh là được. Old but not very old, coi chữ ký thì biết.
2. nếu chia 25 chẵn thì STT = 24 --> 0, nhưng STT 25 --> 1, STT 50 --> 2, ta không có đúng số 25 dòng trong nhóm.
3. Nhưng nếu chia 25,0001 thì STT 25:25,0001 = 0,99999 --> int() của nó vẫn bằng 0, cùng nhóm với STT 24.
Hiểu không? Nhóc?

Cháu chưa hiểu lắm chú ơi vì đằng sau số 25 lại có .0001 (dáu chấm và một dãy số 0001 ). Cháu hiểu hàm Int (là số nguyên)
Đừng la cháu nhe. Thật sự chưa hiểu
----
P/S :
Đêm qua mọi người cùng đón Giáng Sinh vui vẻ thế mà chú vẫn còn trả lời cho cháu thật siêng quá. Cám ơn chú nhiều
(Cháu là female - No Male vậy chú đừng gọi cháu bằng nhóc được chứ. Có thể gọi là bé thì dễ thương và đáng yêu hơn chú à.)
Còn chữ ký của chú ký bằng tiếng Anh "Old but not very old" cháu chịu luôn.(Không rõ nghĩa).
Kính,
Cháu Thùy An
 
Upvote 0
tigertiger đã viết:
Sao không chia cho 26 lun (=25+1) / hay cũng chính là số dòng đếm được trong 1 trang phải hay hơn k??? Dễ nhớ dễ thuộc
.
Í, đâu được, nếu chia 26 chẵn:
- STT = 25 --> 0 --> cùng nhóm với STT 24 --> OK
- STT = 51 --> 1 --> cùng nhóm với STT 50 --> sai
- sai 1 dọc xuống dưới.

Nếu chia cho 25,5:
- Từ 1 đến 75 đúng
- STT 76 sai


Nếu gọi X là số chia (25,5 hoặc 26, hoặc 25,0001)
Số nhóm đúng = 1/(X-25)
Thí dụ:
- chia 26: số nhóm đúng là 1, sau đó ssai
- chia 25,5: số nhóm đúng là 2, sau đó sai
- chia 25,1: số nhóm đúng là 10, sau đó sai

Tóm lại là dữ liệu càng nhiều thì số thập phân sau số 25 phải càng nhỏ.

To Thuyan:
25.0001 là 1 số lớn hơn 25 một tí, mục đích là để 25 chia nó phải nhỏ hơn 1. Nhóc là gọi chung trai gái mà, nhưng cháu không thích thì thôi, gọi bé nhé. Old but not very old là tiếng Anh dởm: già mà không già lắm.
 
Upvote 0
ptm0412 đã viết:
Xem File kèm theo, nếu được thì xài nhé.
Trước hết xin trân trọng cảm ơn anh rất nhiều!
Em nhận thấy:
1. Biểu của anh là biểu thiết kế sẵn, không tự động được khi thêm dòng hoặc xóa bớt dòng thì phải?
2. Cột Stt có thể làm theo a2=a1+1 và kéo được không?
3. Trang cuối cùng là số liệu của tổng các trang ở trên (số liệu của em khoảng 9 trang).
4. Về phần chân trang không có cách nào để làm được sao? (để ký mà anh). Trước kia em đang thực hiện nó ở phần chân trang (footer).
Mong anh và các trưởng lão xem xét và chỉ giúp.
 
Upvote 0
1. Biểu của anh là biểu thiết kế sẵn, không tự động được khi thêm dòng hoặc xóa bớt dòng thì phải?
Đúng thế. Khi thêm dòng bớt dòng phải gỡ subtotal, đánh số thứ tự lại, tính lại cột N, làm lại sub total
Tốt nhất là làm hoàn chỉnh hết đi rồi hãy làm các bước đó. Bao nhiêu dòng cũng được, công thức chia nhóm đã dự trù cho 10.000 nhóm, dư bảng tính luôn.
2. Cột Stt có thể làm theo a2=a1+1 và keo được không?
Cũng được, nhưng khi thêm dòng bớt dòng cũng phải làm lại như trên.
Ăn gian khổ lắm em ơi. làm chính quy (nếu Excel có hỗ trợ) là sướng nhất.
3. Trang cuối cùng là số liệu của tổng các trang ở trên (só liệu của em khoảng 9 trang).
Trang cuối là tổng cộng đấy chứ em? Hay em muốn 1 cái summary? vậy thì nhấn nút có số 2, copy các dòng subtotal và Grand total, Paste xuống dưới chót.
4. Về phần chân trang không có cách nào để làm được sao? (để ký mà anh). Trước kia em đang thực hiện nó ở phần chân trang (footer).
Phải ký trên mỗi trang sao em? Nếu vậy thì cứ làm ỡ Page Footer bình thường. Khi xem Print Preview sẽ thấy nó, và số dòng dữ liệu sẽ ít lại, thí dụ chỉ còn 23, em tính lại cột N theo số mới.

Ăn gian khổ vậy đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Quả thật bác Ptm rất tận tình hướng dẫn cho các bạn, tuy nhiên tôi có một vài nhận xét về bài này của tác giả. Bác Ptm đã vô tình phức tạp hoá vấn đề mà vẫn phải làm thủ công. Đã thủ công thì ta chọn cách đơn giản và nhanh nhất, sau khi đã làm xong bảng tính, nếu muốn chèn thêm dòng tổng kết vào cuối bảng, ta Print Preview và quay trở lại bảng tính, sẽ xuất hiện các đường kẻ đứt đoạn phận chia trang, vậy thì chỉ việc chèn dòng tổng kết vào cuối là xong (chẳng phải chia 25.., cột phụ hay subtotal gì cho mệt).
 
Upvote 0
phamnhukhang đã viết:
Quả thật bác Ptm rất tận tình hướng dẫn cho các bạn, tuy nhiên tôi có một vài nhận xét về bài này của tác giả. Bác Ptm đã vô tình phức tạp hoá vấn đề mà vẫn phải làm thủ công. Đã thủ công thì ta chọn cách đơn giản và nhanh nhất, sau khi đã làm xong bảng tính, nếu muốn chèn thêm dòng tổng kết vào cuối bảng, ta Print Preview và quay trở lại bảng tính, sẽ xuất hiện các đường kẻ đứt đoạn phận chia trang, vậy thì chỉ việc chèn dòng tổng kết vào cuối là xong (chẳng phải chia 25.., cột phụ hay subtotal gì cho mệt).

Chú kính,

Dẫu sao cháu thấy phải bắt đầu từ cái dễ đến cái khó chứ. Ở đây cháu và các thành viên rất vui khi được tận tình giải thích cặn kẽ như thế thật vô cùng quý báu.

Mỗi phương pháp, giải thuật đều có cái hay của nó.Qua topic này cháu học được 2 phương pháp để giải quyết vấn đề.

Kính
 
Upvote 0
Thực tình các anh chi đã chỉ bảo rất tận tình, tuy nhiên em cảm thấy những cách này là thủ công.
Em nói vậy là vì sheet em gửi các anh chị là sheet thue trong một file lớn, do vậy cần mức độ tự động hóa cao.
Kinh mong các anh, chị chỉ giúp.
 
Upvote 0
ptm0412 đã viết:
Tóm lại là dữ liệu càng nhiều thì số thập phân sau số 25 phải càng nhỏ.
thế thì làm thế này, chắc ăn lun

Giả sử số thứ tự (STT) ở A7 thì ô B7 tính thế này: =INT(A7/(25+0.1/A7)
thế là ko lo số lớn nữa


P/S sửa:

Sorry nhậm A7 thành B7 hic, (đã sửa chỗ màu đỏ)

buổi trưa post sau nhìn thấy NHẦM mà cứ bấm vào SỬA bài viết thì GPE đứt không sửa được (tức thật)
 
Lần chỉnh sửa cuối:
Upvote 0
phamnhukhang đã viết:
Quả thật bác Ptm rất tận tình hướng dẫn cho các bạn, tuy nhiên tôi có một vài nhận xét về bài này của tác giả. Bác Ptm đã vô tình phức tạp hoá vấn đề mà vẫn phải làm thủ công. Đã thủ công thì ta chọn cách đơn giản và nhanh nhất, sau khi đã làm xong bảng tính, nếu muốn chèn thêm dòng tổng kết vào cuối bảng, ta Print Preview và quay trở lại bảng tính, sẽ xuất hiện các đường kẻ đứt đoạn phận chia trang, vậy thì chỉ việc chèn dòng tổng kết vào cuối là xong (chẳng phải chia 25.., cột phụ hay subtotal gì cho mệt).
Nếu 5, 7 trang làm như vậy không thành vấn đề, nhưng nếu 50 trang thì làm vậy chậm hơn cách của tớ, tớ làm hàng loạt, fill côngthức tớ doubled-click là xong. Sửa sub total tớ có cách ép các dòng nằm kế nhau, cũng làm hàng loạt luôn.
Còn cách của bạn khi thêm bớt dòng cũng phải làm lại mà!

To TigerTiger:
Giả sử số thứ tự (STT) ở A7 thì ô B7 tính thế này: =INT(A7/(25+0.1/B7)
thế là ko lo số lớn nữa
Công thức của bạn bị Circular Reference.
 
Upvote 0
Từ hôm thấy câu hỏi này, tôi nhớ đã đọc bài này ở đâu đó, có điều không nhớ tên bài để tìm...

Hôm nay đã tìm ra, các bạn xem lại thử nha: http://www.giaiphapexcel.com/forum/showthread.php?t=820

Bài viết này có đề cập đến chuyện tạo dòng tổng cộng cuối trang, đồng thời có làm cái "mang sang" cho trang sau luôn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Oh... files viết bằng code của bác Đào Việt Cường, nhưng qua Test thử chỉ làm việc tốt cho lần đầu tiên, nếu chèn thêm dòng và chạy lại code thì dòng tổng kết trang không tự xóa đi mà chèn sang trang sau. Vẫn bất cập quá, một ngày nào đó bác Bill sẽ hiểu nỗi khổ này cho phép link công thức trong H&P.
 
Upvote 0
Với lại cũng phải dựa vào điều kiện là các dòng dữ liệu phải cùng độ cao (row Height).
Ngoài ra, cả 2 dòng cộng đó đều là cộng dồn, trong khi dân trong ngành thường có yêu cầu là:
- cuối trang 2 dòng: dòng 1: Cộng trang này : chỉ cộng trong trang
- Dòng 2: Cộng dồn đến ngày ... :Cộng dồn từ đầu báo cáo
- Đầu trang sau: Mang sang: Cộng dồn từ đầu báo cáo.

Còn không thì chỉ cộng từng trang như yêu cầu của Thanhan, khỏi mang sang. Code này nếu cải tiến thêm tí nữa thì tuyêt.
 
Upvote 0
ptm0412 đã viết:
To TigerTiger:
Trích:
Giả sử số thứ tự (STT) ở A7 thì ô B7 tính thế này: =INT(A7/(25+0.1/B7)
thế là ko lo số lớn nữa
Công thức của bạn bị Circular Reference.
CHÍNH XÁC LÀ (tigertiger đã sửa ở post#18):

thế thì làm thế này, chắc ăn lun

Giả sử số thứ tự (STT) ở A7 thì ô B7 tính thế này: =INT(A7/(25+0.1/A7)
thế là ko lo số lớn nữa

P/S sửa:
Sorry nhầmm A7 thành B7 hic, (đã sửa chỗ màu đỏ)

buổi trưa post sau nhìn thấy NHẦM mà cứ bấm vào SỬA bài viết thì GPE đứt không sửa được (tức thật)
 
Lần chỉnh sửa cuối:
Upvote 0
ptm0412 đã viết:
Với lại cũng phải dựa vào điều kiện là các dòng dữ liệu phải cùng độ cao (row Height).
Ngoài ra, cả 2 dòng cộng đó đều là cộng dồn, trong khi dân trong ngành thường có yêu cầu là:
- cuối trang 2 dòng: dòng 1: Cộng trang này : chỉ cộng trong trang
- Dòng 2: Cộng dồn đến ngày ... :Cộng dồn từ đầu báo cáo
- Đầu trang sau: Mang sang: Cộng dồn từ đầu báo cáo.
phamnhukhang đã viết:
Bác ra tay đi...em thấy cái vụ này ứng dụng rất thực tế, rất cần cho những người hay làm báo cáo.
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ý

PHP:
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 = "=R[-1]C+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
 

File đính kèm

Upvote 0
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!
 
Upvote 0
bạn ơi,mình làm thị báo lỗi runtime 424 là gì vậy? Mà cho mình hỏi,bạn send 2 đoạn code thì mình nên sử dụng đoạn code nào.Bài #2 or bài #5
 
Upvote 0
Upvote 0
Cảm ơn Tigertiger rất nhiều về file này. Tuy nhiên mình có câu hỏi nhờ bạn giải đáp. Nếu format của mình ít cột hay nhiều cột hơn thi mình điều chỉnh như thế nào?

Tks again
Tuyenbw
 
Upvote 0
Mình mới tham gia vào diển đàn Giải phap excel, mình thấy rất hữu ích trong công việc của mình. Minh đang áp dụng "endpagesum" vào bảng tính , nhung mình muốn thêm cột hoặc thêm dòng cho phù hợp với cái bảng tinh của minh, các bạn có thể chỉ dẩn cho nminh, cảm on.
 
Upvote 0
Phần này hay quá, nhưng mình muốn lọc ra từng tháng thì làm sao?
Ví dụ khi chọn in phát sinh tháng 1 - thì chỉ có số liệu tháng 1 thôi ....

Hoặc chèn thêm dòng số dư cuối kỳ và đặt công thức Tồn + Thu - Chi
rồi mới ngắt trang, cộng từng trang, xuất ra từng tháng .
Mong các bạn chỉ giúp .xin cảm ơn nhiều .
 
Lần chỉnh sửa cuối:
Upvote 0
Phần này hay quá, nhưng mình muốn lọc ra từng tháng thì làm sao?
Ví dụ khi chọn in phát sinh tháng 1 - thì chỉ có số liệu tháng 1 thôi ....

Hoặc chèn thêm dòng số dư cuối kỳ và đặt công thức Tồn + Thu - Chi
rồi mới ngắt trang, cộng từng trang, xuất ra từng tháng .
Mong các bạn chỉ giúp .xin cảm ơn nhiều .
Coi như dữ liệu ở Sh Data.
Dùng Advance Fliter chỉ lấy theo tháng cần lấy vào Sh In. (bao gồm chuyển số dư).
Dùng lại cách trên theo sh In tạo để ngắt trang.
In.
Nếu đã VBA insert ngắt trang thì thêm Tồn vô tư.
 
Upvote 0
Xuất số liệu ra báo cáo từng tháng

Mình có tập hợp số liệu sổ kho 3 tháng theo file đính kèm.
Mong các bạn giúp mình dùng cách nào để khi chọn tháng 1 thì chỉ in toàn bộ phát sinh (Số đầu kỳ - số nhập - số xuất - số tồn ) trong tháng 1 ra báo cáo và in .
Khi chọn tháng 2 thì cũng ra kết quả tháng 2 và in .
Tháng 3 cũng như vậy .
Nếu chọn được ngắt trang thì quá tốt .
 
Upvote 0
xin nhờ chỉ giúp

Application.Goto Reference:="DONGCUOI"
Application.Goto Reference:="TONGCONG"
....
xem code thấy, sao tìm mãi vùng DONGCUOI",TONGCONG"... cũng không thấy
xin các anh chỉ giúp cho
 

File đính kèm

Upvote 0
Application.Goto Reference:="DONGCUOI"
Application.Goto Reference:="TONGCONG"
....
xem code thấy, sao tìm mãi vùng DONGCUOI",TONGCONG"... cũng không thấy
xin các anh chỉ giúp cho

Bạn vào Insert \ name define

Bạn sẽ thấy các name trên -> Bạn sẽ hiểu đó là name VÙNG đặt (ở bên Sheet kia)
 
Upvote 0
thêm dòng tổng

file chèn dòng tính tổng cuối trang như EndPageSum_tigertiger thì hay quá
nhưng tính tổng theo từng loại mặt hàng thì làm sao? (vd: lấy cột MaHang làm chuẩn, sau khi sắp xếp thì chèn dòng tổng cuối mỗi loại mặt hàng). em đang cần cái này lắm,
 
Upvote 0
file chèn dòng tính tổng cuối trang như EndPageSum_tigertiger thì hay quá
nhưng tính tổng theo từng loại mặt hàng thì làm sao? (vd: lấy cột MaHang làm chuẩn, sau khi sắp xếp thì chèn dòng tổng cuối mỗi loại mặt hàng). em đang cần cái này lắm,

Dùng chức năng Subtotal có sẵn trong EXCEL, bạn ah

+ Đầu tiên sắp xếp theo MaHang (như bạn viết)

+ menu: Data \ Subtotal .... -> chọn :
--->At exchange in: MaHang
--->use function: SUM
--->Add subtoatl to: <tên Cột muốn tính tổng>

Thế là OK
 
Upvote 0
nếu như mình tính thêm cột nữa thì làm sao. có cách nào nhập số cột cần tính bên sheet temp được không? nếu như làm được thì có thể ứng dụng file này trong tất cả trường hơp khác
 
Upvote 0
Tigertiger file của bạn làm rất rất hay, nhưng khi thay đổi kích thước hàng thì trang nhảy tùm bậy liền (khoản 5 hàng). Nhưng dù sao nó cũng là cái mình đang cần. Cảm ơn bạn nhiều nhiều!!!!!!!!
 
Upvote 0
Xin gửi các bạn File Add-Ins.
Cộng tổng cuối từng trang và các lựa chọn, không phụ thuộc vào chiều cao dòng, tự động thêm HPageBreak vào những trang bị nhỡ do cỡ dòng thay đổi.
- Cộng theo các cột cần cộng
- Chuyển kết quả cuối trang trước sang đầu trang sau hoặc cộng dồn các trang trước đặt vào đầu trang sau.
- Định dạng dòng chèn thêm vào.
- Xoá đi các dòng đã chèn vào ở các bước trước
- Lưu các thiết lập cho lần làm việc sau.
Các bạn test thử, hiện nay tôi không có File nào có nhiều dữ liệu để thử nên chưa dám chắc chắn nó làm việc hoàn hảo, có gì xin cho ý kiến.
 

File đính kèm

Upvote 0
Xin gửi các bạn File Add-Ins.
Cộng tổng cuối từng trang và các lựa chọn, không phụ thuộc vào chiều cao dòng, tự động thêm HPageBreak vào những trang bị nhỡ do cỡ dòng thay đổi.
- Cộng theo các cột cần cộng
- Chuyển kết quả cuối trang trước sang đầu trang sau hoặc cộng dồn các trang trước đặt vào đầu trang sau.
- Định dạng dòng chèn thêm vào.
- Xoá đi các dòng đã chèn vào ở các bước trước
- Lưu các thiết lập cho lần làm việc sau.
Các bạn test thử, hiện nay tôi không có File nào có nhiều dữ liệu để thử nên chưa dám chắc chắn nó làm việc hoàn hảo, có gì xin cho ý kiến.
Không thể test thử được, bởi vì tôi không đọc được tiếng Việt trong cái menu của Addin này. Bạn có thể làm mấy cái chữ đó bằng font Unicode không?

Thêm một cái thắc mắc. Addin này là của ai? Tại sao nội dung của mục thông tin giống y chang cái About của Ultimate Addin:
000-890.jpg
Sao kỳ vậy?
 
Upvote 0
Không thể test thử được, bởi vì tôi không đọc được tiếng Việt trong cái menu của Addin này. Bạn có thể làm mấy cái chữ đó bằng font Unicode không?
Cái này là do máy tính của bạn chưa được cài đặt phần Tiếng việt cho Windows,Bạn tham khảo bài viết của tôi ở Link này nhé. http://www.giaiphapexcel.com/forum/showthread.php?p=138014#post138014
Tôi tuyệt giao với tất cả các loại Font chữ lằng nhằng, tất cả đều theo chuẩn Unicode, Tất cả các Menu và Caption đều được viết bằng tổ hợp.
Thêm một cái thắc mắc. Addin này là của ai? Tại sao nội dung của mục thông tin giống y chang cái About của Ultimate Addin:
000-890.jpg

Sao kỳ vậy?
Đúng là chuyện lạ, có thế cái Add-In của Ultimate Addin cũng có Sub About trùng tên với Add-Ins của tôi, bạn thử remove cái Add-Ins đó đi rồi chạy thử lại xem thế nào. Tôi đảm bảo đây là Add-Ins Made in 100% của tôi, hì.
 
Upvote 0
OK. Tại vì trên máy tôi đã có Ultimate Addin, cài thêm cái của bạn vào, thì nó ra như cái tôi đã nói lúc nãy. Sau khi tôi gỡ hết 2 em ra, cho cái Bổ trợ vào trước, cái Ultimate vào sau, thì hết rồi. Của ai thì có About riêng của người đó.

Còn cái vụ language kia, có cách nào mà dùng Windows mặc định cũng xem được không? Tôi hỏi vậy, bởi vì tôi đã thấy có nhiều Addin (A-tool của anh Tuân chẳng hạn) đâu có cần chỉnh sửa gì đâu, vẫn đọc tiếng Việt (Unicode) ngon lành ?
 
Upvote 0
Xin gửi các bạn File Add-Ins.
Cộng tổng cuối từng trang và các lựa chọn, không phụ thuộc vào chiều cao dòng, tự động thêm HPageBreak vào những trang bị nhỡ do cỡ dòng thay đổi.
- Cộng theo các cột cần cộng
- Chuyển kết quả cuối trang trước sang đầu trang sau hoặc cộng dồn các trang trước đặt vào đầu trang sau.
- Định dạng dòng chèn thêm vào.
- Xoá đi các dòng đã chèn vào ở các bước trước
- Lưu các thiết lập cho lần làm việc sau.
Các bạn test thử, hiện nay tôi không có File nào có nhiều dữ liệu để thử nên chưa dám chắc chắn nó làm việc hoàn hảo, có gì xin cho ý kiến.

Muốn người khác cho ý kiến thì bạn nên bỏ cái VBA password đi. Có thể sẽ có code ngắn hơn, nhanh hơn và hiệu quả hơn đấy bạn à! Tất cả những tiện ích của bạn đều có sẵn code VBA và chia sẻ free trên diễn đàn GPE rồi. không tin thì bạn thử search mà xem.
 
Upvote 0
Còn cái vụ language kia, có cách nào mà dùng Windows mặc định cũng xem được không? Tôi hỏi vậy, bởi vì tôi đã thấy có nhiều Addin (A-tool của anh Tuân chẳng hạn) đâu có cần chỉnh sửa gì đâu, vẫn đọc tiếng Việt (Unicode) ngon lành ?
Có nhiều biện pháp can thiệp khi xây dựng menu windows, theo tôi được biết thì hệ thống menu sử dụng Font hệ thống, kể cả khi thiết kế trên VB6, rất nhiều người bỏ công sức ra để việt hóa, dùng nhiều công cụ phức tạp để chuyển đổi nhưng tôi chưa thấy cái nào hoàn hảo, được cái nọ lại mất cái kia. Microsoft đã cung cấp cho chũng ta những tiện ích mang tính bản địa tại sao ta không tận dụng, vừa chuẩn vừa thống nhất.
Bạn nói là cái A tool hiển thị tốt TV mà máy của bạn không cài bổ sung ngôn ngữ thì kể cũng lạ, theo tôi đoán thì người ta đã sử dụng đến các phép chuyển đổi, khi viết thì lằng nhằng toàn là những con số phức tạp sau đó mới chuyển thành ký tự, cái này tôi cũng đã thấy nhiều người làm nhưng tôi không khoái lắm vì không nhiều time.
Ngoài ra, sao bạn dám chắc là bằng Unicode, biết đâu trên máy của người thiết kế cùng cài trùng 1 font hệ thống giống trên máy của bạn, tôi để ý thì hầu hết các máy ở Miền Bắc đều cài bộ font của Vietkey, khi thiết kế người ta dùng bảng mã TCVN cũng vẫn hiển thị được.
Việc thiết lập windows bản địa như tôi đã nói ở link trên có nhiều lợi ích mà tôi thấy người Việt Nam chúng ta nên sử dụng:
- Khi truy cập web: Tự động đưa đến những link có hỗ trợ tiếng Việt (ví dụ như bạn gõ www.google.com thì lập tức nó nhảy thẳng đến [URL="http://www.google.com.vn"]www.google.com.vn[/URL] và toàn bộ giao diện là tiếng việt, Yahoo cũng thế....
- Nhiều ứng dụng bị nhầm lẫn giữa dấu thập phân và dấu phân nhóm hàng ngàn
- Một số cái khác được windows tự động dịch sang tiếng việt
Tuy nhiên khi cài đặt windows các nhà phân phối thường bỏ qua bước này mà chỉ Next và Next cho nhanh nên nhiều người bị thiệt thòi (số người biết tiếng anh ở VN còn hạn chế mà)
 
Upvote 0
Muốn người khác cho ý kiến thì bạn nên bỏ cái VBA password đi. Có thể sẽ có code ngắn hơn, nhanh hơn và hiệu quả hơn đấy bạn à! Tất cả những tiện ích của bạn đều có sẵn code VBA và chia sẻ free trên diễn đàn GPE rồi. không tin thì bạn thử search mà xem.
Ở đây tôi muốn xin ý kiến về tính năng là chính, còn việc sửa code thì tôi cũng như các bạn, chúng ta đều có thể tìm thấy những đoạn code chính trên web, rồi về thêm mắm thêm muối vào cho thêm phần sinh động, việc đặt pass cho file chủ yếu để tránh file bị sửa chữa qua nhiều người sử dụng rồi cứ réo cái người làm ban đầu lên mà la, còn việc học hỏi, trao đổi kinh nghiệm thì tôi và các bạn se luôn sẵn sàng chia xẻ phải không nào.
Tôi làm những cái này chỉ vì đầu năm rảnh chứ tôi cũng có sử dụng Excel mấy đâu, trước kia khi làm tư vấn còn hay dùng, bây h không làm nữa suốt ngày chỉ có word với mấy cái văn bản lằng nhằng thôi nên ngồi làm 1 số cái mà tôi thấy mọi người chưa thỏa mã.
Ví dụ: -Cái chuyển số thành chữ, hầu hết các code đều viết dưới dạng cố định, không linh hoạt mỗi khi chuyển đổi bảng mã, cái của tôi có thể tùy ý, dùng bảng mã nào cũng được, người dùng chỉ việc nhập 1 lần các từ và tiền tố, hậu tố là xong.
- Cái chèn tổng ộngc cuối trang tôi bổ sung thêm một số tính năng như đã nói ở trên vì còn thấy có người thắc mắc.
Có thể bạn thấy cái này không cần thiết với bạn hoặc không có ý kiến gì, nhưng tôi dám chắc rằng còn nhiều người cần do hoặc không có thời gian, hoặc không có kiến thức về lập trình vv và vv...
Nếu cần trao đổi, bàn bạc về giải pháp, code... chúng ta cùng trao đổi, mong sao người VN ngày càng có nhiều công cụ, tiện ích hữu hiệu hơn.
Thân.
 
Upvote 0
Sao mình down file ví dụ tham khoản của Cường mà sao không thấy gì a. Cũng chẳng báo lỗi luôn. Cường chỉ dẫn từng bước cho mình nhé. Hay do máy của mình bị lỗi.
 
Upvote 0
Oh, đã có bài cải tiến hơn rồi
thêm cả dòng cộng chuyển trang, đưa cả chữ ký vào từng trang
bạn xem ở post sau nhé:

http://www.giaiphapexcel.com/forum/showpost.php?p=49059&postcount=24
.
Bài này rất hay bạn tigertiger ah! cám ơn !!!
Nhưng nhờ bạn hướng dẫn thêm:
- Làm thế nào để thêm dòng thêm cột khác với định dạng của bạn mà vẫn chạy đúng tổng như vậy.
- Bạn làm thêm sheep hướng dẫn rồi post lên cho Anh em nhé.

Một lần nữa thay mặt anh Em xin cám ơn tigertiger
 
Upvote 0
Hàm đổi số ra chữ : VBA-Macro
Public Function bangChu(varNumber) As String
'Ham dung de doi so thanh chu
Dim Doc As String
Dim Number As String
Dim chu(20) As String
Dim I As Byte
Dim J As Byte
Dim Member As String
Dim LenNumber As Byte
Dim OldMember As String
On Error GoTo SAI
Number = Format(varNumber, "0")
Number = Trim(Number)
If Len(Number) = 0 Or IsNull(Number) Then
bangChu = "Khoâng coù soá tieàn"
GoTo Kthuc
End If
If Len(Number) > 12 Then
bangChu = "Soá tieàn quaù lôùn !"
GoTo Kthuc
End If
Do While Len(Number) Mod 3 <> 0
Number = "X" + Number
Loop
OldMember = ""
LenNumber = Len(Number)
For I = 0 To LenNumber - 1
Member = Mid(Number, I + 1, 1)
Select Case Member
Case "X"
chu(I) = ""
Case "9"
chu(I) = "chín"
Case "8"
chu(I) = "taùm"
Case "7"
chu(I) = "baûy"
Case "6"
chu(I) = "saùu"
Case "5"
If (I + 1) Mod 3 = 0 Then
Select Case OldMember
Case "0", "X"
chu(I) = "naêm"
Case Else
If OldMember <> "" Then chu(I) = "laêm"
End Select
Else
If (I + 1) Mod 3 = 2 Then
chu(I) = "naêm möôi"
Else
chu(I) = "naêm traêm"
End If
End If
Case "4"
chu(I) = "boán"
Case "3"
chu(I) = "ba"
Case "2"
chu(I) = "hai"
Case "1"
If (I + 1) Mod 3 = 0 Then
Select Case OldMember
Case "0", "1", "X"
chu(I) = "moät"
Case Else
If OldMember <> "" Then chu(I) = "moát"
End Select
Else
If (I + 1) Mod 3 = 2 Then
chu(I) = "möôøi"
Else
chu(I) = "moät traêm"
End If
End If
Case "0"
If (I + 1) Mod 3 = 0 Then
chu(I) = ""
Else
If (I + 1) Mod 3 = 2 Then
chu(I) = IIf(Mid(Number, I + 2, 1) = "0", "", "leû")
Else
chu(I) = IIf(Mid(Number, I + 2, 2) = "00", "", "khoâng traêm")
End If
End If
End Select
Select Case Member
Case "2", "3", "4", "6", "7", "8", "9"
If (I + 1) Mod 3 = 2 Then
chu(I) = chu(I) + " " + "möôi"
Else
If (I + 1) Mod 3 = 1 Then
chu(I) = chu(I) + " " + "traêm"
End If
End If
End Select

OldMember = Member
Next
Doc = ""
For I = 0 To LenNumber - 1 Step 3
For J = I To I + 2
Doc = Doc + IIf(chu(J) <> "", " " + chu(J), "")
Next
Select Case (LenNumber - I - 1)
Case 11, 10, 9:
Doc = Doc + IIf(Mid(Number, J - 2, 3) = "000", " ", " " + "tyû ")
Case 8, 7, 6:
Doc = Doc + IIf(Mid(Number, J - 2, 3) = "000", " ", " " + "trieäu ")
Case 5, 4, 3:
Doc = Doc + IIf(Mid(Number, J - 2, 3) = "000", " ", " " + "ngaøn ")
End Select
Next I
Doc = Trim(Doc + " ñoàng.")
Doc = UCase(Left(Doc, 1)) + Right(Doc, Len(Doc) - 1)
bangChu = Trim(Doc)
If Len(bangChu) > 2 Then
bangChu = Trim(bangChu)
End If
GoTo Kthuc
SAI:
MsgBox "Loãi : Khoâng coù soá lieäu ñeå ñoïc !", vbOKOnly, "Thoâng baùo loãi"
Kthuc:
End Function
 
Upvote 0
VBA-Macro:Hàm Tuổi
Public Function tuoi(mayTuoi) As String
Dim nam As String
Dim quaDat As String
If mayTuoi = "" Then
tuoi = "Baïn chö Nhaäp Naêm Sinh "
End If
nam = 2009 - mayTuoi
tuoi = nam
End Function
 
Upvote 0
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ý

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

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


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).
- ...
 

File đính kèm

Upvote 0
Cộng dồn số liệu trang trước chuyển sang trang sau

Các bạn pro ơi, giúp tớ với:
Tớ đang làm sổ sách kế toán thủ công trên exel, muốn cộng dồn số trang trước chuyển sang trang sau (sổ nhật ký chung) thì làm thế nào? ( các dòng trong sheet không đều nhau).
M
ình đọc bài thảo luận trên http://www.giaiphapexcel.com/forum/showthread.php?820-Tạo-dòng-Tổng-cộng-cuối-trang nhưng không hiểu lắm. Có ai có cách nào đơn giản, dễ hiểu, dễ làm bày cho mình với. Thanks các cao thủ
 
Upvote 0
Tôi chẳng biết bạn nói cụ thể bài nào hết, sao giúp bạn được? Bạn nên đưa lên file cụ thể của bạn, yêu cầu những gì, kết quả mong muốn đạt được v.v... thì như vậy mới dễ làm cho bạn chứ!

(xưng hô tớ với pro nghe sao sao đó)
 
Upvote 0
Cộng dồn số liệu

Ah, là do mình đặt câu hỏi với chủ đề này thì có 1 bạn bảo mình xem lại chủ đề này đã được thảo luận lâu rùi. Cái mình muốn nhờ là cách cộng dồn số liệu ở cuối dòng của trang trước chuyển sang đầu dòng của trang sau. Bạn có hiểu mình nói không nhỉ? Cảm ơn bạn đã quan tâm
Tôi chẳng biết bạn nói cụ thể bài nào hết, sao giúp bạn được? Bạn nên đưa lên file cụ thể của bạn, yêu cầu những gì, kết quả mong muốn đạt được v.v... thì như vậy mới dễ làm cho bạn chứ!
 
Upvote 0
Ah, là do mình đặt câu hỏi với chủ đề này thì có 1 bạn bảo mình xem lại chủ đề này đã được thảo luận lâu rùi. Cái mình muốn nhờ là cách cộng dồn số liệu ở cuối dòng của trang trước chuyển sang đầu dòng của trang sau. Bạn có hiểu mình nói không nhỉ? Cảm ơn bạn đã quan tâm


Giả sử ở Sheet1 ô B15 là ô trang cuối có số liệu đã cộng dồn của bạn, thì ở sheet2 với ô B1 là ô đem sang thì công thức chỉ là:

Ô B1 (của sheet2) =Sheet1!B15
 
Upvote 0
Cộng dồn số liệu

Nhưng ý của tớ là 1 sheet có nhiều trang cơ, cứ thế dồn số liệu tổng từ trang này sang trang khác chứ ko phải là chuyển sang sheet mới đâu bạn
Giả sử ở Sheet1 ô B15 là ô trang cuối có số liệu đã cộng dồn của bạn, thì ở sheet2 với ô B1 là ô đem sang thì công thức chỉ là:

Ô B1 (của sheet2) =Sheet1!B15
 
Upvote 0
Chào mọi người mình cũng rất quan tâm đến bài viết này nhưng thật tiếc vẫn chưa có đáp án.
Mình có 1 sheet Nhật ký chung cần phải có số trang và số dòng của trang. Nhìn vào sheet in thì rõ ràng rồi nhưng vấn đề là mình không muốn đánh tay vào là trang này là trang số 1 2 hoặc 3 vì mình có tới 200 trang trên 1 sheet cơ, nên mình cũng muốn các bạn vào giúp mình ở đây nhé: http://www.giaiphapexcel.com/forum/showthread.php?92023-Giúp-mình-vba-cho-kết-quả-là-số-Page-!
******
 
Lần chỉnh sửa cuối:
Upvote 0
sao mình tải về mà không thấy có mẫu mà chỉ có thấy sổ của bác thôi bác muontennguoikhac? làm thế nào để nó ứng dụng được vào file của em?
 
Upvote 0
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).
- ...
sao e tải rồi mà không biết phải làm thế nào để ứng dụng được vào file của em vậy bác, cái file của bác chỉ mỗi mẫu sổ vậy còn mẫu bảng thì sao?
 
Upvote 0
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ý

PHP:
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 = "=R[-1]C+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

em thấy code này rất hay hợp với bài này của em mà em chưa giải quyết được mong bác giúp đỡ. chi tiết em ghi rõ file đính kèm
 

File đính kèm

Upvote 0
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ị.
 

File đính kèm

Upvote 0
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.
 

File đính kèm

Upvote 0
File báo cáo của em không có dòng tổng cộng cuối trang, Vì em phải nhập hàng ngày trên file này đến 12 tháng. Khi em báo cáo dùng filters lọc tháng để in thì dòng cuối cùng phải có dòng tổng cộng (để sếp em ký nháy vào tổng) và người lập, người duyệt. Hiện tại em phải copy sang sheet khác hàng tháng để in, em thấy thủ công quá, nên nhờ Anh/Chị có cách nào nhanh hơn giúp em để tiết kiệm thời gian. Do em diễn đạt chưa hết ý, cũng nhờ Anh/Chị xem lại file em mượn tạm để diễn giải. Em chân thành cảm ơn.
 

File đính kèm

Upvote 0
Cho em hỏi sao em tải về áp dụng trên file của em thì lại không chèn thêm dòng được mà nó cộng ngay dòng cuối cùng và đầu tiên của trang sau vậy ạ? Có cách nào chỉ giúp em không ạ
 
Upvote 0
Xin gửi các bạn File Add-Ins.
Cộng tổng cuối từng trang và các lựa chọn, không phụ thuộc vào chiều cao dòng, tự động thêm HPageBreak vào những trang bị nhỡ do cỡ dòng thay đổi.
- Cộng theo các cột cần cộng
- Chuyển kết quả cuối trang trước sang đầu trang sau hoặc cộng dồn các trang trước đặt vào đầu trang sau.
- Định dạng dòng chèn thêm vào.
- Xoá đi các dòng đã chèn vào ở các bước trước
- Lưu các thiết lập cho lần làm việc sau.
Các bạn test thử, hiện nay tôi không có File nào có nhiều dữ liệu để thử nên chưa dám chắc chắn nó làm việc hoàn hảo, có gì xin cho ý kiến.
Sao em tải về máy và dùng chức năng chèn tổng số cuối trang thì lại không chèn được dòng mới mà nó cộng ngay trên dòng cuối cùng và đầu cùng của trang sau vậy ạ. Có cách gì chỉ giúp em không ạ
 
Upvote 0
Cảm ơn tác giả đã chia sẻ !
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom