Trộn dữ liệu từ Excel sang Word mở rộng (phiên bản ongke0711)

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

(Xin phép được tách bài từ bài post của bác Maika8008 ([URL='www.giaiphapexcel.com/diendan/threads/chia-s%E1%BA%BB-d%C3%B9ng-vba-tr%E1%BB%99n-d%E1%BB%AF-li%E1%BB%87u-excel-sang-file-word-m%E1%BA%ABu-t%C6%B0%C6%A1ng-t%E1%BB%B1-ch%E1%BB%A9c-n%C4%83ng-mail-merge.155954/']Link) để tránh lẫn lộn khi trao đổi và do cũng tài lanh xen vào, gây loãng bài của bác ấy).

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ần 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.
– Chỉ lấy những dòng dữ liệu sau khi dùng Filter trong bảng dữ liệu.
– Khắc phục lỗi khi trộn đoạn văn bản nhiều hơn 255 ký tự.
– Trộn có kèm luôn file hình ảnh (.jpg, .png, .bmp).
– Xuất file dạng .Docx, .PDF

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.

wdocSource.MailMerge.OpenDataSource...

12131212

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

VaL70D8G5ls:33

* Đã 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):
www.mediafire.com/file/8fc086iogo32cie/MergeDataExcel2Word.zip/file

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

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

Bạn nên đọc

10 Responses

  1. hands says:

    Hướng dẫn thiết kế file Word để có thể nhận hình ảnh theo cái demo Excel của tôi:
    ——————————————–
    Dùng Table để chứa file ảnh. Tận dụng tính năng Auto Fit – Fixed Column Width để chèn ảnh vừa khít 1 ô trong Table.
    – Trong file Word, dùng công cụ Draw table để vẽ 1 ô tại vị trí mình muốn hiển thị ảnh.
    – Chọn các mục như hình bên dưới.
    – Nhập tên cột cần trộn vào ô table này. Xong
    121612151214

    Có cập nhật về định dạng các kiểu dữ liệu bị thay đổi khi trộn qua Word. Lúc trước bỏ quên vụ này.
    Các bạn tải lại file ở bài #1 nhé.
    Sau này có thời gian rảnh tôi sẽ chuyển thành Add-in dùng Task panel, Form để tương tác và dễ phân phối, sử dụng cho các file Excel khác.

    Chào anh, mạn phép xin anh có thể giúp em đoạn mã tự động "Insert Merge Field" trong word,theo từng trường thông tin ở file "2.xlsx" tương ứng với file word 1 ( em đã làm xong ), được không ạ. Nhiều file mà em làm tay thì hơi mất thời gian ạ. Mong anh dành chút thời gian xem qua. Em xin cảm ơn nhiều.

    Tôi chưa hiểu ý bạn lắm.
    Ý bạn là muốn trong file Word, khi thao tác chọn "Insert merge Field" – chọn từng Field cho từng vị trí trong văn bản, thì sẽ có code tự động chèn vào? Hay ý như thế nào?

    1218

    –> Tự động chọn field như hình và chèn?

    Ý đầu như tôi nói ở trên là không làm được nhé vì làm sao máy tính nó tự động biết chèn Field nào ở vị trí nào trong văn bản. Phải có thao tác thủ công của con người vô.

    Chào anh ạ, hoặc có thể làm phương án là mình chọn vị trí trên Word rồi mình đánh chữ để gợi ý (vd: đánh chữ S sẽ gợi ý ra những dòng "SoPhieuChuyen") v..v, để mình chọn được không ạ. Tại trên Insert Merge Field phải tìm nên hơi lâu ạ. Làm nhiều file chắc mờ cả mắt luôn :D. Cám ơn anh đã xem ạ

    Tôi nghĩ là được nhưng khi đó sẽ là viết code mail merger trong Word chứ không phải trong Excel. Nhưng giờ thì chưa viết được nhe 😀 .
    Không biết bác @giaiphap , bác @huuthang_bd đã có cái Word Add in nào có tính năng tìm kiếm merge Field giống đề xuất như trên giới thiệu cho bạn ấy xài không nhỉ.

    Dùng file này kết hợp với tiện ích của bạn xem có được không? Cái này chỉ dùng riêng cho cái tiện ích của bác thôi đấy nhé.
    A4cilfDOf1Q

    Chào anh em có file mẫu thiết kế như này nhưng chạy không ra anh à. nhờ anh sửa em code với.Nhưng em muốn nhờ bác sửa file em gửi cho nó điền được không bác. em xin chân thành cảm ơn anh

    1. Nó báo lỗi như thế nào hoặc có triệu chứng như thế nào bạn?
    2. Dòng tiêu đề của bảng dữ liệu trong file mẫu của tôi không có dùng dấu ngoặc vuông "" nhé. Nó là tên cột dùng để tham chiếu, đối chiếu với file Word nên khi có thay đổi nào trong tên Cột sẽ làm ứng dụng chạy không như mong muốn nhé.
    Bạn bỏ hết dấu ngoặc vuông trong file excel rồi chạy thủ xem. Tại sao phải bắt buộc phải giữ dấu ngoặc vuông đó ?

    http://www.giaiphapexcel.com/diendan/threads/tr%E1%BB%99n-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-excel-sang-word-m%E1%BB%9F-r%E1%BB%99ng-phi%C3%AAn-b%E1%BA%A3n-ongke0711.160857/post-1074648

  2. hands says:

    Hi anh,
    Về tạo folder thay vì tạo cho từng dòng dữ liệu anh có thể thay thế bằng tính năng tạo folder theo tên của một cột chỉ định (Có thể nhóm nhiều file kết quả lại nếu chung 1 nhóm) như tên của file được không anh. Theo em nhu cầu sử dụng thực tế sẽ cao hơn nhiều so với tạo từng dòng dữ liệu.
    Ví dụ: 1 danh sách gồm 100 học sinh, chia làm 4 lớp, sẽ có cột tên học sinh và cột tên lớp. Như việc việc trộn danh sách giấy mời họp phụ huynh sẽ tự động nhóm lại theo thư mục của từng lớp. Như vậy sẽ tiện hơn phải chạy 4 lần trộn.

    Số lần trộn là như nhau chỉ có tác vụ tạo Folder là nhiều hơn so với nhóm.

    Tôi túm lại các yêu cầu như sau:
    – Bạn Li hiệp sĩ: chống ghi đè nếu có mấy người trùng tên trong danh sách.
    – Bạn Thuy2022: nếu in cùng trộn một lúc nhiều file Word cho cùng 1 đối tượng (1 dòng dữ liệu) thì gộp chung vào một folder cho dễ quản lý
    – Bạn tieutuvodanh192: thì muốn gom các đối tượng cùng nhóm và tạo folder chung cho nhóm đó để lưu.
    Nói chung ai cũng có nhu cầu hợp lý nhưng các bạn có suy nghĩ nếu gộp chung các yêu cầu đó lại (vì các bạn cũng sẽ gặp như vậy) thì giải thuật xử lý là như thế nào chưa?
    Các bạn cùng đóng góp, nghĩ thử xem cách xử lý file, folder như thế nào để đáp ứng 3 yêu cầu trên nhé, hoặc đáp ứng 2/3 hoặc sẽ gặp những tình huống nào sẽ chạy không đúng nữa hoặc phải qui định như thế nào để chạy đúng…. 🙂
    Tôi thì đã có giải pháp rồi nhưng có thể chưa đầy đủ, chờ các góp ý của các bạn.

    Hi anh,
    Không biết ý em như bên dưới có thiếu sót gì không 😀

    1/ chống ghi đè nếu có mấy người trùng tên trong danh sách. -> Lưu tên file đâu nhất thiết phải sử dụng cột tên, lấy cột khác có ký hiệu phân biệt là được mà.

    2/ nếu in cùng trộn một lúc nhiều file Word cho cùng 1 đối tượng (1 dòng dữ liệu) thì gộp chung vào một folder cho dễ quản lý
    3/ thì muốn gom các đối tượng cùng nhóm và tạo folder chung cho nhóm đó để lưu.
    => 2 yêu cầu này gộp chung được mà, nếu muốn lưu file trong 1 folder nào đấy thì tạo mới (nếu chưa có folder đó) hoặc ghi file vào folder, folder được xác định theo 1 cột như cột tên file.

    Em thì chưa có nhu cầu sử dụng file của anh nhiều, tuy nhiên em có share file cho mấy bạn làm ở trường học, đợt rồi phát giấy mời tổng kết cho gần 1700 cháu, đỡ được rất nhiều thời gian. Qua sử dụng thì các bạn thấy có báo lại em nếu chia theo lớp luôn thì quá ok luôn anh.

  3. hands says:

    E có 1 file trộn Như thế này ạ giờ muốn trộn với file demo như A tạo. Vậy trong file excle cần thay đổi hay sửa gì để khi trộn thì: 1. mục "Thời gian hưởng từ ngày……. đến ngày……." theo tổng số tháng hưởng phía trên ạ.
    2. Phần phụ lục thông báo, các ngày thông báo được tính và thiết kế như thế nào để nhảy từ ngày hưởng đến các tháng tiếp theo nhưng vẫn trừ thứ 7, chủ nhật và nghỉ lễ ạ.
    E đã tìm hiều và cũng áp dụng hàm WORKDAY.INTL nhưng vẫn bị sai.
    E xin cảm ơn ạ

    Bạn nên nhớ rằng bảng dữ liệu để trộn là bảng dữ liệu cuối cùng để chuyển qua file Word. Còn làm như thế nào để có những dữ liệu cuối cùng đó thì bạn phải xử lý trước trong Excel rồi chứ. Các mục 1, 2 bạn hỏi thì bạn phải đưa file Excel lên, tổ chức xây dựng bảng dữ liệu như thế nào, kết quả mong muốn như thế nào rồi thuần túy xử lý bảng tính chứ không liên quan gì đến việc trộn.
    Việc tính các ngày làm việc trừ ngày nghỉ, lễ đã có nhiều bài viết trên GPE rồi, bạn chịu khó với nút tìm kiếm góc trên, bên phải nhé.

    Dạ. Cảm ơn A rất nhiều ạ. E xin phép gửi file để nhờ hỗ trợ ạ. Các nội dung trong file cần hỗ trợ E có comment ạ. và các mục trong phần 1a đến 12b ngoài việc lập công thức để xử lý thì có cách nào để nhảy theo số tháng hưởng được ko ạ?
    E chân thành cảm ơn!

    Công thức Excel, tôi tệ lắm, hơn nữa tôi cũng không hiểu ý nghĩa các cột 1a – 12b là cái gì, làm sao tính ra được, tôi đọc công thức thì không hiểu gì cả nhé bạn. Bạn giải thích cho rõ vì không phải ai cũng hiểu được công việc, cách tính toán của bạn qua cái bảng tính này. Nhờ các bạn khác hỗ trợ giùm thôi. Tốt nhất là lập cái chủ đề khác liên quan đến xử lý công thức, tính toán cho file Excel của bạn.

  4. hands says:

    Bác @ongke0711 cho em hỏi, em muốn trộng nhiều file word vào các Sheet khác nhau, các sheet đó nằm ở các file excel khác nhau thì cái này có làm được không ạ? (vì hệ thống phần mềm bên em xuất ra các file excel định dạng khác nhau ạ) Em đội ơn bác ạ.

    Trộn nhiều sheet Excel vào file Word chứ.
    Khi trộn file, nó có nhiều tùy biến, phải có những tùy chọn thủ công nên khó có thể thiết kế theo yêu cầu của bạn. Còn việc nhiều sheet khác nhau, nằm ở các file khác nhau thì bạn xem lại cách xây dựng, trích xuất dữ liệu để nó có thể hợp nhất thành 1 file rồi ứng dụng các phần mềm để trộn, chứ khó mà thiết kế ứng dụng đi theo cơ sở dữ liệu lộn xộn được.

  5. hands says:

    có thể là file name ở đâu đó bị lỗi, mình nghĩ là cái forms đang bị lỗi tên gì đó.

    Mình lấy bản hôm qua tải về, thì đây là kết quả sau khi trộn., nó vẫn ra y nguyên cái file gốc chứ chưa được trộn.

    có thể là file name ở đâu đó bị lỗi, mình nghĩ là cái forms đang bị lỗi tên gì đó.

    Bạn dùng file này xem còn lỗi 52 nữa không. Copy vô cùng thư mục.
    Tôi chuyển sang Office 2013 32bit.

  6. hands says:

    Bạn dùng file này xem còn lỗi 52 nữa không. Copy vô cùng thư mục.
    Tôi chuyển sang Office 2013 32bit.

    mình dùng bản bạn mới update thì bị lỗi này, liệu có liên quan đến đường dẫn máy Mac bạn đang dùng không nhỉ?

    Bạn sửa lại phần Asign macro của 2 cái nút lệnh là được rồi. Tạo file mới, chuyển code qua nên nó bị vậy.

    mình vẫn bị lỗi 52, bạn thử teamview cho mình phát đc ko? zalo mình 0966136196
    hay là code của bản này 32 bít ko dùng đc cho 64 nhỉ? máy mng dùng đc sao máy mình ko dùng đc, thế mới là cái vấn đề khó hiểu.

    Code dùng cho cả 32 và 64 bit.
    Đơn giản là giờ bạn tạo file Excel mới từ máy bạn, copy toàn bộ code, Form, Sheet qua, gán lại macro rồi chạy thử là biết liền.

    bạn ơi, bạn có thể up tất cả các ver từ trước đc không? biết đâu những ver cũ code ít nên khả năng bị lỗi sẽ ít đi.

    Chỉ có một thôi nhé bạn.
    Từ máy bạn tạo file mà cũng báo lỗi file à?

  7. hands says:

    Bạn sửa lại phần Asign macro của 2 cái nút lệnh là được rồi. Tạo file mới, chuyển code qua nên nó bị vậy.Code dùng cho cả 32 và 64 bit.
    Đơn giản là giờ bạn tạo file Excel mới từ máy bạn, copy toàn bộ code, Form, Sheet qua, gán lại macro rồi chạy thử là biết liền.

    Chỉ có một thôi nhé bạn.
    Từ máy bạn tạo file mà cũng báo lỗi file à?

    Chỉ có một thôi nhé bạn.
    Từ máy bạn tạo file mà cũng báo lỗi file à?

  8. hands says:

    Bạn sửa lại phần Asign macro của 2 cái nút lệnh là được rồi. Tạo file mới, chuyển code qua nên nó bị vậy.Code dùng cho cả 32 và 64 bit.
    Đơn giản là giờ bạn tạo file Excel mới từ máy bạn, copy toàn bộ code, Form, Sheet qua, gán lại macro rồi chạy thử là biết liền.

    Chỉ có một thôi nhé bạn.
    Từ máy bạn tạo file mà cũng báo lỗi file à?

    Không phải máy bạn bị lỗi đâu. Giờ rảnh tôi mới ngồi kiểm tra lại thì phát hiện lỗi ở phần code tự động lấy đường dẫn folder cũ -> nạp các file .doc trong đó.
    Tôi đã sửa và cập nhật ở link bài #1. File đính kèm bên dưới.

    7899

    (PS: Phải mượn cái laptop Windows của thằng con mới test ra cái lỗi đường dẫn, còn làm trên máy Windows ảo thì các đường dẫn dạng UNC nó vẫn chấp nhận, không báo lỗi)

  9. hands says:

    Không phải máy bạn bị lỗi đâu. Giờ rảnh tôi mới ngồi kiểm tra lại thì phát hiện lỗi ở phần code tự động lấy đường dẫn folder cũ -> nạp các file .doc trong đó.
    Tôi đã sửa và cập nhật ở link bài #1. File đính kèm bên dưới.

    7899

    (PS: Phải mượn cái laptop Windows của thằng con mới test ra cái lỗi đường dẫn, còn làm trên máy Windows ảo thì các đường dẫn dạng UNC nó vẫn chấp nhận, không báo lỗi)

    quá tuyệt vời mình vừa chạy thì thấy ngon lành không bị lỗi nữa rồi bác! Đây là bản thấy tốc độ rất nhanh và nhiều option để lựa chọn!khi chạy phát sinh cái lỗi:
    Không biết mình có làm lộn cái gì không nữa, chưa có test debug nên ko biết dòng nào…

    Cám ơn Bác nhiều.

    Có thể do chọn trường làm tên file lưu đó (mục 4). Tên file không được quá 255 ký tự.

    cho mình hỏi, khi mình chạy thì ví dụ cột A là không có dữ liệu, nhưng khi chạy thì file word vẫn hiện chứ không mặc định thay thế bằng rỗng, giờ muốn nó thay thế bằng rỗng nếu không có dữ liệu thì làm ntn bác?

    À còn nhiều mục tôi chưa bẫy lỗi kỹ. Bạn dùng file đính kèm bên dưới đã cập nhật.
    Tôi đang tinh chỉnh xem có tăng tốc được chút nào không chứ dùng vòng lặp trong Word chạy chậm thật.

  10. hands says:

    Có thể do chọn trường làm tên file lưu đó (mục 4). Tên file không được quá 255 ký tự.

    À còn nhiều mục tôi chưa bẫy lỗi kỹ. Bạn dùng file đính kèm bên dưới đã cập nhật.
    Tôi đang tinh chỉnh xem có tăng tốc được chút nào không chứ dùng vòng lặp trong Word chạy chậm thật.

    Sub TaoDongTieuDe1()
        Dim arrTieuDe As Variant
        Dim rngTieuDe As Range
        Dim sTit As String, s As String, i As Long
    
    sTit = "T" & ChrW(7841) & "o d" & ChrW(242) & "ng ti" & ChrW(234) & "u " & ChrW(273) & ChrW(7873)
        s = vbNewLine & "Qu" & ChrW(233) & "t ch" & ChrW(7885) & "n d" & ChrW(242) & "ng Ti" & ChrW(234) & "u " & ChrW(273) & ChrW(7873) & " " & ChrW(273) & ChrW(7875) & " th" & ChrW(234) & "m d" & ChrW(7845) & "u ngo" & ChrW(7863) & "c vu" & ChrW(244) & "ng [...]." & vbNewLine & vbNewLine
    
    On Error Resume Next
        Set rngTieuDe = Application.InputBox(Prompt:=s, Title:=sTit, Type:=8)
        On Error GoTo 0
    
    If rngTieuDe Is Nothing Then Exit Sub
    
    ReDim arrTieuDe(1 To rngTieuDe.Columns.Count)
    
    For i = 1 To rngTieuDe.Columns.Count
            arrTieuDe(i) = "[" & rngTieuDe.Cells(1, i).Value & "]"
        Next
    
    rngTieuDe.Value = arrTieuDe
    End Sub

    Mình có sửa cái đoạn tạo dòng tiêu đề, để khi hiện hộp thoại thì nhấn esc không bị lỗi vì không chọn dải ô cần tạo.
    Thấy file của bạn rất ổn rồi. Tốc độ thì mình thấy khá ok rồi.

    Đây là lỗi do tôi chưa sửa 1 dòng code sai trong việc đếm dòng.
    Bạn tải lại file đính kèm và test xem còn sai cái gì nữa không nhé.

Leave a Reply

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

Quảng cáo

Cũ vẫn chất

Xem thêm