新四季網

vba 將excel 表複製到word(VBA基礎入門)

2023-05-31 16:55:44

截止目前寫了這些課程了:

[VBA][基礎入門] 第1講 常量和變量

[VBA][基礎入門] 第2講 錄製宏

[VBA][基礎入門] 第3講 認識VBA IDE(集成開發環境)

[VBA][基礎入門] 第4講 對象模型

不知道大家是不是按照我的講課順序在認真看和學。

上面只有兩個有連結,是因為不敢違反頭條的連結使用規則。

下面接著上一節的講,儘量緊扣上一節的內容,正確這一節課來個醍醐灌頂。

一、先教你們怎麼看內置對象模型

先嘗試看Word的:

這裡需要用到,也會是你們以後使用VBA常用的部分

Alt F11,F1,F2

對於初學者,看對象模型的起點是從Application開始看,把Application當做頂級對象。

先在F1裡輸入:Application 對象

裡面Application對象下的所有成員分成了三類:

方法、屬性、事件

先過一下,大概了解有哪些成員,對於一眼看去就特別實用,或者你比較感興趣的方法,就點進去看一眼再返回來。重點是能儘快建立對象樹。

如下是我現整理出來的Documents下的對象樹,包含大部分內容,加粗標註為很常用的對象。

Application

----Documents

--------Range

--------Shapes

--------Bookmarks

--------Characters

--------Comments

--------ContentControls

--------Endnotes

--------Fields

--------Footnotes

--------FormFields

--------Frames

--------Hyperlinks

--------Indexes

--------Inlineshapes

--------Lists

--------OMaths

--------Paragraphs

--------Revisions

--------Sections

--------Sentences

--------Shapes

--------StoryRanges

--------Styles

--------Subdocuments

--------Tables

--------TableOfContents

--------Variables

--------Windows

--------Words

我認為所有這些對象裡,吃透Range對象,就能玩轉WordVBA。

下節課再講Word.Range對象

二、然後再教怎麼在不同程序間交互

兩個文件分別是模板.doc、資料.xlsm

在Word裡讀取Excel:

Enum eIndex 工號 = 1 姓名 = 2 生日 = 3 籍貫 = 4 從業年份 = 5 入職日期 = 6End EnumSub ReadWorkBookDim wdDoc As Word.Document '為什麼這麼聲明,我想我以前講過Dim wdRng As Word.RangeDim xlApp As Excel.Application '為什麼這麼聲明,我想我以前講過Dim xlBook As Excel.WorkbookDim xlSht As Excel.WorksheetDim xlRng As Excel.RangeDim maxRow As LongDim arrDim U& '這個你能回憶起來嗎,雖然我不建議你們用Dim i&Set wdDoc = ThisDocumentOn Error GoTo getError '如果發生錯誤,就去到getError標籤Set xlApp = GetObject(, "Excel.Application") '獲取當前打開的Excel程序,如果報錯,就會去到getError標籤那裡GoTo NextStepgetError: Set xlApp = CreateObject("Excel.Application") '如當前沒有打開的Excel程序,則新建一個 xlApp.Visible = True '調試用,調試完了,可以改成FalseNextStep:On Error Goto 0 '不處理其他錯誤Set xlBook = xlApp.Workbooks.Open(wdDoc.Path & "\資料.xlsm", , True) '打開工作簿Set xlSht = xlBook.Worksheets("資料") '獲取工作表maxRow = xlSht.Range("A" & xlSht.Rows.Count).End(xlUp).Row '獲取最後的非空列號,相當於在A1048576,按Ctrl ↑Set xlRng = xlSht.Range("A2:F" & maxRow) '獲取目標區域arr = xlRngxlBook.Close False 'Excel的任務完成了,關閉且不保存U = UBound(arr, 1)Application.ScreenUpdating = False '關閉當前Word程序屏幕刷新,極大提供效率For i = 1 To U '循環,寫數據到Word的表格1中 With wdDoc.Tables(1) Set wdRng = .Cell(1, 1).Range wdRng.SetRange wdRng.End - 4, wdRng.End - 1 wdRng.Text = arr(i, eIndex.工號) .Cell(2, 2).Range.Text = arr(i, eIndex.姓名) .Cell(3, 2).Range.Text = arr(i, eIndex.生日) .Cell(3, 4).Range.Text = arr(i, eIndex.籍貫) .Cell(4, 2).Range.Text = arr(i, eIndex.從業年份) .Cell(4, 4).Range.Text = arr(i, eIndex.入職日期) If Application.Version >= 14 Then 'Word2010及以上 .Parent.SaveAs2 wdDoc.Path & "\" & arr(i, 工號) & "_" & arr(i, 姓名) & ".doc" Else .Parent.SaveAs wdDoc.Path & "\" & arr(i, 工號) & "_" & arr(i, 姓名) & ".doc" End If End WithNext iApplication.ScreenUpdating = TrueEnd Sub

再看從Excel裡生成Word:

Enum eIndex 工號 = 1 姓名 = 2 生日 = 3 籍貫 = 4 從業年份 = 5 入職日期 = 6End EnumSub WriteDocumentDim wdApp As Word.ApplicationDim wdDoc As Word.DocumentDim wdRng As Word.RangeDim xlBook As WorkbookDim xlSht As WorksheetDim xlRng As Excel.RangeDim maxRow As LongDim arrDim U&Dim i&Set xlBook = ThisWorkbookSet xlSht = xlBook.Worksheets("資料")maxRow = xlSht.Range("A" & xlSht.Rows.Count).End(xlUp).RowSet xlRng = xlSht.Range("A2:F" & maxRow)arr = xlRngU = UBound(arr, 1)On Error GoTo getErrorSet wdApp = GetObject(, "Word.Application") '當前如有Word程序,直接調用GoTo NextStepgetError: Set wdApp = CreateObject("Word.Application") '如沒有,則新建NextStep: wdApp.ScreenUpdating = FalseFor i = 1 To U With wdApp.Documents.Open(xlBook.Path & "\模板.doc") '打開Word模板 With .Tables(1) '往word文檔的表格1裡寫數據 Set wdRng = .Cell(1, 1).Range wdRng.SetRange wdRng.End - 4, wdRng.End - 1 wdRng.Text = arr(i, eIndex.工號) .Cell(2, 2).Range.Text = arr(i, eIndex.姓名) .Cell(3, 2).Range.Text = arr(i, eIndex.生日) .Cell(3, 4).Range.Text = arr(i, eIndex.籍貫) .Cell(4, 2).Range.Text = arr(i, eIndex.從業年份) .Cell(4, 4).Range.Text = arr(i, eIndex.入職日期) End With If wdApp.Version >= 14 Then 'Word2010及以上 .SaveAs2 xlBook.Path & "\" & arr(i, 工號) & "_" & arr(i, 姓名) & ".doc" Else .SaveAs xlBook.Path & "\" & arr(i, 工號) & "_" & arr(i, 姓名) & ".doc" End If .Close True End WithNext iEnd Sub

請大家好好分析一下這兩段代碼,力求全部吃透。

不能吃透的內容本文評論下留言,我會以天為單位統一回復。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了