Trong bài viết này, Học Excel Online sẽ hướng dẫn bạn cách sao chép và dán bảng dữ liệu đơn lẻ từ Excel vào Word thông qua VBA. Thông qua các kiến thức nền tảng có được từ bài viết này, bạn hoàn toàn có thể tự tạo ra các mã lệnh VBA riêng để phục vụ cho từng mục đích sử dụng cá nhân cụ thể.
Mã lệnh VBA được sử dụng
Sub ExcelRangeToWord()
‘PURPOSE: Copy/Paste An Excel Table Into a New Word Document
‘NOTE: Must have Word Object Library Active in Order to Run _
(VBE > Tools > References > Microsoft Word 12.0 Object Library)
‘SOURCE: www.TheSpreadsheetGuru.com
Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table
‘Optimize Code
Application.ScreenUpdating = False
Application.EnableEvents = False
‘Copy Range from Excel
Set tbl = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects(“Table1”).Range
‘Create an Instance of MS Word
On Error Resume Next
‘Is MS Word already opened?
Set WordApp = GetObject(class:=”Word.Application”)
‘Clear the error between errors
Err.Clear
‘If MS Word is not already open then open MS Word
If WordApp Is Nothing Then Set WordApp = CreateObject(class:=”Word.Application”)
‘Handle if the Word Application is not found
If Err.Number = 429 Then
MsgBox “Microsoft Word could not be found, aborting.”
GoTo EndRoutine
End If
On Error GoTo 0
‘Make MS Word Visible and Active
WordApp.Visible = True
WordApp.Activate
‘Create a New Document
Set myDoc = WordApp.Documents.Add
‘Copy Excel Table Range
tbl.Copy
‘Paste Table into MS Word
myDoc.Paragraphs(1).Range.PasteExcelTable _
LinkedToExcel:=False, _
WordFormatting:=False, _
RTF:=False
‘Autofit Table so it fits inside Word Document
Set WordTable = myDoc.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)
EndRoutine:
‘Optimize Code
Application.ScreenUpdating = True
Application.EnableEvents = True
‘Clear The Clipboard
Application.CutCopyMode = False
End Sub
Thiết lập sao cho Excel hiểu được ngôn ngữ soạn thảo của Word
Để có thể điều khiển được Word ngay từ cửa sổ Visual Basic Editor trong Excel, ta cần phải thiết lập để Excel có thể hiểu được ngôn ngữ soạn thảo trong Word. Danh sách các thuật ngữ được dùng trong Word có những từ chẳng hạn như “Document” hoặc “Paragraph”, đều là những thuật ngữ mà Excel không thể giải mã được. Để khởi động thư viện mặc định của Word, hãy click vào thanh tác vụ Tools trong cửa sổ Visual Basic Editor, chọn Reference. Lưu ý phải chọn hộp kiểm tham chiếu “Microsoft Office Word 12.0 Object Library”. Dưới đây là ảnh minh họa:
Cách khởi động cửa sổ soạn thảo Word ngay từ trong Excel
Sau khi hướng dẫn Excel cách để giải mã được ngôn ngữ của Word, bây giờ ta sẽ tìm cách để sao chép nội dung một bảng dữ liệu đơn giản từ Excel vào trong Word. Hãy chú ý vào phần đầu của đoạn mã lệnh VBA ở phần đầu bài viết, có một đoạn mã như sau:
‘Create an Instance of MS Word
On Error Resume Next
‘Is MS Word already opened?
Set WordApp = GetObject(class:=”Word.Application”)
‘Clear the error between errors
Err.Clear
‘If MS Word is not already open then open MS Word
If WordApp Is Nothing Then Set WordApp = CreateObject(class:=”Word.Application”)
‘Handle if the Word Application is not found
If Err.Number = 429 Then
MsgBox “Microsoft Word could not be found, aborting.”
GoTo EndRoutine
End If
On Error GoTo 0
Phần mã lệnh này kiểm soát việc Word có đang hoạt động hay không. Nếu có, ta phải thiết lập giá trị biến số theo toàn bộ chương trình Word, bằng lệnh GetObject. Nếu không, ta sẽ sử dụng lệnh CreateObject để khởi chạy một trang soạn thảo Word và thiết lập biến số theo trang soạn thảo đó.
Khi sử dụng lệnh CreateObject, ứng dụng cần khởi động sẽ được kích hoạt nhưng sẽ chạy dưới nền thay vì xuất hiện trên màn hình. Vì thế, ta cần điều chỉnh mở thiết lập giá trị Visible lên (đặt giá trị là True). Bên cạnh đó, lệnh VBA trong Word hoạt động hơi khác so với trong Excel ở chỗ lệnh sẽ chỉ tương thích với cửa sổ soạn thảo được xuất hiện trên màn hình. Vì vậy, ta cần một đoạn mã lệnh nữa để kích hoạt cửa sổ soạn thảo của Word.
‘Make MS Word Visible and Active
WordApp.Visible = True
WordApp.Activate
Điều khiển Word bằng Excel
Một khi Word được khởi động, bạn có thể bắt đầu quá trình điều khiển Word ngay từ trong Excel rồi. Hãy bắt đầu bằng một lệnh điều khiển để Word mở một trang soạn thảo mới, cũng sẽ là địa chỉ để bạn sao chép nội dung từ Excel sang. Trong quá trình chạy lệnh, lưu ý bạn luôn phải thiết lập biến số từng trang cho từng giai đoạn tạo trang mới, để sau này mỗi lần bạn muốn tham chiếu lại trang soạn thảo nào đó thì có thể sử dụng các biến số được thiết lập ban đầu.
‘Create a New Document
Set myDoc = WordApp.Documents.Add
Sao chép từ Excel và dán vào trang soạn thảo Word
Sau khi tạo được một trang soạn thảo mới, ta có thể sử dụng Excel để ra lệnh sao chép và dán bảng dữ liệu vào trong Word. Ở phần đầu của mã lệnh chính, có một dòng lệnh cho phép bạn ghi rõ tên bảng dữ liệu cần sao chép. Biến số tbl được dùng để ghi nhớ bảng dữ liệu này và sau này bạn có thể dùng nó để tham chiếu lại bảng dữ liệu nếu cần.
Lời khuyên: Tốt nhất đối với những phần mã lệnh cần phải chỉnh sửa thường xuyên trong tương lai, bạn nên đặt chúng ở đầu mỗi hàm thủ tục con. Điều này giúp bạn tiết kiệm thời gian không phải mất công đi lục tìm trong một danh sách dài các chuỗi lệnh cốt chỉ để thay đổi tên bảng dữ liệu bạn muốn sao chép, hoặc tên bảng tính mà bạn muốn trích xuất dữ liệu từ đó ra.
Trong Word, có một lệnh đặc biệt có tên là PasteExcelTable, hiển nhiên mục đích của nó là để dán nội dung bảng dữ liệu từ Excel vào Word. Có 3 biến số bạn cần chú ý đến để khiến bảng dữ liệu của mình khi được sao chép sang sẽ có định dạng đẹp nhất có thể.
Cuối cùng, tùy theo kích cỡ bảng dữ liệu mà có thể khi sao chép lên trang soạn thảo, nó có thể sẽ bị tràn lề. Để tránh vấp phải vấn đề này, bạn có thể sử dụng lệnh AutoFitBehavior để căn chỉnh kích thước của bảng sao cho vừa vặn nằm trong các lề của trang soạn thảo Word.
‘Copy Excel Table Range
tbl.Copy
‘Paste Table into MS Word
myDoc.Paragraphs(1).Range.PasteExcelTable _
LinkedToExcel:=False, _
WordFormatting:=False, _
RTF:=False
‘Autofit Table so it fits inside Word Document
Set WordTable = myDoc.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)