[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) (3 người xem)

Liên hệ QC

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

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,764
Được thích
5,740
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:
Còn 2 vấn đề nữa ạ: 1. Dữ liệu khi copy xong vẫn còn dấu nháy copy. 2. Dữ liệu paste qua word định dạng không giống với định dạng bên word ạ
Bảng chép dán qua thì nó ăn theo định dạng Excel. Muốn theo định dạng Word thì làm như trang 18, nhưng thôi, tạm nghỉ
 
Upvote 0
Anh @Maika8008 . Bảng cập nhật mới là file word tạo bảng rồi mới chép bảng excel vào hay sao ạ. Em hiện chưa test thử nên đang tò mò.
 
Upvote 0
Em có thử trên file của anh. Trên file word phải có đầy đủ trường các table thì lệnh mới thi hành. Còn không thì lệnh chỉ tạo foder chứ không trộn và lưu dữ liệu
Không cần trường gì của table trong Word cả, chỉ cần ghi tên table giữa cặp $$ như bản 07082023
 
Upvote 0
Không cần trường gì của table trong Word cả, chỉ cần ghi tên table giữa cặp $$ như bản 07082023
Ý em là file excel có $table1$, $table2$ nhưng file word không có $table$ hoặc không có hết table như file excel thì lệnh chỉ tạo foder trống chứ không trộn và lưu dữ liệu.
 
Upvote 0
Ý em là file excel có $table1$, $table2$ nhưng file word không có $table$ hoặc không có hết table như file excel thì lệnh chỉ tạo foder trống chứ không trộn và lưu dữ liệu.
Tôi đặt nhầm điều kiện. Cập nhật lại file bài #1
 
Upvote 1
Trước em có dùng add-in autocrat trong googlesheet thấy rất hay, chạy nhanh ạ. Mà hiện giờ công ty dùng Microsoft nên không rõ trong Excel online có add-in nào tương tự như vậy không ạ?
 
Upvote 0
Bản cập nhật ngày 13/08/2023:
- Sửa một số lỗi và hoàn thiện code.
- Gộp toàn bộ công việc của 2 bản 07/08/2023 và 08/08/2023
(File đính kèm tại bài #1)
có thêm chức năng ghép file tuyệt vời anh ạ... phần định dạng trong bảng table a có thể chỉnh sửa code lại không ạ... ví dụ là 71.600 khi xuất sang word vẫn là 71.600 được không ạ (71.600 là định dạng trong excell ạ)
 
Upvote 0
có thêm chức năng ghép file tuyệt vời anh ạ... phần định dạng trong bảng table a có thể chỉnh sửa code lại không ạ... ví dụ là 71.600 khi xuất sang word vẫn là 71.600 được không ạ (71.600 là định dạng trong excell ạ)
Được chứ. Lựa chọn copy cả bảng lấy nguyên định dạng bảng bên Excel đấy --=0 trong đó có phân cách hàng nghìn.
 
Upvote 0
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ăn phải cho các cột có dấu phân cách hàng nghìn.
 
Upvote 0
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ăn phải cho các cột có dấu phân cách hàng nghìn.
Cho em hỏi có cách nào để trong lúc trộn chưa xong mình có thể mở các file word đã trộn xong trong lúc chờ được không ạ. Do xuất dữ liệu hơi lâu mà cần mở các file đã trộn xong để chỉnh sửa hay in trước đỡ tốn thời gian ạ. Kiểu trộn 1 dòng nhiều văn bản hay trộn nhiều dòng nhiều văn bản ạ.
 
Upvote 0
Cho em hỏi có cách nào để trong lúc trộn chưa xong mình có thể mở các file word đã trộn xong trong lúc chờ được không ạ. Do xuất dữ liệu hơi lâu mà cần mở các file đã trộn xong để chỉnh sửa hay in trước đỡ tốn thời gian ạ. Kiểu trộn 1 dòng nhiều văn bản hay trộn nhiều dòng nhiều văn bản ạ.
Bạn mở thư mục kết quả xem thấy file nào vừa tạo ra thì mở luôn.
 
Upvote 0
Bạn mở thư mục kết quả xem thấy file nào vừa tạo ra thì mở luôn.
Em mở luôn thì nó dừng và không trộn tiếp file khác nữa ạ. Ví dụ: tổng cộng có 20 file đã trộn 5 file thì em bấm mở vào các file đã trộn xong thì nó báo xong và không thực hiện tiếp các file khác.
 
Upvote 0
Em mở luôn thì nó dừng và không trộn tiếp file khác nữa ạ. Ví dụ: tổng cộng có 20 file đã trộn 5 file thì em bấm mở vào các file đã trộn xong thì nó báo xong và không thực hiện tiếp các file khác.
Thế thì thôi vậy. Bạn nhâm nhi ly cà phê chờ vậy. --=0
 
Upvote 0
Code VBA xử lý đơn luồng, nó đang làm việc này mà câc bâc cứ bắt nó làm việc khác nữa thì nó phải bỏ dỡ một việc chứ....
 
Upvote 0
Có những dữ liệu cần chèn vào header và footer thì chỉnh như thế nào vậy anh
 
Upvote 0
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ỗ: Dạ anh ơi, chức năng này em không biết cách thao tác ạ
 
Upvote 0
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ỗ: Dạ anh ơi, chức năng này em không biết cách thao tác ạ
Bạn cứ thử hết các chức năng đi sẽ thấy
 
Upvote 0
Cho mình hỏi cách khắc phục lỗi này? mình đã mở macro ở phần trust rồi.
vba.png
 
Upvote 1
Thế thì thôi vậy. Bạn nhâm nhi ly cà phê chờ vậy. --=0
Anh @Maika8008. Cho em hỏi xíu là em muốn chọn kiểu trộn 1 dòng 1 văn bản thì khi trộn xong sẽ tự mở bản word mới trộn lên được không ạ.
Với kiểu trộn bảng thì trong 1 file word mà có 2 lần $table1$ thì nó chỉ làm việc $table1$ đầu tiên mà không làm các table1 còn lại. Có cách nào để nó tự cập nhật hết các table không ạ. Em cảm ơn
 
Upvote 0
Với kiểu trộn bảng thì trong 1 file word mà có 2 lần $table1$ thì nó chỉ làm việc $table1$ đầu tiên mà không làm các table1 còn lại. Có cách nào để nó tự cập nhật hết các table không ạ. Em cảm ơn
Bạn tạo vòng lặp thì bao nhiêu bảng cũng được hết.
 
Upvote 0
Anh @Maika8008. Cho em hỏi xíu là em muốn chọn kiểu trộn 1 dòng 1 văn bản thì khi trộn xong sẽ tự mở bản word mới trộn lên được không ạ.
Với kiểu trộn bảng thì trong 1 file word mà có 2 lần $table1$ thì nó chỉ làm việc $table1$ đầu tiên mà không làm các table1 còn lại. Có cách nào để nó tự cập nhật hết các table không ạ. Em cảm ơn
Được. Thứ gì cũng được cả. Chỉ có mất thời gian thôi --=0 :{{ :p
 
Upvote 0
Vậy chịu khó tìm hiểu và học thôi bạn.
Nhiều hay ít thì cũng phải mất thời gian chứ bạn.
Anh có thể làm nốt lần này nữa được không ạ. Em đã mò thử nhiều lần mà không được
Phần khuyên chịu khó tìm hiểu và học hỏi thì không thấy phản hồi mà lại tiếp tục nhờ ...
 
Upvote 0
Phần khuyên chịu khó tìm hiểu và học hỏi thì không thấy phản hồi mà lại tiếp tục nhờ ...
Nói thế chứ không rành code không làm được đâu. Vả lại nếu không phải tác giả thì sửa cho 12 trường hợp khác nhau cũng khó lắm đấy.
@Manhhung90 Bạn tải file cập nhật tại bài #1
 
Upvote 0
Về cơ bản thì phải chịu khó mày mò, không xử lý được chỗ nào và vì sao thì đưa lên rồi hỏi tiếp. Chứ cứ nhờ mãi thế này e rằng không ổn.
Dính đến Word thì nhiều thứ sẽ rối rắm hơn, ví dụ có bao nhiêu vị trí cần chèn bảng để chạy vòng lặp chẳng hạn, mà với Word thì không đơn giản đếm như CountIf trong Excel.
 
Upvote 0
Phần khuyên chịu khó tìm hiểu và học hỏi thì không thấy phản hồi mà lại tiếp tục nhờ ...
Em đã tìm hiểu và thử nhiều lần nhưng không được, vượt quá hiểu biết em nên mới nhờ tiếp ạ
Bài đã được tự động gộp:

Dính đến Word thì nhiều thứ sẽ rối rắm hơn, ví dụ có bao nhiêu vị trí cần chèn bảng để chạy vòng lặp chẳng hạn, mà với Word thì không đơn giản đếm như CountIf trong Excel.
Cảm ơn anh rất nhiều ạ. Em nghĩ cái này cũng có thể được áp dụng nhiều trường hợp nên em mới nhờ anh giúp ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi a có thể hướng dẫn or có link tham khảo nào của việc file phát hiện file word đang mở để mình thao tác đóng lại ko anh ak.
Bài đã được tự động gộp:

Anh ơi a có thể hướng dẫn or có link tham khảo nào của việc phát hiện file word đang mở trong VBA để mình thao tác đóng lại ko anh ak.
 
Upvote 0
Anh ơi a có thể hướng dẫn or có link tham khảo nào của việc file phát hiện file word đang mở để mình thao tác đóng lại ko anh ak.
Bài đã được tự động gộp:

Anh ơi a có thể hướng dẫn or có link tham khảo nào của việc phát hiện file word đang mở trong VBA để mình thao tác đóng lại ko anh ak.
Dùng câu lệnh:
On Error Resume Next
Set WordApp = GetObject(, Word.Application)
Nếu lệnh không lỗi thì đóng nó:
If Err.Number = 0 Then WordApp.Quit
 
Upvote 0
Cảm ơn a. e làm được rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn làm sao được vậy. Do hồi nãy thấy bạn nói không được
 
Upvote 0
Bạn làm sao được vậy. Do hồi nãy thấy bạn nói không được
Mình chỉ mới mò được cái chèn 1 dòng 1 file ak, mình chèn mấy dòng code cho nó lưu file mẫu đó và đóng nó lại. Và tiếp tuc. Còn với 3 option kia thi chưa mà. ( có mấy dòng nhưng chắc hơi thừa) tí mình úp đoạn code đó xin chỉ giáo thêm
 
Upvote 0
Mình chỉ mới mò được cái chèn 1 dòng 1 file ak, mình chèn mấy dòng code cho nó lưu file mẫu đó và đóng nó lại. Và tiếp tuc. Còn với 3 option kia thi chưa mà. ( có mấy dòng nhưng chắc hơi thừa) tí mình úp đoạn code đó xin chỉ giáo thêm
Bạn úp code lên mình tham khảo được không ạ?
 
Upvote 0
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).
bạn có thể hướng dẫn giúp mình để tìm hiểu về, dụng công cụ này cụ thể hơn không ạ? minh xem nhưng vì chưa biết gì về VBA nên chưa thể sử dụng được. chân thành cảm ơn ạ
Bài đã được tự động gộp:

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).
bạn có thể hướng dẫn giúp mình để tìm hiểu về, dụng công cụ này cụ thể hơn không ạ? minh xem nhưng vì chưa biết gì về VBA nên chưa thể sử dụng được. chân thành cảm ơn ạ
 
Upvote 0
bạn có thể hướng dẫn giúp mình để tìm hiểu về, dụng công cụ này cụ thể hơn không ạ? minh xem nhưng vì chưa biết gì về VBA nên chưa thể sử dụng được. chân thành cảm ơn ạ
Bài đã được tự động gộp:


bạn có thể hướng dẫn giúp mình để tìm hiểu về, dụng công cụ này cụ thể hơn không ạ? minh xem nhưng vì chưa biết gì về VBA nên chưa thể sử dụng được. chân thành cảm ơn ạ
Bạn tải 2 file mẫu về để vào chung 1 thư mục mới rồi chạy thử, quan sát kết quả rồi từ từ sẽ biết.
 
Upvote 0
Em có 1 thắc mắc mà ngại hỏi anh quá nhưng em bí quá mới hỏi anh ạ. File em dùng từ lúc đầu nên em không biết sửa đoạn code như nào để có thể mở file word tự động khi chọn kiểu trộn 1 file, và vòng lặp trộn nhiều bảng. Nhờ anh giúp em với ạ!!
 
Upvote 0
Em có 1 thắc mắc mà ngại hỏi anh quá nhưng em bí quá mới hỏi anh ạ. File em dùng từ lúc đầu nên em không biết sửa đoạn code như nào để có thể mở file word tự động khi chọn kiểu trộn 1 file, và vòng lặp trộn nhiều bảng. Nhờ anh giúp em với ạ!!
Bạn thay 2 dòng:
sPath = Application.GetOpenFilename(Title:=strTitle, _
FileFilter:="MSWord Files *.doc* (*.doc*),", MultiSelect:=blSelect)
bằng đường dẫn đến file Word, ví dụ:
sPath = "D:\GPE_Download\VD\GMH.docx"
 
Upvote 0
Bạn thay 2 dòng:
sPath = Application.GetOpenFilename(Title:=strTitle, _
FileFilter:="MSWord Files *.doc* (*.doc*),", MultiSelect:=blSelect)
bằng đường dẫn đến file Word, ví dụ:
sPath = "D:\GPE_Download\VD\GMH.docx"
Thay sPath bằng đường dẫn đến file word là tự động mở file khi trộn xong ạ? Nhưng đường dẫn đến file word là tùy biến chứ không cố định nên dùng đường dẫn cố định này khó áp dụng nhiều trường hợp ạ
 
Upvote 0
Thay sPath bằng đường dẫn đến file word là tự động mở file khi trộn xong ạ? Nhưng đường dẫn đến file word là tùy biến chứ không cố định nên dùng đường dẫn cố định này khó áp dụng nhiều trường hợp ạ
Bạn hỏi là mở file Word chứ có nói rõ là mở file nguồn hay file kết quả đâu. Muốn mở file kết quả thì thay vì lệnh close thì đừng close mà dùng Wordapp.Visible = True
 
Upvote 0
Bạn hỏi là mở file Word chứ có nói rõ là mở file nguồn hay file kết quả đâu. Muốn mở file kết quả thì thay vì lệnh close thì đừng close mà dùng Wordapp.Visible = True
Có cách nào để xoá các dòng khi trộn xong có các ký tự đặc biệt được không ạ. Ví dụ: dòng cần trộn xuất hiện có ký tự * thì sẽ tự xoá dòng đó đi. Em tìm hiểu mà chưa biết làm như thế nào ạ!!!
 
Upvote 0
Có cách nào để xoá các dòng khi trộn xong có các ký tự đặc biệt được không ạ. Ví dụ: dòng cần trộn xuất hiện có ký tự * thì sẽ tự xoá dòng đó đi. Em tìm hiểu mà chưa biết làm như thế nào ạ!!!
Đó đâu phải cách người ta thường làm. Bảng Excel đó là database, sao lại phải xóa dòng trong database nhỉ?
 
Upvote 0
Sao không xử lý trong excel, dòng nào có dấu * thì khỏi trộn.
Mình có bản word như sau:
Họ tên 1: $hoten1$
Họ tên 2: $hoten2$
Họ tên 3: $hoten3$
Họ tên 4: $hoten4$
Họ tên 5: $hoten5$
Và mình có 1 file excel có sẵn các dòng điền. Nhưng không phải lúc nào cũng nhập đầy đủ các dòng nên mình muốn khi không nhập dòng nào thì sẽ xoá dòng đó trong word luôn
 
Upvote 0
Mình có bản word như sau:
Họ tên 1: $hoten1$
Họ tên 2: $hoten2$
Họ tên 3: $hoten3$
Họ tên 4: $hoten4$
Họ tên 5: $hoten5$
Và mình có 1 file excel có sẵn các dòng điền. Nhưng không phải lúc nào cũng nhập đầy đủ các dòng nên mình muốn khi không nhập dòng nào thì sẽ xoá dòng đó trong word luôn
Mình có 1 gợi ý là bác nhập nguyên dòng đó vào bảng excel.
Thay vì:
Họ tên 5: $hoten5$
thì nhập thành:
$Họ tên 5: hoten5$
 
Upvote 0
Cho mình hỏi có cách nào trộn nhiều văn bản nhưng có 1 văn bản bị lỗi thì vẫn tiếp tục trộn được không ạ? Do em đang gặp vấn đề là 1 văn bản bị kẹt do lần trộn trước bị lỗi, lần sau trộn lại thì bị lỗi OLE ạ
 
Upvote 0
bác đã chuyển sang excel365 chưa ạ!
Chưa, tớ không dám chuyển, vì nếu bản quyền cơ bản thì hổng thèm, mà chắc chỉ bản quyền online thôi, offline là suỵt. Chỉ được cái onedrive 1TB, nhưng ổ cứng có 512, cài win hết gần nửa còn có hơn 250GB, thế thì cũng cần đếch gì đến 1TB (dung lượng nhiều để đồng bộ song song mà chênh quá chả có tác dụng).

Mình chưa biết chèn từ chỗ nào ạ
Thế thì khó rồi, vậy tốt nhất đừng để văn bản bị lỗi thôi, lỗi chỗ nào sửa và đúc kết dần dần.
 
Upvote 0
Chưa, tớ không dám chuyển, vì nếu bản quyền cơ bản thì hổng thèm, mà chắc chỉ bản quyền online thôi, offline là suỵt. Chỉ được cái onedrive 1TB, nhưng ổ cứng có 512, cài win hết gần nửa còn có hơn 250GB, thế thì cũng cần đếch gì đến 1TB (dung lượng nhiều để đồng bộ song song mà chênh quá chả có tác dụng).


Thế thì khó rồi, vậy tốt nhất đừng để văn bản bị lỗi thôi, lỗi chỗ nào sửa và đúc kết dần dần.
Mình gặp vấn đề báo OLE xong rồi thì file word lỗi như thế này. Có cách nào khắc phục không ạ!!!
 

File đính kèm

  • IMG_20240620_191948.jpg
    IMG_20240620_191948.jpg
    91.3 KB · Đọc: 18
Upvote 0
Mình có 1 gợi ý là bác nhập nguyên dòng đó vào bảng excel.
Thay vì:
Họ tên 5: $hoten5$
thì nhập thành:
$Họ tên 5: hoten5$
Làm như vậy thì khi excel không có dữ liệu thì dòng $Họ tên 5: hoten5$ sẽ thành dòng trống và không liền với dòng liền kề bên dưới

Giống như thế này đó bạn
 
Upvote 0
Cho mình hỏi có cách nào trộn nhiều văn bản nhưng có 1 văn bản bị lỗi thì vẫn tiếp tục trộn được không ạ? Do em đang gặp vấn đề là 1 văn bản bị kẹt do lần trộn trước bị lỗi, lần sau trộn lại thì bị lỗi OLE ạ
Sửa chỗ On Error Goto Ve hoặc On Error Goto ABCXYZ gì đó thành On Error Resume Next.

Nhưng khi đã làm như vậy rất khó kiểm soát.
 
Upvote 0
Cảm ơn bác Maika rất nhiều khi chia sẻ có 1 phần thay thế cho chuỗi lớn hơn 255 ký tự mình chưa áp dụng được mong anh em nào cao thủ ghé qua chỉ giáo giúp cho. chân thành cảm ơn ^ ^

Dim Teamplate As Object
Dim PathFile As String
Dim ws As Worksheet
Dim blBig As Boolean
Set ws = Sheet3

'Duong dan file
PathFile = Sheet3.Range("C1").Value & "\Temp" & "\"

If Sheet2.Range("F4").Value = "Soan mau" Then
With CreateObject("word.application")
.Visible = True
Set Template = .Documents.Add(PathFile & "DXKD.docx")

'Sua du lieu trong file Mau theo Key
For Each cls In Range(ws.[a1], ws.[a65000].End(3))

If Len(cls(1, 2).Text) > 255 Then 'Ghi nhan > 255 ky tu
blBig = True
Else
sFormat = GetFormat(cls(1, 2))
End If

If sFormat <> "0" Then
If blBig = True Then 'Truong hop cell's text > 255 ky tu
Chỗ này mình chưa biết viết code như thế nào
Else
strValue = Format(cls(1, 2), sFormat)

Else
strValue = cls(1, 2).Text
End If
.Selection.Find.Execute cls, , , , , , , , , strValue, 2
Next

Template.SaveAs Filename:=ThisWorkbook.Path & "\" & "DXKD." & Sheets("PIX").Range("D1").Value & ".docx"
.Quit
End With
End If
 
Upvote 0
Cảm ơn bác Maika rất nhiều khi chia sẻ có 1 phần thay thế cho chuỗi lớn hơn 255 ký tự mình chưa áp dụng được mong anh em nào cao thủ ghé qua chỉ giáo giúp cho. chân thành cảm ơn ^ ^
Chỗ này mình chưa biết viết code như thế nào
Đang định giúp, nhưng xem mấy bài trước của bạn này được một số thành viên hỗ trợ nhưng không thấy phản hồi bất kỳ một bài nào nên lại thôi.
 
Upvote 0
Cảm ơn bác Maika rất nhiều khi chia sẻ có 1 phần thay thế cho chuỗi lớn hơn 255 ký tự mình chưa áp dụng được mong anh em nào cao thủ ghé qua chỉ giáo giúp cho. chân thành cảm ơn ^ ^

Dim Teamplate As Object
Dim PathFile As String
Dim ws As Worksheet
Dim blBig As Boolean
Set ws = Sheet3

'Duong dan file
PathFile = Sheet3.Range("C1").Value & "\Temp" & "\"

If Sheet2.Range("F4").Value = "Soan mau" Then
With CreateObject("word.application")
.Visible = True
Set Template = .Documents.Add(PathFile & "DXKD.docx")

'Sua du lieu trong file Mau theo Key
For Each cls In Range(ws.[a1], ws.[a65000].End(3))

If Len(cls(1, 2).Text) > 255 Then 'Ghi nhan > 255 ky tu
blBig = True
Else
sFormat = GetFormat(cls(1, 2))
End If

If sFormat <> "0" Then
If blBig = True Then 'Truong hop cell's text > 255 ky tu
Chỗ này mình chưa biết viết code như thế nào

Else
strValue = Format(cls(1, 2), sFormat)

Else
strValue = cls(1, 2).Text
End If
.Selection.Find.Execute cls, , , , , , , , , strValue, 2
Next

Template.SaveAs Filename:=ThisWorkbook.Path & "\" & "DXKD." & Sheets("PIX").Range("D1").Value & ".docx"
.Quit
End With
End If

Đang định giúp, nhưng xem mấy bài trước của bạn này được một số thành viên hỗ trợ nhưng không thấy phản hồi bất kỳ một bài nào nên lại thôi.
Oan mình quá bác ơi đc rep đúng 1 lần k à.
 
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.


* Đã 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
Cảm ơn anh về bài này em đang chạy thử cho Cty thấy ok quá chừng
 
Upvote 0
Mấy em test nó báo vậy rồi treo luôn anh ơi!
Chạy em hay bị lỗi 2 dong này!

@babyheomoi
Bạn sai gì không biết nhưng nó báo lỗi đường dẫn và tên file thì phải nghĩ là nhập sai 2 thông tin đó.

Còn khi đã sai mà ngừng code nửa chừng là không thoát được Word.Application, lỗi còn nặng hơn. Khởi động lại máy tính mới hết lỗi.
Bài đã được tự động gộp:


Tôi đoán vẫn là mail merge nhưng dùng vba để đơn giản khâu chèn trường
Có cách nào tự thoát Word.Application mà không cần khởi động lại máy không ạ?
 
Upvote 0
Có cách nào tự thoát Word.Application mà không cần khởi động lại máy không ạ?
Cái ứng dụng bị lỗi và chưa bẫy lỗi nó nên khi lỗi phát sinh, ứng dụng Word vẫn còn chạy ngầm. Phải vô Task manager - end task nó như bạn Hesanbi đã đề cập.
 
Upvote 0
Cảm ơn bác Maika8008 rất là nhiều, mình đọc hết toàn bộ nội dung mấy năm qua từ trang 1 đến trang 25, sự nhiệt tình của bác và các thành viên khác thiệt là không gì có thể so sánh được, giải pháp bác đưa ra quá ok. mong sẽ phát huy và tiếp tục hoàn thiện để ae có thể ứng dụng tốt trong công việc hàng ngày.
 
Upvote 0
Cảm ơn bác Maika8008 rất là nhiều, mình đọc hết toàn bộ nội dung mấy năm qua từ trang 1 đến trang 25, sự nhiệt tình của bác và các thành viên khác thiệt là không gì có thể so sánh được, giải pháp bác đưa ra quá ok. mong sẽ phát huy và tiếp tục hoàn thiện để ae có thể ứng dụng tốt trong công việc hàng ngày.
Trước như vậy chứ chừ lụt nghề rồi bạn --=0
 
Upvote 0
Trước như vậy chứ chừ lụt nghề rồi bạn --=0
Hii, nghề nó nằm trong não, quan trọng là tư duy và kinh nghiệm...quên thì nhờ chị google hoặc AI, ý tưởng và tư duy suy luận là quan trọng nhất bác

Maika8008.​


Mình làm bên xây dựng, việc làm hồ sơ nghiệm thu thì đầu mục nó nhiều vô kể, do tiến độ nhập theo từng ngày, cho từng hạng mục công việc. nên công trình diễn ra trong 1 năm thì có mấy trăm cái biên bản, với đủ thứ dữ liệu đầu vào. việc bố trí dữ liệu trộn theo cột lúc này bị hạn chế, vì dài quá trời dài, sẽ khó kiểm soát.

Bạn có thể nâng cấp ứng dụng này với cách nhập liệu theo hàng để việc thao tác và theo dõi diễn tiến được liên tục không? Việc chuyển cột thành hàng mình nghĩ cũng khó nhằn lắm và cũng mất thời gian lắm....cảm ơn bạn nhiều.
 
Upvote 0
Hii, nghề nó nằm trong não, quan trọng là tư duy và kinh nghiệm...quên thì nhờ chị google hoặc AI, ý tưởng và tư duy suy luận là quan trọng nhất bác

Maika8008.​


Mình làm bên xây dựng, việc làm hồ sơ nghiệm thu thì đầu mục nó nhiều vô kể, do tiến độ nhập theo từng ngày, cho từng hạng mục công việc. nên công trình diễn ra trong 1 năm thì có mấy trăm cái biên bản, với đủ thứ dữ liệu đầu vào. việc bố trí dữ liệu trộn theo cột lúc này bị hạn chế, vì dài quá trời dài, sẽ khó kiểm soát.

Bạn có thể nâng cấp ứng dụng này với cách nhập liệu theo hàng để việc thao tác và theo dõi diễn tiến được liên tục không? Việc chuyển cột thành hàng mình nghĩ cũng khó nhằn lắm và cũng mất thời gian lắm....cảm ơn bạn nhiều.
Mất công thôi chứ không khó khăn chi
 
Upvote 0
Vẫn chờ bác Maika8008 ra tay độ lại app mới nhập liệu theo hàng......chúc cả nhà mình luôn vui vui
Laptop dùng bàn phím rời vì bàn phím trong hỏng thay mấy lần rồi. Nay bàn phím rời bị pin chảy nước hỏng luôn, đang chờ hàng mới. Lần này dẹp luôn loại không dây.
 
Upvote 0
Hii, nghề nó nằm trong não, quan trọng là tư duy và kinh nghiệm...quên thì nhờ chị google hoặc AI, ý tưởng và tư duy suy luận là quan trọng nhất bác

Maika8008.​


Mình làm bên xây dựng, việc làm hồ sơ nghiệm thu thì đầu mục nó nhiều vô kể, do tiến độ nhập theo từng ngày, cho từng hạng mục công việc. nên công trình diễn ra trong 1 năm thì có mấy trăm cái biên bản, với đủ thứ dữ liệu đầu vào. việc bố trí dữ liệu trộn theo cột lúc này bị hạn chế, vì dài quá trời dài, sẽ khó kiểm soát.

Bạn có thể nâng cấp ứng dụng này với cách nhập liệu theo hàng để việc thao tác và theo dõi diễn tiến được liên tục không? Việc chuyển cột thành hàng mình nghĩ cũng khó nhằn lắm và cũng mất thời gian lắm....cảm ơn bạn nhiều.
Đã cập nhật trộn theo dòng. File tại bài #1
 
Upvote 0

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

Back
Top Bottom