如何基于Excel數據創建Word文檔?
如何基于Excel數據創建Word文檔?

問:Excel擅長數據分析和處理,而Word擅長制作精美的報告。如果將兩者結合起來,在Word中獲取Excel數據來制作報表文檔,那一定非常酷!通常,我們首先在Excel中分析和處理好數據,然后將結果導出到Word中,通過排版制作出一份有價值的精美文檔。那么,如何使用VBA將Excel數據自動放置在Word文檔中呢?
答:我們先談談實現思路,然后以不同情形下的實例來說明。
技術路線
1. 創建Word模板,用來作為數據分析結果的發布平臺。在Word模板中,在每個插入點處定義書簽。當然,對于只導入一兩個數據表來說,這一步可選。
2. 使用VBA,將Excel中的數據復制到Word文檔,從而形成一份報表文檔。
示例1:將Excel數據區域自動復制到Word文檔
如下圖所示,需要將工作表Data中單元格區域A1:E8的數據自動導出到Word文檔中。
第1步:創建一份名為PasteTable.docx的Word文檔,然后在想要粘貼數據的位置插入一個名為DataTable的書簽。關閉該文檔并將其與Excel文檔放在相同的目錄中。
第2步:在Excel VBE中,創建對MicrosoftWord Object Library的引用。
選擇“工具——引用”,在引用對話框中,選擇“Microsoft Word ×.0 Object Library”。
第3步:輸入下面的代碼
Sub PasteExcelTableIntoWord()
Dim MyRange As Excel.Range
Dim wd As Word.Application
Dim wdDoc As Word.Document
Dim WdRange As Word.Range
‘復制區域
Set MyRange =Sheets(“Data”).Range(“A1:E8”)
MyRange.Copy
‘打開Word文檔
Set wd = New Word.Application
Set wdDoc =wd.Documents.Open(ThisWorkbook.Path & “\PasteTable.docx”)
wd.Visible = True
‘將光標移至書簽位置
Set WdRange =wdDoc.Bookmarks(“DataTable”).Range
‘刪除舊表格粘貼新表格
On Error Resume Next
WdRange.Tables(1).Delete
WdRange.Paste
‘調整列寬
WdRange.Tables(1).Columns.SetWidth _
(MyRange.Width / MyRange.Columns.Count),wdAdjustSameWidth
‘重新插入書簽
wdDoc.Bookmarks.Add “DataTable”,WdRange
‘內存清理
Set wd = Nothing
Set wdDoc = Nothing
Set WdRange = Nothing
End Sub
說明:
1. 代碼中設置要復制的區域時,使用了硬編碼,我們可以根據實際進行調整。
2. 當復制Excel數據表到Word中時,表格太寬往往導致格式問題,代碼中對表格列寬進行了調整。這是調整表格列寬的技巧,即每列的寬度設置為表格的總寬度除以表格列數。
3. 當粘貼數據到書簽位置時,會覆蓋書簽。因此,代碼重新創建書簽,以確保下次運行代碼時書簽仍在。
示例2:將多個Excel數據區域復制到Word文檔
有時,需要將多個數據區域復制到Word文檔,并且這些數據區域大小不同。例如,在工作表Data中有兩個大小不一的數據區域,要將這兩個區域分別復制到同一個Word文檔中形成報表文檔。
第1步:創建一份名為PasteTable.docx的Word文檔,并在想要粘貼數據的位置分別插入名為DataTable1、DataTable2的書簽。關閉該文檔并將其與Excel文檔放在相同的目錄中。
第2步:將單元格區域A1:E8命名為“rang1”,單元格區域A11:F15命名為“rang2”。
第3步:在Excel VBE中,創建對MicrosoftWord Object Library的引用。
選擇“工具——引用”,在引用對話框中,選擇“Microsoft Word ×.0 Object Library”。
第4步:輸入下面的代碼
Sub PasteExcelTableIntoWord()
Dim MyRange As Excel.Range
Dim wd As Word.Application
Dim wdDoc As Word.Document
Dim WdRange As Word.Range
Dim i As Long
‘打開Word文檔
Set wd = New Word.Application
Set wdDoc =wd.Documents.Open(ThisWorkbook.Path & “\PasteTable.docx”)
wd.Visible = True
On Error Resume Next
For i = 1 To 2
Set MyRange = Names(“rang”& i).RefersToRange
MyRange.Copy
Set WdRange = wdDoc.Bookmarks(“DataTable”& i).Range
WdRange.Tables(1).Delete
WdRange.Paste
WdRange.Tables(1).Columns.SetWidth _
(450 / MyRange.Columns.Count),wdAdjustNone
wdDoc.Bookmarks.Add”DataTable” & i, WdRange
Next i
‘清空內存
Setwd = Nothing
Set wdDoc = Nothing
Set WdRange = Nothing
End Sub
說明:
1. 此方法比較“笨”。因為在Excel中有多少表,就要命名多少個區域,然后在Word中就要建立相應數量的書簽。
2. 由于表格大小不一,因此粘貼到Word中時,如果表格太寬,會伸出到Word頁面之外。因此,在設置表格尺寸時,使用了一個固定尺寸來除以表格列數得到表格中每列的寬度,并自動調節。
3. 更改書簽的文本信息后,會刪除該書簽。因此為了使代碼重復運行,在粘貼數據表后,會重新插入書簽。
示例3:復制工作表中的數據到Word文檔
仍然使用上兩例中的數據,只是在Word中沒有使用書簽,而是直接將Excel數據復制到Word文檔的末尾。
代碼如下:
Sub CopyTableToWordDocument()
Dim wdApp As Word.Application
‘要復制的區域
ThisWorkbook.Sheets(“Data”).Range(“A1:E8”).Copy
‘建立與Word的連接
Set wdApp = New Word.Application
With wdApp
‘打開Word文檔
.Documents.OpenFilename:=ThisWorkbook.Path & “\Table.docx”
With .Selection
‘到文檔末尾,添加新段落
.EndKey Unit:=wdStory
.TypeParagraph
.Paste
End With
.ActiveDocument.Save
‘退出Word
.Quit
End With
Set wdApp = Nothing
End Sub
示例4:使用Excel數據填充到Word書簽位置
如下圖所示的工作表,其中A2:B4命名為“rngBookmarkList”。
Word文檔模板Bookmarks.dot,含有三個書簽。
在Excel中運行代碼后,書簽位置的文本被取代。
Excel VBE中的代碼如下:
Sub PopulateWordDoc1()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Dim sPath As String
Dim vaBookmarks As Variant
Dim lBookmark As Long
‘使用工作表數據填充書簽數組
vaBookmarks = wksBookmarks.Range(“rngBookmarkList”).Value
‘開啟Word
Set wrdApp =CreateObject(“Word.Application”)
‘打開模板準備填充
sPath = ThisWorkbook.Path &”\”
Set wrdDoc =wrdApp.Documents.Add(Template:=sPath & “Bookmarks.dot”)
‘使用數組中的數據填充模板中的書簽
For lBookmark = LBound(vaBookmarks, 1) ToUBound(vaBookmarks, 1)
wrdDoc.Bookmarks(vaBookmarks(lBookmark,LBound(vaBookmarks, 2))).Range.Text = vaBookmarks(lBookmark,UBound(vaBookmarks, 2))
Next
‘保存被填充的文檔并關閉
wrdDoc.SaveAs sPath &”Filled1.doc”
wrdDoc.Close
Set wrdDoc = Nothing
‘關閉Word
wrdApp.Quit False
Set wrdApp = Nothing
End Sub
示例5
:使用Excel中的數據分析結果生成不同的Word報告
如下圖所示,在工作表中有很多數據,并使用數據透視表來分析這些數據。現在,要生成3份Word文檔,分別報告Central、East、West這三個部門的業績。
在工作表中,定義了一個名為rngBookMarks的書簽區域I20:J22,與Word模板中的書簽相對應。將單元格J20命名為ptrDivName,在程序中更新該單元格的內容。并且,該單元格內容更新后,使用VLookup函數來更新單元格J21和J22中的內容。
創建一個Word模板,在報告中需要更改的3個位置分別定義3個書簽,如下圖所示,書簽與Excel單元格中的內容相一致。
運行代碼后,每基于Word模板生成一份文檔,都會修改模板中相應書簽位置的內容,以生成具體的文檔。
代碼如下:
SubWordGenerateDivisionSummaries()
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Dim wrdrngBM As Word.Range
Dim piDiv As Excel.PivotItem
Dim rngBookmark As Excel.Range
Dim sPath As String
Dim sBookmarkName As String
On Error GoTo ErrorHandler
‘開啟Word
Set wrdApp =CreateObject(“Word.Application”)
sPath = ThisWorkbook.Path &”\”
‘基于模板創建新的文檔
Set wrdDoc =wrdApp.Documents.Add(Template:=sPath & “SalaryReport.dot”)
‘遍歷數據透視表中的每個部門
For Each piDiv InwksData.PivotTables(1).PivotFields(“Division”).PivotItems
‘填充部門名單元格
wksData.Range(“ptrDivName”) =piDiv.Value
‘重新計算工作表來更新部門的結果
wksData.Calculate
‘從工作表中取數據填充模板中的書簽
For Each rngBookmark InwksData.Range(“rngBookmarks”).Rows
‘獲取書簽名
sBookmarkName =rngBookmark.Cells(1, 1).Value
‘獲取書簽跨越的Word區域
Set wrdrngBM =wrdDoc.Bookmarks(sBookmarkName).Range
‘設置區域中的文本(這將刪除書簽)
wrdrngBM.Text =rngBookmark.Cells(1, 2).Text
‘重新創建書簽以便下次循環
wrdDoc.Bookmarks.Add sBookmarkName,wrdrngBM
Next rngBookmark
‘更新可能與書簽相鏈接的字段
wrdDoc.Fields.Update
‘保存填充的文檔
wrdDoc.SaveAs sPath & “SalaryResults – ” & piDiv.Value & “.doc”
Next piDiv
‘關閉Word文檔
wrdDoc.Close
Set wrdDoc = Nothing
‘關閉Word
wrdApp.Quit False
Set wrdApp = Nothing
MsgBox “Division Summaries GeneratedOK.”
Exit Sub
ErrorHandler:
‘顯示錯誤號和錯誤描述
‘并且在標題欄中注明程序
MsgBox “Error ” & Err.Number& vbLf & Err.Description, _
vbCritical, “Routine:WordGenerateDivisionSummaries”
End Sub
附:Word對象簡介
Application
Word應用程序本身,通過該對象創建、打開和保存Word文檔。
Document
Word文檔對象
Bookmark
書簽,包含在Document、Bookmarks集合中。要在書簽位置放置內容,只須指定其Range屬性的文本內容。若更改了書簽的文本內容,則刪除該書簽。
Range
文檔中某段連續區域。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。