原文地址php
本文的對象是:有必定Excel VBA基礎,對Word VBA尚未什麼認識,想在Excel中經過VBA操做Word還有困難的人。
1、新建Word引用
須要首先建立一個對 Word Application 對象的引用。在VBA中,工具-引用,選取「MicroSoft Word 11.0 Object Library」。
方法1、New Word.Application
Dim Wordapp As Word.Application
Set Wordapp = NewWord.Application
Wordapp.Visible = True '可見
'Wordapp.ScreenUpdating =False '屏幕刷新
Dim WordD As Word.Document '定義word類
Set WordD = Wordapp.Documents.Add '新建文檔
'Set WordD = Wordapp.Documents.open(filename) '打開文檔
'……
WordD.Close '關閉文檔
Set WordD = Nothing
WordApp.Quit '退出Word對象
方法2、CreateObject
Dim WordApp As Object
Set WordApp =CreateObject("Word.Application") '新建Word對象
‘後續操做及退出同樣……
方法3、GetObject
文件已打開的狀況下,使用:SetWordD=GetObject(filename),可創建對文檔的引用,若是文件沒有打開,則還須要先用方法一或二來操做。
至於方法一和方法二的區別,在網上詢問了一下,大師們的回答是:
方法一:前期綁定,好處是在對象後輸入句點能夠給出快速提示,由於須要先引用對象,因此容易出現版本兼容問題。
方法二:後期綁定,沒有提示,根據運行代碼機器上對象的版本建立對象,兼容性好。
提示:有時兩者有較大區別,可論壇搜索字典對象,建議編寫代碼時使用前期綁定,發佈時使用後期綁定。
2、認識Word的結構
Excel有:
Excel.Application ’Excel引用
Excel.Application. Workbooks ’工做簿
Excel.Application. Workbooks.Sheets(1) ’工做表
工做表下是Range,區域;Cells(row,col),單元格
Word有:
Word.Application
Word.Application.Documents ’文檔
文檔下有字符、單詞、句子、段落和節。字符組成單詞,單詞組成句子,句子組成段落。此外,每一個文檔具備一個包含一個或多個節的 Sections 集合,每個節都有一個包含該節頁眉和頁腳的HeadersFooters 集合。
Characters(index)
Words(index)
Sentences(index)
Paragraphs(index)
Sections(index)
前三個返回Range對象,能直接使用任何區域屬性或方法修改該Range 對象。後面二個返回該集合的單個成員,而不是 Range 對象,不能直接使用區域屬性或方法。以下使用例子:Words(1)後面直接.Copy,而.Paragraphs(1)和.Copy之間多了一個Range。
Selection.Words(1).Copy
ActiveDocument.Paragraphs(1).Range.Copy
Characters:字符,ActiveDocument.Sentences(1).Characters.Count,第一句的字符總數。
Words:單詞,對於英文來講是二個空格之間的字母加空格,對於中文,一個標點符號,一個漢字,或一個詞(按照微軟的輸入法中的詞組定義?)。(感受不是很可靠?)
Sentences:句子,以句號結束?感受也不是一個很可靠的範圍,感受仍是字符、段落、節,控制起來靠譜一些。
Range 對象表示文檔中的一個連續範圍,由一個起始字符位置和一個終止字符位置定義。這個連續範圍能夠小到一個插入點,大到整個文檔。
Dim rngPa As Range
Set rngPa =ActiveDocument. Characters (1) '第一個字符
Set rngPa = ActiveDocument.Range( _
Start:=ActiveDocument.Paragraphs(1).Range.Start, _
End:=ActiveDocument.Paragraphs(4).Range.End) ‘第1段頭到第4段尾
Set rngPa = ActiveDocument.Range(Start:=0,End:=10) ‘當前文檔前10個字符
rngPa.Select
選定,我以爲用處不大,緣由就是爲何要選中呢?能操做就直接操做,不能的話,就選中吧(他能夠說是沒辦法的辦法)。
range對象的賦值:(包括任意的對象,Set是對對象賦值的標準語句)
set a=b
和變量的賦值:a=1不同
第三段:經過錄制宏生成代碼,修改以下:
3、經過錄制宏生成代碼
有了對Word基本結構的認識,想操做這些對象應該使用什麼方法、修改哪些屬性?不知道就「錄製宏」。錄製宏是咱們認識未知對象的很好方法之一,經過宏錄製器將操做譯成Word的 Visual Basic 代碼,再根據須要修改代碼。Word中錄製與Excel不一樣的是,不能使用鼠標移動光標或選中一行,只能使用鍵盤來移動,或用Shift+方向鍵來選中。如下幾句話就是鍵盤的:上、下、左、右、Home、End、Shift+左選中5個字符、Shift+右選中5個字符。
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.HomeKey Unit:=wdLine
Selection.EndKey Unit:=wdLine
Selection.MoveLeft Unit:=wdCharacter, Count:=5, Extend:=wdExtend
Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend
錄製的宏使用 Selection 屬性返回 Selection 對象。即:錄製的宏老是以Selection.開頭的,如上。要想使用這個Selection.,有時候咱們就不得不先對特定的對象.Select,選中。
固然,Selection是一個Range,Characters、Words、Sentences也是Range,Paragraphs(n). Range, Sections(2). Range也是Range,那咱們就能夠將Selection.後面的語句嫁接到前面這些Range以後,就不用先.Select了。
錄製的宏,經過嫁接或者複製到EXCEL VBA以後,有的運行會出錯,此時應檢查如下幾項:
一、第一項中要求的「引用」創建了沒?
二、利用VBA提醒功能檢查語句。VBA編輯過程當中,一般在打下. 以後(須要前期綁定?),該對象全部的方法、屬性都會顯示出來,利用這個特色,能夠檢查錄製的宏,可否嫁接到須要操做的對象以後。提示裏有就能,沒有就不能。
三、部分轉換函數,Word VBA裏有,Excel VBA裏可能沒有,遇到這樣的狀況,也可能出錯。
例:
WordD.Paragraphs(1).Range.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0.35)
Selection.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0.35)是「首行縮進2字符」操做錄製的,嫁接後,運行出錯,按方法2檢查:.ParagraphFormat.FirstLineIndent能用在Range以後,那麼就是CentimetersToPoints(0.35)出問題了?這顯然是一個函數,字面意思是「釐米轉換成點數」,(錄製時我明明輸入的是「2字符」,錄下來咋成了釐米爲單位呢?)那是不是Excel VBA裏沒有這個函數呢?(我不知道),將=後面直接改成數字運行經過,最後試下來=20大約至關於5號字的「首行縮進2字符」。(這個20,就是20Points?0.35cm=20 Points?)
(有人可能會說這樣的辦法太笨,有什麼好辦法請告知。先謝過!)
4、Word vba經常使用語句100句
一、系統參數
(01) Application.ActivePrinter ‘獲取當前打印機
(02) Application.Height '當前應用程序文檔的高度
(03) Application.Width ‘當前應用程序文檔的寬度
(04) Application.Build ‘獲取Word版本號和編譯序號
(05) Application.Caption ‘當前應用程序名
(06) Application.DefaultSaveFormat '返回空字符串,表示Word文檔
(07) Application.DisplayRecentFiles '返回是否顯示最近使用的文檔的狀態
(08) Application.Documents.Count '返回當前打開的文檔數
(09) Application.FontNames.Count ‘返回當前可用的字體數
(10) Application.Left ‘返回當前文檔的水平位置
(11) Application.MacroContainer.FullName '返回當前文檔名,包括所在路徑
Application.MacroContainer.pach '返回當前文檔路徑
Application.ActiveDocument.Path ‘得到文件的相對路徑
(12) Application.NormalTemplate.FullName '返回文檔標準模板名稱及所在位置
(13) Application.RecentFiles.Count '返回最近打開的文檔數目
(14) Application.System.CountryRegion '返回應用程序所在的地區代碼
(15) Application.System.FreeDiskSpace ‘返回應用程序所在磁盤可用空間
(16) Application.System.HorizontalResolution '返回顯示器的水平分辨率
(17) Application.System.VerticalResolution '返回顯示器的垂直分辨率
(18) Application.System.LanguageDesignation '返回系統所使用的語言
(19) Application.System.MathCoprocessorInstalled ‘返回系統是否安裝了數學協處理器
(20) Application.System.OperatingSystem ‘返回當前操做系統名
(21) Application.System.ProcessorType '返回計算機處理器名
(22) Application.System.Version ‘返回操做系統的版本號
(23) Application.Templates.Count '返回應用程序所使用的模板數
(24) Application.UserName '返回應用程序用戶名
(25) Application.Version ‘返回應用程序的版本號
二、Documents/Document對象
(26) ActiveDocument.AttachedTemplate.FullName '返回當前文檔採用的模板名及模板所在位置
(27) ActiveDocument.Bookmarks.Count '返回當前文檔中的書籤數
(28) ActiveDocument.Characters.Count '返回當前文檔的字符數
(29) ActiveDocument.CodeName ‘返回當前文檔的代碼名稱
(30) ActiveDocument.Comments.Count ‘ 返回當前文檔中的評論數
(31) ActiveDocument.Endnotes.Count '返回當前文檔中的尾註數
(32) ActiveDocument.Fields.Count '返回當前文檔中的域數目
(33) ActiveDocument.Footnotes.Count ‘返回當前文檔中的腳註數
(34) ActiveDocument.FullName '返回當前文檔的全名及所在位置
(35) ActiveDocument.HasPassword '當前文檔是否有密碼保護
(36) ActiveDocument.Hyperlinks.Count '返回當前文檔中的連接數
(37) ActiveDocument.Indexes.Count '返回當前文檔中的索引數
(38) ActiveDocument.ListParagraphs.Count '返回當前文檔中項目編號或項目符號數
(39) ActiveDocument.ListTemplates.Count '返回當前文檔中使用的列表模板數
(40) ActiveDocument.Paragraphs.Count '返回當前文檔中的段落數
(41) ActiveDocument.Password=XXX '設置打開文件使用的密碼
(42) ActiveDocument.ReadOnly '獲取當前文檔是否爲只讀屬性
(43) ActiveDocument.Saved '當前文檔是否被保存
(44) ActiveDocument.Sections.Count '當前文檔中的節數
(45) ActiveDocument.Sentences.Count ‘當前文檔中的語句數
(46) ActiveDocument.Shapes.Count '當前文檔中的形狀數 ,圖形?
(47) ActiveDocument.Styles.Count '當前文檔中的樣式數
(48) ActiveDocument.Tables.Count ‘當前文檔中的表格數
(49) ActiveDocument.TablesOfAuthorities.Count ‘返回當前文檔中的引文目錄數
(50) ActiveDocument.TablesOfAuthoritiesCategories.Count ‘返回當前文檔中引文目錄類別數
(51) ActiveDocument.TablesOfContents.Count ‘返回當前文檔中的目錄數
(52) ActiveDocument.TablesOfFigures.Count '返回當前文檔中的圖表目錄數
三、Paragraphs/Paragraph對象
(53) Selection.Paragraphs.Count '返回所選區域的段落數
(54) Selection.Paragraphs.First '返回所選區域中的第一段
(55) ActiveDocument.Paragraphs(1).LeftIndent '返回當前文檔中第一段的左縮進值
(56) ActiveDocument.Paragraphs(1).LineSpacing '返回當前文檔中第一段的行距
(57) ActiveDocument.Paragraphs(1).OutlineLevel ‘返回或設置當前文檔中第一段的大綱級別
.OutlineLevel = wdOutlineLevel2 ‘2級
.OutlineLevel = wdOutlineLevel3 ‘3級
(58) ActiveDocument.Paragraphs(1).RightIndent ‘返回當前文檔中第一段的右縮進量
(59) ActiveDocument.Paragraphs(1).SpaceBefore '返回當前文檔中第一段的段前間距
(60) ActiveDocument.Paragraphs(1).SpaceAfter ‘返回當前文檔中第一段的段後間距
(61) ActiveDocument.Paragraphs(1).Range.Text '返回當前文檔中第一段的內容
(62) ActiveDocument.Paragraphs(1).Range.Style.NameLocal '返回當前文檔中第一段應用的樣式名
(63) ActiveDocument.Paragraphs(1).Range.Style.Description '返回當前文檔中第一段所應用樣式的詳細描述
(64) ActiveDocument.Paragraphs(1).Range.Style.Font.Name '返回當前文檔中第一段所應用樣式的字體名
(65) ActiveDocument.Paragraphs(1).Range.Style.Font.NameFarEast '返回或設置一種東亞字體名
(66) ActiveDocument.Paragraphs(1).Range.Style.Font.Size '返回或設置當前文檔中第一段所應用樣式的字體大小
(67) ActiveDocument.Paragraphs(1).Range.Style.Font.Spacing '返回或設置字符間距
(68) Selection.Words.Count '所選區域的字數 Sentences對象
(69) Selection.Sentences.Item(1) '所選區域中的第一句的內容 Words對象
(71) ActiveDocument.Words(1).Select '選擇當前文檔中的第一個詞
(72) ActiveDocument.Range.Words(1).InsertAfter "我愛你!" '在當前文檔中的第一個詞後插入「我愛你」
四、Characters對象
(73) Selection.Characters.Count '當前文檔中所選區域的字符數
(74) ActiveDocument.Paragraphs(1).Range.InsertParagraphAfter'在當前文檔的第一段以後插入一個新段落
五、Sections/Section對象
(75) ActiveDocument.Sections.First '當前文檔的第一節
(76) ActiveDocument.Sections.First.PageSetup.BottomMargin '當前文檔第一節所在頁的底邊距
(77) ActiveDocument.Sections.First.PageSetup.LeftMargin '當前文檔第一節所在頁的左邊距
(78) ActiveDocument.Sections.First.PageSetup.RightMargin '當前文檔第一節所在頁的右邊距
(79) ActiveDocument.Sections.First.PageSetup.TopMargin '當前文檔第一節所在頁的頂邊距
(80) ActiveDocument.Sections.First.PageSetup.PaperSize '返回或設置當前文檔第一節所在頁的大小
(81) ActiveDocument.Sections.First.PageSetup.PageHeight '返回或設置當前文檔第一節所在頁的高度
(82) ActiveDocument.Sections.First.PageSetup.PageWidth '返回或設置當前文檔第一節所在頁的寬度
(83) ActiveDocument.Sections.Add Range:=myRange '在當前文檔中添加新節
(84) ActiveDocument.Sections.Item(2) '當前文檔中的第二節
(85) ActiveDocument.Sections.Last.Range.InsertAfter "文檔結束!" '在當前文檔中最後一節的結尾添加文字「文檔結束!」
六、Range對象
(86) ActiveDocument.Range(Start:=0, End:=10) '表示當前文檔前10個字符所組成的一個Range對象
(87) Set myRange = ActiveDocument.Range(Start:=ActiveDocument.Paragraphs(2).Range.Start, _
End:=ActiveDocument.Paragraphs(4).Range.End) '將當前文檔第2段至第4段設置爲一個Range對象
(88) ActiveDocument.Paragraphs(1).Range.Copy '複製當前文檔中的第一段
(89) Selection.Copy
Documents.Add.Content.Paste '複製所選內容到新文檔中
(90) ActiveDocument.Bookmarks("Book1").Copy Name:="Book2" '將Book2書籤複製Book1書籤標記的位置
(91) Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=4 '將所選內容移至文檔中的第4行
(92) Selection.GoTo What:=wdGoToTable, Which:=wdGoToNext '將所選內容移至下一個表格的第1個單元格
(93) Selection.Range.AutoFormat '爲所選內容套用格式
(94) ActiveDocument.Content.Font.Name = "Arial" '將當前文檔的字體設置爲斜體
(95) ActiveDocument.Content.Select Selection.Delete '將當前文檔中的內容刪除其它
(96) Documents.Add '添加一個新文檔
(97) Set myTable = ActiveDocument.Tables.Add(Selection.Range, 2, 2) '在當前文檔所選區域添加一個2行2列的表格
七、文件讀寫
(98) Open "C:\my.txt" For Input As #1 '打開一個用於輸入的文件並令其編號爲1
(99) Line Input #1, TextLine '讀取被打開用於輸入且編號爲1的文件
(100) Close #1 '關閉編號爲1的文件
5、例子。例中的操做所有是錄製,而後嫁接的。
例子:用Excel VBA,將以下Excel表格(考試系統中導出的題庫 ),生成以下Word文檔
規程名稱 題型 題目內容 答案A 答案B 答案C 答案D 正確答案 分值 有否圖形
規程1 選擇題 題目1…… …… …… …… …… ABCD 2
規程1 判斷題 題目2…… 對 2
規程2 選擇題 題目3…… …… …… …… …… A 2
規程2 判斷題 題目4…… 錯 2
規程1
1、選擇題
一、題目1…… (ABCD)
A、……
B、……
C、……
D、……
2、判斷題
一、題目2…… (對)
規程2
1、選擇題
一、題目3…… (A)
A、……
B、……
C、……
D、……
2、判斷題
一、題目4…… (錯)
Sub ScWordWd()
'將「題庫」中的題目,按格式生成Word文檔
Dim I As Integer, J As Integer, Zhs As Integer, Xh As Integer, Dls As String
Dim Lr As String, Bt As String, Bt1 As String, Tx As String, Tx1 As String
Dim Lj As String, Wjm As String
Dim AA
Sheets("題庫").Select
Zhs = Sheets("題庫").UsedRange.Rows.Count
Bt = Cells(2, 1) '標題
Tx = Cells(2, 2) '題型
Xh = 1 '
Dls = 1 '
'Dim WordApp As Object
'Set WordApp = CreateObject("Word.Application") '新建Word對象
Dim Wordapp As Word.Application
Set Wordapp = New Word.Application '新建Word對象
Wordapp.Visible = True '可見
'Wordapp.ScreenUpdating = False '屏幕刷新
Dim WordD As Word.Document '定義word類
Set WordD = Wordapp.Documents.Add '新建文檔
Wordapp.Selection.WholeStory '全選
Wordapp.Selection.Font.Name = "宋體" '字體
Wordapp.Selection.Font.Size = 10 '字號
For I = 2 To Zhs
Bt1 = Cells(I, 1)
WordD.Paragraphs(Dls).Range.Font.Name = "宋體" '字體
WordD.Paragraphs(Dls).Range.Font.Size = 10 '字號
If Len(Trim(Bt1)) > 0 Then
Tx1 = Cells(I, 2)
Lr = Cells(I, 3)
If Bt1 <> Bt Then '標題不一樣,寫標題,居中
If I > 5 Then '
WordD.Paragraphs(Dls).Range.InsertAfter (vbCrLf) '插入回車符,增長一段
Dls = Dls + 1
WordD.Paragraphs(Dls).Range.Select
'Wordapp.Selection.InsertBreak Type:=wdPageBreak
'WordD.Paragraphs(Dls).Range.InsertBreak Type:=wdPageBreak '插入分頁符,兩個都沒反應?
Wordapp.Selection.InsertBreak Type:=wdSectionBreakNextPage '插入分節符(下一頁)
WordD.Paragraphs(Dls).Range.InsertAfter (vbCrLf) '插入回車符,增長一段
Dls = Dls + 1
End If
Bt = Bt1
WordD.Paragraphs(Dls).Range.Text = Bt & vbCrLf '寫標題
'WordD.Paragraphs(Dls).Range.InsertAfter (vbCrLf) '插入回車符,增長一段
WordD.Paragraphs(Dls).OutlineLevel = wdOutlineLevel2 '設置大綱級別,2級
'WordD.Paragraphs(Dls).Range.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0)
WordD.Paragraphs(Dls).Range.ParagraphFormat.FirstLineIndent = 0 '取消首行縮進
'WordD.Paragraphs(Dls).Range.Font.Name = "宋體" '字體
'WordD.Paragraphs(Dls).Range.Font.Size = 10 '字號
WordD.Paragraphs(Dls).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter '居中排列
WordD.Paragraphs(Dls).Range.Font.Bold = wdToggle '加粗
Dls = Dls + 1
Xh = 1
End If
If Tx1 <> Tx Then '題型不一樣,寫題型
If Tx1 = "選擇題" Then
WordD.Paragraphs(Dls).Range.Text = "1、選擇題" '寫題型
Else
WordD.Paragraphs(Dls).Range.InsertAfter (vbCrLf) '插入回車符,增長一段
Dls = Dls + 1
WordD.Paragraphs(Dls).Range.Text = "2、判斷題" '寫題型
End If
Tx = Tx1
WordD.Paragraphs(Dls).Range.ParagraphFormat.Alignment = wdAlignParagraphJustify '左對齊
'WordD.Paragraphs(Dls).Range.ParagraphFormat.FirstLineIndent = CentimetersToPoints(0.35) '首行縮進2字符,時能用時不能用,CentimetersToPoints不能被Excel識別?
WordD.Paragraphs(Dls).Range.ParagraphFormat.FirstLineIndent = 20 '首行縮進,20大約至關於5號字的2字符
WordD.Paragraphs(Dls).Range.InsertAfter (vbCrLf) '插入回車符,增長一段
WordD.Paragraphs(Dls).Range.Font.Bold = wdToggle '加粗
Dls = Dls + 1
Xh = 1
End If
If Tx = "選擇題" Then
WordD.Paragraphs(Dls).Range.Text = Xh & "、" & Lr & " (" & Cells(I, 8) & ")" & vbCrLf '寫題目及標準答案
Dls = Dls + 1
WordD.Paragraphs(Dls).Range.Text = "A、" & Cells(I, 4) & vbCrLf '選項A
Dls = Dls + 1
WordD.Paragraphs(Dls).Range.Text = "B、" & Cells(I, 5) & vbCrLf '選項B
Dls = Dls + 1
WordD.Paragraphs(Dls).Range.Text = "C、" & Cells(I, 6) & vbCrLf '選項C
Dls = Dls + 1
If Len(Trim(Cells(I, 7))) > 0 Then
WordD.Paragraphs(Dls).Range.Text = "D、" & Cells(I, 7) & vbCrLf '選項D
Dls = Dls + 1
End If
Xh = Xh + 1
Else
WordD.Paragraphs(Dls).Range.Text = Xh & "、" & Lr & " (" & Cells(I, 8) & ")" & vbCrLf '寫題目及標準答案
Dls = Dls + 1
Xh = Xh + 1
End If
End If
Next I
Wordapp.WindowState = wdWindowStateMinimize '最小化窗口
'Wordapp.ScreenUpdating = True '屏幕刷新
'WordD.Close '
'Set WordD = Nothing
'Set Wordapp = Nothing
'Wordapp.Quit '退出Word對象
ThisWorkbook.Activate
End Sub
(完)