Các macro hữu ích trong việc dùng Excel điều khiển Word

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,762
Được thích
5,717
Donate (Momo)
Donate
Giới tính
Nam
Một lượt dạo qua cuốn sách Lập trình VBA cho MS Word vừa giới thiệu, tôi thấy từ môi trường Word lập trình VBA để điều khiển nó thì tính ứng dụng không cao khi mọi thứ gần như đã nhập và thiết đặt thủ công cả rồi. Tuy nhiên, đứng từ môi trường Excel thì lại khác. Nếu biết cách ứng biến trong trang văn bản Word thì từ dữ liệu đã qua Excel xử lý, ta có thể ghi dữ liệu sang Word, căn chỉnh nó thành 1 văn bản hoàn chỉnh rồi lưu trữ, in ấn 1 cách dễ dàng. Thậm chí có thể cập nhật tài liệu đã lưu trữ nếu dữ liệu Excel thay đổi.

Theo ý định đó, từ sách tôi cóp nhặt ra được một số mã VBA hữu ích chuyển nó sang chạy ở Excel làm thư viện để điều khiển Word cho những ai cần. Để dùng các macro khi muốn mở rộng, cần lưu ý:
1. Trong code tôi mới chỉ dùng phương thức GetObject để điều khiển tài liệu Word đã mở sẵn. Bạn có thể dùng CreateObject để mở 1 cửa sổ Word mới nếu trước đó chưa có cửa sổ nào mở.
2. Nếu đã đăng ký thư viện tham chiếu MS Word từ cửa sổ VBA -> Tools/References thì bạn có thể thoải mái dùng các hằng theo tên (bắt đầu bằng wd) của Word. Còn không thì bạn buộc phải tra giá trị của hằng trong Object Browser để thay vào tên hằng trong mã VBA nếu không muốn gặp lỗi. Để đơn giản cho mọi người thì tôi đã thay cả rồi và kèm theo 1 bảng tra ConstVBAWord để dùng sau này khi cần.
3. Cần tận dụng các hộp thoại dựng sẵn của Word khi viết mã. Ví dụ khi căn lề trang, thay vì ghi macro ra kiểu thế này để chạy:
Rich (BB code):
Sub Macro1()
    With ActiveDocument.PageSetup
        .Orientation = wdOrientPortrait
        .TopMargin = InchesToPoints(1)
        .BottomMargin = InchesToPoints(0.9)
        .LeftMargin = InchesToPoints(1)
        .RightMargin = InchesToPoints(0.7)
        .PageWidth = InchesToPoints(8.27)
        .PageHeight = InchesToPoints(11.69)
    End With
End Sub
làm cho Word phải ì ạch thực thi từng dòng, thì bạn dùng hôp thoại wdDialogFilePageSetup như sau:
Rich (BB code):
Sub DialogPageSetup()
    With Application.Dialogs(wdDialogFilePageSetup)
        .TopMargin = 1 & Chr$(34)
        .BottomMargin = 0.9 & Chr$(34)
        .LeftMargin = 1 & Chr$(34)
        .RightMargin = 0.7 & Chr$(34)
        .PageWidth = 8.27 & Chr$(34)
        .PageHeight = 11.69 & Chr$(34)
        .Execute
    End With
End Sub
Word chỉ phải thực thi 1 lần qua câu lệnh .Execute dưới cùng. Trong file kèm tôi cũng đã có sheet Buil-inDialogsWord liệt kê các hộp thoại của Word để dùng khi hữu sự.
4. Ngoài ra tôi còn đính kèm 1 file bảng kê macro được lập ra theo cách mà sách đã chỉ và đồng thời cũng dùng nó để test các macro luôn. Một số macro có ở đây nhưng tôi không chuyển sang Excel vì thấy không cần thiết.
5. Cuối cùng, không giống như Excel, ta có thể Undo thoải mái sau khi chạy 1 macro Word miễn là không quá số lần giới hạn.

Cập nhật file VBA_Word_CanThiet.xlsm: Xem trong file và code tại Module 2 sẽ thấy có cách hiện nút chạy macro mới, cách viết mã và xóa mã VBA trong module.
 

File đính kèm

  • MacroVBA_Word.rar
    106.7 KB · Đọc: 56
  • VBA_Word_CanThiet.xlsm
    209.2 KB · Đọc: 28
Lần chỉnh sửa cuối:
Tôi dùng Word ít cần đến Macro lắm.
Nếu cần nhiều thì tôi tự đặt lại câu hỏi cho mình: có cách nào dùng ít macro hơn không? Nếu không thì tìm về mấy thằng gu-ru Word mà học lại.
 
Upvote 0
Tôi dùng Word ít cần đến Macro lắm.
Nếu cần nhiều thì tôi tự đặt lại câu hỏi cho mình: có cách nào dùng ít macro hơn không? Nếu không thì tìm về mấy thằng gu-ru Word mà học lại.
Dùng Word thì không cần dùng đến macro, trừ những ai làm những việc thường xuyên với các file Word lớn như luận án, luận văn chẳng hạn. Do đó tôi đâu quan tâm đến VBA Word. Tuy nhiên đến 1 ngày có 1 người bạn nhờ chuyển những văn bản + mẫu biểu (đã được người khác thiết kế sẵn trên Excel) qua Word, thế là VBA mới có đất dụng võ.
 
Upvote 0
Một lượt dạo qua cuốn sách Lập trình VBA cho MS Word vừa giới thiệu, tôi thấy từ môi trường Word lập trình VBA để điều khiển nó thì tính ứng dụng không cao khi mọi thứ gần như đã nhập và thiết đặt thủ công cả rồi. Tuy nhiên, đứng từ môi trường Excel thì lại khác. Nếu biết cách ứng biến trong trang văn bản Word thì từ dữ liệu đã qua Excel xử lý, ta có thể ghi dữ liệu sang Word, căn chỉnh nó thành 1 văn bản hoàn chỉnh rồi lưu trữ, in ấn 1 cách dễ dàng. Thậm chí có thể cập nhật tài liệu đã lưu trữ nếu dữ liệu Excel thay đổi.

Theo ý định đó, từ sách tôi cóp nhặt ra được một số mã VBA hữu ích chuyển nó sang chạy ở Excel làm thư viện để điều khiển Word cho những ai cần. Để dùng các macro khi muốn mở rộng, cần lưu ý:
1. Trong code tôi mới chỉ dùng phương thức GetObject để điều khiển tài liệu Word đã mở sẵn. Bạn có thể dùng CreateObject để mở 1 cửa sổ Word mới nếu trước đó chưa có cửa sổ nào mở.
2. Nếu đã đăng ký thư viện tham chiếu MS Word từ cửa sổ VBA -> Tools/References thì bạn có thể thoải mái dùng các hằng theo tên (bắt đầu bằng wd) của Word. Còn không thì bạn buộc phải tra giá trị của hằng trong Object Browser để thay vào tên hằng trong mã VBA nếu không muốn gặp lỗi. Để đơn giản cho mọi người thì tôi đã thay cả rồi và kèm theo 1 bảng tra ConstVBAWord để dùng sau này khi cần.
3. Cần tận dụng các hộp thoại dựng sẵn của Word khi viết mã. Ví dụ khi căn lề trang, thay vì ghi macro ra kiểu thế này để chạy:
Rich (BB code):
Sub Macro1()
    With ActiveDocument.PageSetup
        .Orientation = wdOrientPortrait
        .TopMargin = InchesToPoints(1)
        .BottomMargin = InchesToPoints(0.9)
        .LeftMargin = InchesToPoints(1)
        .RightMargin = InchesToPoints(0.7)
        .PageWidth = InchesToPoints(8.27)
        .PageHeight = InchesToPoints(11.69)
    End With
End Sub
làm cho Word phải ì ạch thực thi từng dòng, thì bạn dùng hôp thoại wdDialogFilePageSetup như sau:
Rich (BB code):
Sub DialogPageSetup()
    With Application.Dialogs(wdDialogFilePageSetup)
        .TopMargin = 1 & Chr$(34)
        .BottomMargin = 0.9 & Chr$(34)
        .LeftMargin = 1 & Chr$(34)
        .RightMargin = 0.7 & Chr$(34)
        .PageWidth = 8.27 & Chr$(34)
        .PageHeight = 11.69 & Chr$(34)
        .Execute
    End With
End Sub
Word chỉ phải thực thi 1 lần qua câu lệnh .Execute dưới cùng. Trong file kèm tôi cũng đã có sheet Buil-inDialogsWord liệt kê các hộp thoại của Word để dùng khi hữu sự.
4. Ngoài ra tôi còn đính kèm 1 file bảng kê macro được lập ra theo cách mà sách đã chỉ và đồng thời cũng dùng nó để test các macro luôn. Một số macro có ở đây nhưng tôi không chuyển sang Excel vì thấy không cần thiết.
5. Cuối cùng, không giống như Excel, ta có thể Undo thoải mái sau khi chạy 1 macro Word miễn là không quá số lần giới hạn.
Nếu bây giờ file word muốn chèn con dấu, là hình ảnh .png trong một folder của máy. Đường link con dấu có sẵn trên excel, vào một vị trí tùy chọn trên word, thì cách nào là phù hợp vậy bác @Maika8008 (Thực ra cái chính là em muốn hỏi cách chèn hình ảnh vào vị trí nào đó trên word chứ không hỏi cách duyệt file ảnh trong folder). Chủ đề của anh @ongke0711 có nói tới vấn đề này bằng cách chèn table và replace, em chưa tìm hiểu kỹ nhưng em muốn kiểm soát thêm độ rộng và chiều cao của con dấu để không bị nhảy qua trang khác. Bác cho em ý kiến với ạ!
 
Upvote 0
Nếu bây giờ file word muốn chèn con dấu, là hình ảnh .png trong một folder của máy. Đường link con dấu có sẵn trên excel, vào một vị trí tùy chọn trên word, thì cách nào là phù hợp vậy bác @Maika8008 (Thực ra cái chính là em muốn hỏi cách chèn hình ảnh vào vị trí nào đó trên word chứ không hỏi cách duyệt file ảnh trong folder). Chủ đề của anh @ongke0711 có nói tới vấn đề này bằng cách chèn table và replace, em chưa tìm hiểu kỹ nhưng em muốn kiểm soát thêm độ rộng và chiều cao của con dấu để không bị nhảy qua trang khác. Bác cho em ý kiến với ạ!
Tùy vào việc bạn nghĩ vị trí tùy chọn ấy như thế nào. Nếu thiết kế sẵn thì có thể chèn nó vào 1 bookmark hoặc 1 ô của bảng. Tôi thấy thường thì trong văn bản người ta hay dùng bảng để chứa các tiêu đề đầu hoặc cuối để dễ bố trí trên trang. Do vậy tìm đúng index của bảng rồi chèn. Còn không thiết kế sẵn thì tìm 1 cụm từ nào đó làm điểm mốc để bố trí điểm chèn, hoặc tìm vị trí cuối trang rồi tính ngược lên làm điểm chèn, hoặc xác định tọa độ x,y để chèn...

Còn kiểm soát độ lớn của của shape trong mối tương quan với trang layout thì tôi chưa nghĩ đến, nhưng nếu bám vào các macro hữu ích kia thì chắc sẽ làm được
 
Upvote 0
Tùy vào việc bạn nghĩ vị trí tùy chọn ấy như thế nào. Nếu thiết kế sẵn thì có thể chèn nó vào 1 bookmark hoặc 1 ô của bảng. Tôi thấy thường thì trong văn bản người ta hay dùng bảng để chứa các tiêu đề đầu hoặc cuối để dễ bố trí trên trang. Do vậy tìm đúng index của bảng rồi chèn. Còn không thiết kế sẵn thì tìm 1 cụm từ nào đó làm điểm mốc để bố trí điểm chèn, hoặc tìm vị trí cuối trang rồi tính ngược lên làm điểm chèn...
File là do mình tự tạo để chèn, do vậy thiết kế kiểu nào cũng được bác ạ. Em có một form word mẫu, và muốn thay đổi con dấu theo dữ liệu excel (cho nhiều file, cứ mỗi dòng trong excel là gọi form lên, chèn con dấu, lưu và đóng). Hình ảnh con dấu không phải cái nào cũng kích thước như nhau, vì thế em đang muốn kiểm soát độ rộng/chiều cao để nó không nhảy sang trang khác (Vì con dấu nằm cuối trang, em để dư một khoảng nhất định nhưng nếu nó hơi bự thì bị nhảy trang). Nếu bác có sẵn file nào đã code rồi thì cho em xin tham khảo với, em cũng đang google để tìm hiểu thêm, vì code word khá mới mẻ với em, ít khi đụng tới lắm bác ạ!
 
Upvote 0
File là do mình tự tạo để chèn, do vậy thiết kế kiểu nào cũng được bác ạ. Em có một form word mẫu, và muốn thay đổi con dấu theo dữ liệu excel (cho nhiều file, cứ mỗi dòng trong excel là gọi form lên, chèn con dấu, lưu và đóng). Hình ảnh con dấu không phải cái nào cũng kích thước như nhau, vì thế em đang muốn kiểm soát độ rộng/chiều cao để nó không nhảy sang trang khác (Vì con dấu nằm cuối trang, em để dư một khoảng nhất định nhưng nếu nó hơi bự thì bị nhảy trang). Nếu bác có sẵn file nào đã code rồi thì cho em xin tham khảo với, em cũng đang google để tìm hiểu thêm, vì code word khá mới mẻ với em, ít khi đụng tới lắm bác ạ!
Tôi không có code nào sẵn cho việc đó, nhưng tôi nghĩ rằng sau khi chèn bạn định lại kích thước dấu cho bằng với con dấu nhỏ nhất là được.
 
Upvote 0
Tôi không có code nào sẵn cho việc đó, nhưng tôi nghĩ rằng sau khi chèn bạn định lại kích thước dấu cho bằng với con dấu nhỏ nhất là được.
Vâng bác, em sẽ tìm hiểu thêm vấn đề này. Cảm ơn thông tin chia sẻ của bác!
 
Upvote 0
... bằng cách chèn table và replace, em chưa tìm hiểu kỹ nhưng em muốn kiểm soát thêm độ rộng và chiều cao của con dấu để không bị nhảy qua trang khác.

Khi bạn dùng Table (1 cell) thì bạn đã khống chế được độ rộng và chiều cao của nó khi thiết kế rồi. Khi đó hình ảnh kích thước nào cũng tự resize cho vừa kích thước Cell đã thiết kế.
 
Upvote 0
Khi bạn dùng Table (1 cell) thì bạn đã khống chế được độ rộng và chiều cao của nó khi thiết kế rồi. Khi đó hình ảnh kích thước nào cũng tự resize cho vừa kích thước Cell đã thiết kế.
Cảm ơn anh đã cho ý kiến. Code trong addins của anh em cũng chưa đọc hiểu hết, em sẽ nghiên cứu thêm phần này. Do em tự tạo table và chèn ảnh thủ công thì em thấy table cũng tự resize kích thước theo ảnh em chèn vào
 
Upvote 0
Cảm ơn anh đã cho ý kiến. Code trong addins của anh em cũng chưa đọc hiểu hết, em sẽ nghiên cứu thêm phần này. Do em tự tạo table và chèn ảnh thủ công thì em thấy table cũng tự resize kích thước theo ảnh em chèn vào
Bạn thiết kế theo hình. Khi đó Table sẽ không tự resize mà file ảnh sẽ tự resize. Nhưng bạn cũng chú ý sự tương quan giữa tỉ lệ ảnh, table sẽ giữ tỉ lệ ảnh không đổi dẫn đến có thể table sẽ tăng chiều cao để tương đương tỉ lệ với độ rộng mà bạn thiết kế (không bị biến dạng ảnh)

Screen Shot 2023-05-10 at 14.12.45.png
 
Upvote 0
Kinh ngh
Dùng Word thì không cần dùng đến macro, trừ những ai làm những việc thường xuyên với các file Word lớn như luận án, luận văn chẳng hạn. Do đó tôi đâu quan tâm đến VBA Word. Tuy nhiên đến 1 ngày có 1 người bạn nhờ chuyển những văn bản + mẫu biểu (đã được người khác thiết kế sẵn trên Excel) qua Word, thế là VBA mới có đất dụng võ.
Kinh nghiệm cho biết mấy người đi từ Excel qua Word thường bỏ bê không tha thiết với các thao tác trên Word.
Tương tự như bạn lý luận, họ cũng nói rằng "bất cứ cái gì họ cũng có thể dùng VBA (từ Excel) để điều khiển.
File lớn như sách vở (ngàn trang) luận án (200-400 trang) tôi vẫn hiếm dùng Macro. Hầu hết là để tác dụng phím tắt và Find/Replace Regex.
Theo tôi tables mà dùng VBA dựng thì xấu bỏ bố. Và tôi để ý các bạn trẻ bây giờ không biết sử dụng table trong Word, học dựng 1 cái table pâu gấp 5-10 lần tôi, và kết quả vẫn không vững. 100 người sử dụng Word không biết Style là cái gì, khoan nói đến việc sử dụng.
 
Upvote 0
Kinh ngh

Kinh nghiệm cho biết mấy người đi từ Excel qua Word thường bỏ bê không tha thiết với các thao tác trên Word.
Tương tự như bạn lý luận, họ cũng nói rằng "bất cứ cái gì họ cũng có thể dùng VBA (từ Excel) để điều khiển.
File lớn như sách vở (ngàn trang) luận án (200-400 trang) tôi vẫn hiếm dùng Macro. Hầu hết là để tác dụng phím tắt và Find/Replace Regex.
Theo tôi tables mà dùng VBA dựng thì xấu bỏ bố. Và tôi để ý các bạn trẻ bây giờ không biết sử dụng table trong Word, học dựng 1 cái table pâu gấp 5-10 lần tôi, và kết quả vẫn không vững. 100 người sử dụng Word không biết Style là cái gì, khoan nói đến việc sử dụng.
Tôi thì biết style nhưng dùng không thuần thục, ví dụ làm sao buộc style đã chỉnh sửa sẽ áp dụng được cho các tài liệu mở sau đó.

Còn chuyện làm việc thường xuyên với file lớn thì dùng macro để tạo các cấp heading để từ đó tạo mục lục vẫn hiệu quả mà bác.
Bài đã được tự động gộp:

Vâng bác, em sẽ tìm hiểu thêm vấn đề này. Cảm ơn thông tin chia sẻ của bác!
Tôi có 1 ví dụ cho bạn: chèn con dấu chứng nhận không sợ vợ --=0 vào table số 1 và chỉnh lại kích thước cho nó.
 

File đính kèm

  • InsertPitureIntoTable.xlsm
    15.9 KB · Đọc: 12
  • Example.docx
    12.6 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Tôi thì biết style nhưng dùng không thuần thục, ví dụ làm sao buộc style đã chỉnh sửa sẽ áp dụng được cho các tài liệu mở sau đó.

Còn chuyện làm việc thường xuyên với file lớn thì dùng macro để tạo các cấp heading để từ đó tạo mục lục vẫn hiệu quả mà bác.
Bài đã được tự động gộp:


Tôi có 1 ví dụ cho bạn: chèn con dấu chứng nhận không sợ vợ --=0 vào table số 1 và chỉnh lại kích thước cho nó.
Em lấy một hình ảnh con dấu thay thế, kết quả chạy code nó như thế này bác ạ:
1683709326836.png
 
Upvote 0
Upvote 0
Cập nhật một số lệnh điều khiển Word đơn giản và viết mã, xóa mã VBA trong module: File Excel đính kèm

Thiết lập để chèn và viết lên module: Options -> Trust Center -> Trust Center Settings... -> Macro Settings -> chọn Trust access to the VBA project object model
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom