[Chia sẻ] Dùng VBA trộn dữ liệu Excel sang file Word mẫu (tương tự chức năng Mail Merge)

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,764
Được thích
5,724
Donate (Momo)
Donate
Giới tính
Nam
Những ai có nhu cầu và đã từng sử dụng chức năng Mail Merge của MS Word dùng dữ liệu trên bảng tính Excel đều biết nó hoạt động như thế nào. Không ít trong số đó từng gặp những rắc rối về định dạng số, ngày tháng khi trộn, hoặc khi chuyển file hoạt động tốt từ máy này sang máy khác lại sinh ra khó bảo.

Với việc dùng VBA để trộn thì:
ƯU ĐIỂM:
- Dễ làm ngay cả với người mới. Thú thật khi mới dùng Mail Merge trong mấy lần đầu tiên tôi rất lúng túng, không biết phải làm thế nào để nạp dữ liệu, chèn trường
- Không có các lỗi: định dạng number không như ý muốn, bên Excel 1 đường nhưng sang Word lại 1 nẻo dù đã chỉnh sửa định dạng của Merge Fields , đảo ngày sang tháng.
- Không phát sinh lỗi khi chuyển sang máy tính khác (trừ việc cần thêm thư viện Microsoft Word tại cửa sổ VBA)
NHƯỢC ĐIỂM:
- Chậm. Tốc độ anh này nếu so với Mail Merge cũng như so đi xe đạp với xe máy --=0

Ứng dụng sở trường của nó không phải ở việc trộn và in hàng loạt như giấy mời, mà là ở việc trộn mỗi lần cho nhiều file mẫu khác nhau nhưng trong các file ấy dùng lặp đi lặp lại 1 số thông tin thay đổi. Ví dụ khi bạn có một bộ văn bản cho 1 công việc gồm: Hợp đồng, phụ lục, thông báo, giấy mời, quy chế, nghiệm thu, thanh lý... mỗi lần dùng cho 1 đối tác, thì bạn rất dễ nhập sai thông tin đối tác, trích yếu công việc, ngày giờ tiến hành, địa điểm... hoặc khi sửa lại từ đối tác này dùng cho đối tác khác rất dễ bị râu ông nọ cắm cằm bà kia.

CÁCH DÙNG:
- Chuẩn bị file Word mẫu (ở trạng thái đóng). Tôi đã chuẩn bị sẵn 1 file mẫu ví dụ kèm theo.
- Chuẩn bị bảng dữ liệu như file Excel đính kèm. Nhập đường dẫn thư mục file Word mẫu tại ô H2 (đường dẫn này chỉ dùng khi bạn muốn trộn toàn bộ file Word trong thư mục nhưng lại không muốn hiện hộp thoại để lựa thư mục - Nếu ô H2 trống thì hộp thoại lựa thư mục sẽ xuất hiện khi chạy code)
- Bấm nút Gửi Field sang file Word mẫu. Từ các trường nhận được ở cuối file Word mẫu (tên trường bắt đầu bằng dấu $), bạn chép chúng đến các vị trí mong muốn và định dạng theo ý thích. Chép xong xóa các trường cuối file đi, lưu, đóng lại.
- Bấm Trộn để tiến hành. Các file đã trộn được đặt tên theo tên đối tác, lưu cùng đường dẫn với file Word mẫu.

CẬP NHẬT 29/07/2021: Sửa code để tăng tốc độ khi trộn hàng loạt toàn bộ dòng
CẬP NHẬT 07/12/2021: Giữ số 0 đầu số chứng minh nhân dân hoặc số điện thoại
CẬP NHẬT 17/05/2022: Trộn thông tin 1 người vào nhiều mẫu .docx khác nhau bằng hộp thoại chọn file. Văn bản đã trộn được lưu ở thư mục con có tên của người trộn. Nếu thư mục chưa tồn tại thì tự động được tạo mới. Tải file đính kèm tại bài #97
CẬP NHẬT 12/06/2022:
Làm gọn code và dùng userform để chọn tham số đáp ứng tất cả yêu cầu của các thành viên từ trước đến nay trong chủ đề.
CẬP NHẬT 14/06/2022: Ô chứa text >255 ký tự vẫn trộn đầy đủ thông tin và không thi hành với các dòng ẩn.
CẬP NHẬT 18/06/2022: Tăng tốc với trường hợp trộn nhiều dòng nhiều văn bản và sửa lỗi lấy sai vùng làm việc với trường hợp trộn tất cả file Word trong folder.
CẬP NHẬT 03/03/2023: Thêm chức năng chuyển sang trộn theo kiểu Mail Merge truyền thống với file Word mẫu có sẵn các trường theo cách bên trên.
CẬP NHẬT 29/06/2023: Tách riêng mỗi thủ tục cho 1 tùy chọn để dễ bảo trì code. Sửa lỗi không mở được đường dẫn mặc định.
CẬP NHẬT 07/08/2023: Thêm thao tác chèn bảng Excel vào Word. Thêm các cột $Table1$, $Table2$ ... vào bảng dữ liệu trộn và bố trí bảng cần chèn kèm trên trên đầu bảng như file đính kèm.
CẬP NHẬT 08/08/2023: Tạo bảng Word rồi chép dữ liệu của bảng Excel vào bảng Word. Bảng Word giữ được màu font chữ của trường giữ chỗ.
CẬP NHẬT 13/08/2023: Hoàn thiện code, thêm chức năng ghép file, và gộp các công việc chung 1 file
CẬP NHẬT 15/08/2023: Định dạng phân cách hàng nghìn cho bảng Word dựa vào định dạng các cột của bảng Excel.
CẬP NHẬT 30/09/2023: Mở luôn file Word kết quả khi trộn 1 dòng 1 file. Có thể chép 1 bảng vào nhiều vị trí khác nhau của file kết quả (như yêu cầu tại bài #432).
CẬP NHẬT 15/10/2024:
- Sửa vài lỗi trong bản 30/09/2024
- Thêm phiên bản trộn các trường bố trí theo hàng dọc (cột), theo yêu cầu tại bài #494
CẬP NHẬT 17/10/2024:
- Sửa vài điểm trong bản trộn theo dòng 15/10/2024
- Sửa câu từ và 1 vài lỗi của phiên bản trộn các trường bố trí theo hàng dọc (cột)
CẬP NHẬT 19/10/2024:
- Làm gọn và nhất quán code trong cả 2 phiên bản trộn dọc và ngang.
- Sửa lỗi phiên bản dọc
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn không nên bắt tôi phải đoán/làm mù như thế!. Lẽ ra bạn phải đưa cái file Excel nguồn + file Word mẫu cần trộn của bạn thì tôi mới biết tại sao xảy ra lỗi chứ.
Em xin phép gửi anh File Excel và Word, nhờ anh xem hộ em với ạ. Em xin cảm ơn ạ.
 

File đính kèm

Upvote 0
Nhiều lúc miêu tả không trơn tru anh à Em thấy Chỉ cần Chèn thêm dữ liệu trước hàng tiêu đề thì không ra kết quả
gửi anh
 

File đính kèm

Upvote 0
Nhiều lúc miêu tả không trơn tru anh à Em thấy Chỉ cần Chèn thêm dữ liệu trước hàng tiêu đề thì không ra kết quả
gửi anh
Tại sao bạn không dùng file cập nhật tôi đã thông báo suốt mà lại dùng cái file từ đời nảo đời nào rồi hỏi nhỉ? Tải lại file ở bài #1, và thống nhất 1 điều là lấy cột đầu tiên làm tên file Word kết quả (nếu cần phân biệt các dòng cùng 1 văn bản.
 
Upvote 0
Chèn dòng thì sao anh cũng bị anh à
 

File đính kèm

  • loi chen dong.PNG
    loi chen dong.PNG
    15.2 KB · Đọc: 15
Upvote 0
Em xin phép gửi anh File Excel và Word, nhờ anh xem hộ em với ạ. Em xin cảm ơn ạ.
Tôi không biết bạn làm gì nhưng bị MISSING Microsoft Word 16 (chắc bạn dùng Office 2016) trong Tools/References tại cửa sổ VBA. Tôi chọn lại tham chiếu thư viện Word thì không xảy ra lỗi gì cả.
Chèn dòng thì sao anh cũng bị anh à
Đọc bài #206 !!!!!
 
Upvote 0
Hay quá bạn.Thời gian chạy rất nhanh, nó hơn code VBA ở chỗ này. Vậy khi cần tôi có thể tham khảo, nhờ bạn hướng dẫn thêm nhé, khi code gặp vướng mắc. Hình như bạn Maika8008 đang viết bằng VB.NET chứ không phải C# nhưng cơ bản nó cũng giống nhau, có thể tham khảo được.
Sẳn sàng trao đổi và chia sẻ (nếu biết) cùng các thành viên.
 
Upvote 0
Tôi không biết bạn làm gì nhưng bị MISSING Microsoft Word 16 (chắc bạn dùng Office 2016) trong Tools/References tại cửa sổ VBA. Tôi chọn lại tham chiếu thư viện Word thì không xảy ra lỗi gì cả.

Đọc bài #206 !!!!!
Vâng, em xài bộ Office 2016 a ạ. Có cách nào khắc phục được không anh?
 
Upvote 0
Ở cửa sổ vba, vào tools-Reference bỏ chọn dòng MISSING... (Nếu có). Kéo xuống dưới chọn Microsoft Word 16
trong bản e đang dùng không có dòng Missing nào ạ, và cũng đang chọn Word 16 rồi anh. Phiên bản cũ thì em vẫn chạy bình thường, nhưng bản này mới báo lỗi ạ.
1655254056936.png
 
Upvote 0
Vẫn báo lỗi như ở bài #197 của em ấy ạ. Hiện em đang dùng bản cũ trước update vẫn ok ạ, chắc do em táy máy nghịch dại cái gì đó nên mới lỗi vậy ạ.
Thử thêm .Value đàng sau Cells(...) xem. Vả lại bạn phải xem thử lúc đó cái Cells(...) kia là ô nào, nhận giá trị bao nhiêu chứ. Debug code giống như bác sĩ chẩn đoán bệnh vậy, cần phải có xét nghiệm, siêu âm chứ nghe nói như thế như thế thì thua.
Bài đã được tự động gộp:

Sẳn sàng trao đổi và chia sẻ (nếu biết) cùng các thành viên.
Nhân vụ này bạn có thể viết 1 chủ đề để chia sẻ công cụ và cách làm đi. Nay tôi như mới học đến mẫu giáo, mò mẫm mãi mụ cả đầu óc.
 
Upvote 0
Trộn dữ liệu từ Excel sang Word
-------------------------------------------------------------------------------------------

Lấy cảm hứng từ ý tưởng và file của bác Maika8008, tôi cũng thiết kế một phiên bản khác cho việc Trộn dữ liệu từ Excel sang Word.
Phiên bản này tổng hợp các nhu cầu thực tế của người dùng đã trao đổi trong chủ để này, có thể chưa đầy đủ nhưng cũng đáp ứng cơ bản cho công việc.

* Các chức năng:
- Tùy chọn trộn dữ liệu: Một (hoặc nhiều) đối tượng cho một (hoặc nhiều) văn bản.
- Tự động tạo tiêu đề cột riêng, không ảnh hưởng đến thiết kế bảng.
- Không cố định vị trí (dòng, cột ) của dữ liệu cần trộn vì dùng tham chiếu qua Table name.
- Khắc phục lỗi khi trộn đoạn văn bản nhiều hơn 255 ký tự.

Thiết kế cũng chưa bẫy lỗi gì nhiều, chắc chắn sẽ phát sinh lỗi khi thao tác, các bạn chạy kiểm tra thử nhé.
Tôi cũng đã thử dùng kết hợp tính năng Mail Merger có sẵn trong Word + VBA cho các tùy chọn nhưng tốc độ thực thi cũng không bằng một góc so với việc dùng thẳng Mail Merge (*) trong Word vì dù gì thì nó cũng đã qua code VBA để gọi tính năng Merge.

(*) Dùng Mail Merge trong Word rất nhanh nhưng nó chỉ đáp ứng tùy chọn cơ bản, đó là lý do có nhiều công cụ viết mở rộng thêm cho tính năng này.

PHP:
wdocSource.MailMerge.OpenDataSource...

PqVr9mx.jpg


Hướng dẫn sử dụng trong video.


* Đã cập nhật bẫy lỗi và chuyển sang kết nối muộn (Late binding) với Word để tránh lỗi giữa các phiên bản Office.

Link file (full code): https://www.mediafire.com/file/8fc086iogo32cie/MergeDataExcel2Word.zip/file
 
Lần chỉnh sửa cuối:
Upvote 0
Trộn dữ liệu từ Excel sang Word
-------------------------------------------------------------------------------------------

Lấy cảm hứng từ ý tưởng và file của bác Maika8008, tôi cũng thiết kế một phiên bản khác cho việc Trộn dữ liệu từ Excel sang Word.
Phiên bản này tổng hợp các nhu cầu thực tế của người dùng đã trao đổi trong chủ để này, có thể chưa đầy đủ nhưng cũng đáp ứng cơ bản cho công việc.

* Các chức năng:
- Tùy chọn trộn dữ liệu: Một (hoặc nhiều) đối tượng cho một (hoặc nhiều) văn bản.
- Tự động tạo tiêu đề cột riêng, không ảnh hưởng đến thiết kế bảng.
- Không cố định vị trí (dòng, cột ) của dữ liệu cần trộn vì dùng tham chiếu qua Table name.
- Khắc phục lỗi khi trộn đoạn văn bản nhiều hơn 255 ký tự.

Thiết kế cũng chưa bẫy lỗi gì nhiều, chắc chắn sẽ phát sinh lỗi khi thao tác, các bạn chạy kiểm tra thử nhé.
Tôi cũng đã thử dùng kết hợp tính năng Mail Merger có sẵn trong Word + VBA cho các tùy chọn nhưng tốc độ thực thi cũng không bằng một góc so với việc dùng thẳng Mail Merge (*) trong Word vì dù gì thì nó cũng đã qua code VBA để gọi tính năng Merge.

(*) Dùng Mail Merge trong Word rất nhanh nhưng nó chỉ đáp ứng tùy chọn cơ bản, đó là lý do có nhiều công cụ viết mở rộng thêm cho tính năng này.

PHP:
wdocSource.MailMerge.OpenDataSource...

PqVr9mx.jpg


Hướng dẫn sử dụng trong video.



Link file (full code): https://www.mediafire.com/file/8fc086iogo32cie/MergeDataExcel2Word.zip/file
Em chạy thử code thì báo lỗi chỗ này anh ạ:
1655362601359.png1655362564317.png
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Chắc do lỗi các đường dẫn file/ folder lưu trong đó. Tôi làm qua máy ảo Windows, các đường dẫn nó thành như ổ đĩa mạng. Để tôi sửa lại xem sao.
Bạn tải lại file bài #215 chạy thử nhé.
File anh mới up lại em thấy đã không còn bị lỗi cũ, tuy nhiên khi thực thi code trộn thì báo lỗi chưa chọn file Word, mặc dù em đã thử tích chọn hoặc nhấn chọn tất cả nhưng vẫn bị anh ạ.


1655370853864.png
 
Upvote 0
File anh mới up lại em thấy đã không còn bị lỗi cũ, tuy nhiên khi thực thi code trộn thì báo lỗi chưa chọn file Word, mặc dù em đã thử tích chọn hoặc nhấn chọn tất cả nhưng vẫn bị anh ạ.


View attachment 277414
Tải lại file đi bạn. Tôi bẫy lỗi sai cho cái listbox (tùy chọn multi select khác single select).
À mà bạn đang xài Office phiên bản gì?
 
Upvote 0
Tải lại file đi bạn. Tôi bẫy lỗi sai cho cái listbox (tùy chọn multi select khác single select).
À mà bạn đang xài Office phiên bản gì?
Em mới thử tải lại file mới ở trong link download thì lại bị dính lỗi như ở bài #216 anh ạ.
Máy em đang chạy bản Office 2016 - 64 bit
 
Upvote 0
Web KT

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

Back
Top Bottom