Chia sẻ tiện ích "In hàng loạt với dữ liệu có sẵn" trên Excel

Liên hệ QC

dhn46

Hướng tới tương lai
Tham gia
1/3/11
Bài viết
3,252
Được thích
3,868
Qua quá trình làm việc dhn46 nhận thấy nhu cầu in với số lượng lớn Form mẫu với Data có sẵn là rất nhiều, ví dụ như: Hợp đồng, tờ khai bảo hiểm, phiếu xuất nhập, nhãn mác thùng hàng, thẻ nhân viên...
Các biểu mẫu này có đặc điểm chung là: in trên Form sẵn có với dữ liệu lần lượt lấy từ nguồn tương tự Mail Merg, hoặc in các biểu mẫu có thêm hình ảnh. Việc tiếp cận và tạo các biểu mẫu này với các bạn không biết lập trình là 1 điều khó khăn, do đó dhn46 có viết 1 tiện ích nhỏ để hỗ trợ cho những bạn cần mà chưa có giải pháp.
* Tính năng:
- Tự động in các biểu mẫu với số liệu nhảy tuần tự theo bảng dữ liệu gốc
- Tự động chèn ảnh vào Form mẫu
- Tạo các biểu mẫu tùy ý, linh động trong việc chèn dữ liệu vào Form
* Hướng dẫn sử dụng:
Có 2 phiên bản in hàng loạt
- Loại 1: In Form không lặp lại - dùng để in 1 Form duy nhất trên 1 trang, chỉ nhảy dữ liệu và hình ảnh, ví dụ như hợp đồng, BHXH, phiếu xuất nhập...
- Loại 2: In Form lặp lại – dùng để in mà Form tự nhân bản trên trang in với số cột tùy chọn, dùng để in các Form mẫu kích cỡ nhỏ như thẻ nhân viên, nhãn thùng hàng...
Để sử dụng 2 loại các bạn cần thực hiện các bước sau:
*Chung:
- Cả 2 File đều có: Sheet Khai báo và Sheet Data.
- Các bạn khai báo đầy đủ các trường trong sheet Khai báo tương ứng với sheet Data
+ Sheet Name: tên sheet chứa Form mẫu (ở ví dụ là: Form – ô C1)
+ Nội dung: Các trường cần chèn vào Form mẫu
+ Cột Sheet Data: Cột dữ liệu tương ứng với Nội dung tại Sheet Data. (Ví dụ: A, B, ..
+ Cột Vị trí hiển thị: Vị trí đặt dữ liệu tại Sheet Form (Các vị trí này sẽ nhảy tuần tự dữ liệu theo mỗi bản in)
+ Link ảnh: Copy đường dẫn thư mục chứa ảnh vào ô F1, hoặc nhấn nút lệnh để tìm đường dẫn
+ Khung ảnh: Tên các trường ảnh muốn chèn
+ Tên khung ảnh: Đây là tên của Shape các bạn vẽ trên Sheet Form. Các hình ảnh sẽ được Fill trong shape nên cần phải vẽ shape khi muốn chèn trên Form. Nếu không cần hình ảnh nhảy trên Form thì các bạn không khai báo trường này, để trống.
+ Cột tên ảnh: Là cột chứa tên ảnh không bao gồm phần mở rộng
Ở đây dhn46 lấy tên ảnh theo cấu trúc [tên ảnh = tên ảnh trong cột tên ảnh]
Theo ví dụ trong File thì tên ảnh lấy theo Code. bạn có Code VN0001 thì sẽ phải có ảnh VN0001.jpg hoặc VN0001.bmp.
*Riêng:
- Đối với bản in hàng loạt có lặp lại: thì các bạn cần thiết kế Form mẫu, khai báo vùng chứa Form mẫu và số cột Form trong trang in.
*--------------------------------------
Khi hoàn thành bước khai báo có thể tiến hành in.
Các bạn xem Video để tham khảo cách sử dụng

[video=youtube;4V8qhBhw4yo]http://www.youtube.com/watch?v=4V8qhBhw4yo&feature=youtu.be[/video]

(Do dhn46 mới "tập tành" viết Code nên Code còn lủng củng và sẽ có nhiều hạn chế, mong các bạn sử dụng, góp ý để hoàn thiện hơn sản phẩm.)

Trân trọng!
*----------------------------------
Update: 14/08/2014 - gói gọn các cải tiến trong 1 phiên bản
- Cho phép thêm dữ liệu trên Textbox
- In thẻ trên sheet KQ bắt đầu tại dòng 10 để 9 dòng trước có thể điền tiêu đề.
- Chọn in thẻ theo số thứ tự qua Form.
- In, xem khi Filter
*-----------------------------------
Update: 14/08/2014
- Sửa in hàng loạt không lặp lại - Sửa lỗi code giớ hạn 18 field
 

File đính kèm

  • In Form hàng loạt 04.2016.rar
    305.1 KB · Đọc: 3,203
Lần chỉnh sửa cuối:
dhn46 thân,
Sau một hồi mày mò cũng ổn rồi. chỉnh sửa khung textbox, giờ mới hiểu 1 ít. Nhưng giờ muốn các thẻ khít với nhau, chứ không cần khoảng cách mả chưa mò ra.
Cảm ơn các tiền bối nhiều

Bạn muốn chỉnh khít các thẻ thì bạn PHẢI chỉnh trong mã nguồn.
Bạn mở cửa sổ VBA lên tìm tất cả các đoạn code sau trong MdlIn

Mã:
                Cells(lR * (iRf + 1) + 1, lC * jCf + CCard + 1).EntireRow.RowHeight = [COLOR=#ff0000][B]5[/B][/COLOR]



Mã:
            Cells(1, (i - 1) * jCf + i).EntireColumn.ColumnWidth = [COLOR=#ff0000][B]0.5[/B][/COLOR]

Bạn thay đoạn màu đỏ bằng 0.
 
Upvote 0
Bạn muốn chỉnh khít các thẻ thì bạn PHẢI chỉnh trong mã nguồn.
Bạn mở cửa sổ VBA lên tìm tất cả các đoạn code sau trong MdlIn

Mã:
                Cells(lR * (iRf + 1) + 1, lC * jCf + CCard + 1).EntireRow.RowHeight = [COLOR=#ff0000][B]5[/B][/COLOR]



Mã:
            Cells(1, (i - 1) * jCf + i).EntireColumn.ColumnWidth = [COLOR=#ff0000][B]0.5[/B][/COLOR]

Bạn thay đoạn màu đỏ bằng 0.
Cảm ơn thầy dhn46 nhiều,
Em làm được rồi nhưng khung hình bị sê dịch, và các thẻ vẫn không khít hoàn toàn.
 

File đính kèm

  • lkh-.bmp
    307.7 KB · Đọc: 191
Upvote 0
Để cho các hình và đối tượng không bị thay đổi trong điều kiện trên trang kết quả có cả 1 thế giới đối tượng ta nên Group nó lại. Đồng thời, các hình ảnh cũng có kích thước không đều, vậy sau khi load ảnh ta cũng cần resize lại cho thống nhất
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng như chú Sealand đã nói, để các đối tượng không bị lệch bạn cần phải Group chúng lại, và để khít nhau thì khung ảnh của bạn cần khéo léo đặt vừa khít vùng in hoặc là khung ảnh trùm 1 chút vùng in, nhìn ảnh của bạn có thể đoán do cạnh bên trái thẻ tại sheet Form không vừa cạnh cột vùng in.
 
Upvote 0
Đúng như chú Sealand đã nói, để các đối tượng không bị lệch bạn cần phải Group chúng lại, và để khít nhau thì khung ảnh của bạn cần khéo léo đặt vừa khít vùng in hoặc là khung ảnh trùm 1 chút vùng in, nhìn ảnh của bạn có thể đoán do cạnh bên trái thẻ tại sheet Form không vừa cạnh cột vùng in.
Em muốn bỏ luôn cột và hàng giữa các thẻ, khi nào cần thì bỏ vô liệu có được không thầy!
 
Upvote 0
Em muốn bỏ luôn cột và hàng giữa các thẻ, khi nào cần thì bỏ vô liệu có được không thầy!
Chào bạn,

Về nguyên tắc thì có, nhưng để chỉnh sửa cái này sẽ mất nhiều thời gian và thay đổi hầu hết Code. Cái ý nghĩa việc có 1 dòng trống này khi tôi viết cũng khá quan trọng bởi đó là đường cơ sở để cắt các tấm thẻ ra mà không sợ phạm vào các thẻ khác.

Nếu bạn vẫn muốn xóa thì thay vì việc thay đổi Code trong file gốc bạn hãy viết 1 Code để xóa các dòng, cột xen kẽ. Một đoạn Code VBA như vậy không khó hy vọng bạn sẽ có nhiều thời gian tìm hiểu VBA để viết các Code phụ trợ phục vụ công việc của bạn.
 
Upvote 0
Dear dhn46!

Bạn ơi, Khi chọn xem tùy chọn hoặc xem theo số thứ tự (đã chọn nhiều dữ liệu để xem rồi) thì:
1. làm sao để có thể quay về bảng tính ngay mà không phải click "Close Print Preview" nhiều lần (đủ số lượng đã chọn).
2. làm sao để chuyển nhanh đến trang của người thứ "n" cần xem.

Chúc bạn sức khỏe, công tác tốt và tiện ích của bạn ngày một hoàn thiện hơn và được nhiều người sử dụng.
 
Upvote 0
Dear dhn46!

Bạn ơi, Khi chọn xem tùy chọn hoặc xem theo số thứ tự (đã chọn nhiều dữ liệu để xem rồi) thì:
1. làm sao để có thể quay về bảng tính ngay mà không phải click "Close Print Preview" nhiều lần (đủ số lượng đã chọn).
2. làm sao để chuyển nhanh đến trang của người thứ "n" cần xem.

Chúc bạn sức khỏe, công tác tốt và tiện ích của bạn ngày một hoàn thiện hơn và được nhiều người sử dụng.

Chào bạn,

Nếu bạn xác định xem một số thành phần thì bạn có thể chọn xem tùy chọn xác suất trước rồi hãy chọn hết nhé. Hiện tiện ích chưa hỗ trợ cancel hàng loạt như bạn đề cập.
 
Upvote 0
Chào thầy dhn46,
Đầu tiên xin cảm ơn thầy về file chia sẻ rất hữu ích, em đã áp dụng vào công việc của mình rất tốt.
Thứ hai, em muốn hỏi thêm nhờ thầy và các anh chị diễn đàn gỡ giúp em vấn đề này. Từ file form mẫu, em muốn nhân bản in thành nhiều bản giống nhau bằng cách nhập số lượng bản muốn in vào hộp inbox hoặc cell nào đó được hay không ạ?
File gửi kèm là ứng dụng của em để in nhãn cho hàng hóa. Em muốn in lặp lại thành 8 bản như nhau ở sheet kết quả.
Giúp em nha! Em cảm ơn thầy và diễn đàn nhiều ạ.
 

File đính kèm

  • In nhan.xls
    124.5 KB · Đọc: 53
Upvote 0
Chào thầy dhn46,
Đầu tiên xin cảm ơn thầy về file chia sẻ rất hữu ích, em đã áp dụng vào công việc của mình rất tốt.
Thứ hai, em muốn hỏi thêm nhờ thầy và các anh chị diễn đàn gỡ giúp em vấn đề này. Từ file form mẫu, em muốn nhân bản in thành nhiều bản giống nhau bằng cách nhập số lượng bản muốn in vào hộp inbox hoặc cell nào đó được hay không ạ?
File gửi kèm là ứng dụng của em để in nhãn cho hàng hóa. Em muốn in lặp lại thành 8 bản như nhau ở sheet kết quả.
Giúp em nha! Em cảm ơn thầy và diễn đàn nhiều ạ.
Chào bạn,

Có thể làm theo ý bạn song đây là ứng dụng dùng tổng quát nên mình chưa có ý định sửa CODE. Tuy nhiên bạn có thể thực hiện lệnh in 8 lần cho 1 sheet để có 8 kết quả như ý phải không bạn?
 
Upvote 0
Chào bạn,

Có thể làm theo ý bạn song đây là ứng dụng dùng tổng quát nên mình chưa có ý định sửa CODE. Tuy nhiên bạn có thể thực hiện lệnh in 8 lần cho 1 sheet để có 8 kết quả như ý phải không bạn?

Dạ đúng rồi thầy. Thêm nữa là nếu em muốn lấy dữ liệu từ 2 sheet khác nhau đổ vào sheet form thì phải làm sao ạ?
Cảm ơn thầy rất nhiều.
 
Upvote 0
Dạ đúng rồi thầy. Thêm nữa là nếu em muốn lấy dữ liệu từ 2 sheet khác nhau đổ vào sheet form thì phải làm sao ạ?
Cảm ơn thầy rất nhiều.
Có thể làm được nhưng hơi phức tạp bạn ah. Bạn thay đổi sheet Code Name cho sheet mà bạn muốn lấy dữ liệu in thành Sheet2 là được. Hy vọng là bạn có thể tự biến đổi được.
 
Upvote 0
Dạ đúng rồi thầy. Thêm nữa là nếu em muốn lấy dữ liệu từ 2 sheet khác nhau đổ vào sheet form thì phải làm sao ạ?
Cảm ơn thầy rất nhiều.
Nhé, để lấy từ 2 sheet, nếu không làm trong code thì bạn có thể dùng đúng tính năng liên kết/ tham chiếu số liệu từ các sheet của Excel mà đưa dữ liệu từ nhiều nơi vào sheet chứa dữ liệu để code sử dụng.
Bài hỏi của bạn chưa rõ lắm, có thể bạn Ninh hiểu lầm về việc phải sửa code, nhưng cũng có thể bạn chỉ nghĩ đến việc làm thế nào để chương trình lấy nhiều dữ liệu từ các sheet khác nhau thay vì sử dụng cách tôi đề cập ở trên.

Bàn thêm
Code thì có nguyên tắc của nó, tại sao ta không sáng tạo và vận dụng mềm dẻo. Nếu mà phải đáp ứng nhiều yêu cầu quá, Ninh chắc phải ngồi cả ngày mất!
Tôi không có ý phê, nhưng thực ra, ngay cả với chính tôi, cái gì thấy tiện làm được là tôi làm, không lạm dụng quá mức vào code. Trừ khi bắt buộc phải thế.
Các giải pháp được cung cấp ra trên này của các bạn tâm huyết, đa phần là nhằm đáp ứng các nguyên tắc riêng về tổ chức dữ liệu trong đó khả năng mở rộng hoặc sử dụng tùy biến đã ở mức rất cao rồi. Có những yêu cầu đặc thù thì tùy từng trường hợp mới phải thay đổi. Có thế thì người cho mới có thời gian mà làm việc khác và người nhận có thêm cơ hội mà sáng tạo trong công việc chứ.
Xin có vài dòng lỗ mỗ thế.
 
Upvote 0
Thầy ơi, sao em chép về máy mà không thấy công thức nào hết vậy thầy? em bấm thử lệnh in thi nó báo :"Can not run macro..." là sao vậy thầy, xin thầy hướng dẫn giúp em, vì em cần in số lượng lớn mầu giấy chưng nhận bảo hiểm học sinh (in lên mẫu có sẵn đó thầy) em cám ơn thầy nhiều lắm. Mail của em phiyenbt@gmail.com
 
Upvote 0
Thầy ơi, sao em chép về máy mà không thấy công thức nào hết vậy thầy? em bấm thử lệnh in thi nó báo :"Can not run macro..." là sao vậy thầy, xin thầy hướng dẫn giúp em, vì em cần in số lượng lớn mầu giấy chưng nhận bảo hiểm học sinh (in lên mẫu có sẵn đó thầy) em cám ơn thầy nhiều lắm. Mail của em phiyenbt@gmail.com
Bạn hãy enable macro nhé. Cái này tìm trên diễn đàn nhiều lăm. Ví dụ như;
http://www.giaiphapexcel.com/forum/showthread.php?661-Để-macro-có-thể-chạy-được-trong-Excel

Chúc bạn thành công!
 
Upvote 0
hiện em cũng đang muốn làm một chương trình làm thẻ nhân viên với nòng cốt là code của bác, qua nghiên cứu vài ngày, khó quá :|. Mà sao em đã chọn folder ảnh rồi mà nó không hiện lên nhỉ bác ơi? (em mới chập chững học, qua các bài mà làm chứ không nhiều qua lý thuyết, có gì ngu ý bác thông cảm cho nhé)
 
Upvote 0
hiện em cũng đang muốn làm một chương trình làm thẻ nhân viên với nòng cốt là code của bác, qua nghiên cứu vài ngày, khó quá :|. Mà sao em đã chọn folder ảnh rồi mà nó không hiện lên nhỉ bác ơi? (em mới chập chững học, qua các bài mà làm chứ không nhiều qua lý thuyết, có gì ngu ý bác thông cảm cho nhé)
Chào bạn, để làm thẻ bạn dùng Form in có lặp lại và chú ý: tên ảnh = tên ảnh trong cột tên ảnh là được.
 
Upvote 0
Bạn muốn chỉnh khít các thẻ thì bạn PHẢI chỉnh trong mã nguồn.
Bạn mở cửa sổ VBA lên tìm tất cả các đoạn code sau trong MdlIn

Mã:
                Cells(lR * (iRf + 1) + 1, lC * jCf + CCard + 1).EntireRow.RowHeight = [COLOR=#ff0000][B]5[/B][/COLOR]



Mã:
            Cells(1, (i - 1) * jCf + i).EntireColumn.ColumnWidth = [COLOR=#ff0000][B]0.5[/B][/COLOR]

Bạn thay đoạn màu đỏ bằng 0.

Thầy dhn46 thân,
Em muốn điều chỉnh hình thẻ to thêm xíu thì làm thế nào, in ra nhỏ quá.
Cảm ơn thầy
 
Upvote 0
Web KT
Back
Top Bottom