Word VBA 學(xué)習(xí)交流(二)2008-01-08 20:58:55| 分類: Office辦公軟件 |字號 訂閱
Word VBA 學(xué)習(xí)交流 一、通過錄制宏生成代碼 如果無法確定要使用的 Visual Basic 方法或?qū)傩裕纱蜷_宏錄制器并進(jìn)行手動操作。宏錄制器會將操作譯成 Visual Basic 代碼。錄制操作完成后,可根據(jù)需要修改代碼。例如,如果無法確定實(shí)現(xiàn)段落縮進(jìn)的屬性或方法,可執(zhí)行下列操作:
查看 Visual Basic 代碼來確定對應(yīng)于段落左縮進(jìn)的屬性(LeftIndent 屬性)。將插入點(diǎn)置于 LeftIndent 之中,并按 F1 或單擊“幫助”按鈕。在幫助主題中,可以查看示例以及支持 LeftIndent 屬性的對象(單擊“應(yīng)用于”)。 (從上面可以看出,錄制宏是我們認(rèn)識未知對象的很好方法之一,同時(shí),也知道我為什么要大家裝“金山詞霸”的原因!如果你這個(gè)單詞不認(rèn)識,你怎么知道他是“左縮進(jìn)”?當(dāng)然,也有方法:就是把這個(gè)值設(shè)為一個(gè)比較特殊的值,再打特殊值所對應(yīng)的屬性) 說明 錄制的宏使用 Selection 屬性返回 Selection 對象。例如,下列指令將所選段落縮進(jìn) 0.5 英寸。 Sub IndentParagraph() Selection.ParagraphFormat.LeftIndent = InchesToPoints(0.5) End Sub 您也可以修改錄制的宏并與 Range 對象一起使用。 (我們在日常的使用中經(jīng)常注意到:在使用“本機(jī)上的模板”是的向?qū)Ь痛罅渴褂昧薙election對象,而不是Range對象!難道說微軟有更新層次的考慮?我想可能是Selection對象更穩(wěn)定,跨版本能力更強(qiáng)吧!) 二、修改錄制的 Visual Basic 宏 宏錄制器是查找所需的 Visual Basic 方法和屬性的非常方便的工具。如果不知道使用何種屬性或方法,可打開宏錄制器,手動執(zhí)行操作。宏錄制器會將操作譯為 Visual Basic 代碼。但錄制宏具有一些限制條件。您不能錄制下列內(nèi)容: 條件分支 變量指定 循環(huán)結(jié)構(gòu) 自定義用戶窗體 出錯(cuò)處理 用鼠標(biāo)選定的文字(必須使用組合鍵) 若要增強(qiáng)宏的功能,可能需要修改錄制到模塊中的代碼。 刪除 Selection 屬性 使用宏錄制器創(chuàng)建的宏取決于所選內(nèi)容。在大多數(shù)錄制的宏指令的開頭,可以看到“Selection”。錄制的宏使用 Selection 屬性返回 Selection 對象。 例如,下列示例將所選內(nèi)容移動至 Temp 書簽,并在書簽之后插入文字。 Sub Macro1() Selection.Goto What:=wdGotoBookmark, Name:="Temp" Selection.MoveRight Unit:=wdCharacter, Count:=1 '相當(dāng)于選中后按一個(gè)鍵盤的右方向鍵 Selection.TypeText Text:="New text" End Sub 這個(gè)宏雖然可以完成任務(wù),但是有一些缺點(diǎn)。首先,如果文檔中沒有一個(gè)名為 Temp 的書簽,該宏將導(dǎo)致出錯(cuò)。其次,該宏可能不正確地移動所選內(nèi)容。修改這個(gè)宏,使其不再使用 Selection 對象,就可解決上述兩個(gè)問題。以下就是經(jīng)修改后的宏: Sub MyMacro() If ActiveDocument.Bookmarks.Exists("Temp") = True Then endloc = ActiveDocument.Bookmarks("Temp").End ActiveDocument.Range(Start:=endloc, _ End:=endloc).InsertAfter "New text" '_ 就是續(xù)行的意思 End If End Sub Exists 方法用于檢查是否存在名為 Temp 的書簽。如果找到該書簽,則用 End 屬性返回該書簽結(jié)束字符的位置。最后使用 Range 方法返回一個(gè)引用書簽結(jié)束位置的 Range 對象,以使用 InsertAfter 方法插入文字。有關(guān)定義 Range 對象的詳細(xì)信息,請參閱處理 Range 對象。 使用 With…End With 可使用 With…End With 結(jié)構(gòu)簡化引用相同對象的宏指令。例如,在文檔頂部添加標(biāo)題時(shí),將錄制下面的宏。 Sub Macro1() Selection.HomeKey Unit:=wdStory Selection.TypeText Text:="Title" Selection.ParagraphAlignment.Alignment = wdAlignParagraphCenter End Sub 每個(gè)指令都使用 Selection 屬性返回一個(gè) Selection 對象??梢院喕@個(gè)宏,這樣只需使用一次 Selection 屬性。 Sub MyMacro() With Selection .HomeKey Unit:=wdStory .TypeText Text:="Title" '.ParagraphAlignment.Alignment = wdAlignParagraphCenter '上面那句是原幫助中的,但肯定是筆誤!微軟沒看出?! .ParagraphFormat.Alignment = wdAlignParagraphCenter End With End Sub 不使用 Selection 對象也可以完成相同的任務(wù)。下面的宏在活動文檔的開頭使用 Range 對象來完成相同的任務(wù)。 Sub MyMacro() With ActiveDocument.Range(Start:=0, End:=0) .InsertAfter "Title" '.ParagraphAlignment.Alignment = wdAlignParagraphCenter '上面那句是原幫助中的,但肯定是筆誤!微軟沒看出?! .ParagraphFormat.Alignment = wdAlignParagraphCenter End With End Sub 刪除不必要的屬性 如果錄制了一個(gè)關(guān)于在對話框中選擇選項(xiàng)的宏,即使只更改一個(gè)或兩個(gè)選項(xiàng),宏錄制器也會記錄該對話框中的所有選項(xiàng)的設(shè)置。如果不希望更改所有的選項(xiàng),可從錄制的宏中刪除不必要的屬性。下面錄制的宏包含“段落”對話框的一些選項(xiàng)(單擊“格式”菜單可顯示該對話框的所有信息)。 Sub Macro1() With Selection.ParagraphFormat .LeftIndent = InchesToPoints(0) '左縮進(jìn)0英寸 .RightIndent = InchesToPoints(0) '右縮進(jìn)0英寸 .SpaceBefore = 6 '段前距6磅 .SpaceAfter = 6 '段后距6磅,下面不寫了! .LineSpacingRule = 0 .Alignment = wdAlignParagraphLeft .WidowControl = True .KeepWithNext = False .KeepTogether = False .PageBreakBefore = False .NoLineNumber = False .Hyphenation = True .FirstLineIndent = InchesToPoints(0) .OutlineLevel = 10 End With End Sub 但是,如果只需更改段前和段后間距,可將宏更改為: Sub MyMacro() With Selection.ParagraphFormat .SpaceBefore = 6 .SpaceAfter = 6 End With End Sub 因?yàn)橹辉O(shè)置了較少的屬性,所以簡化后的宏運(yùn)行得更快。運(yùn)行結(jié)果只更改選定段落的段前和段后的間距,所有其他設(shè)置都沒有改變。(注意:如果你是一個(gè)喜歡亂動的人,還是要上面吧,但他的速度肯定沒有下面的快,但他的適合環(huán)境更大.更所謂"忠""孝"難兩全啊^-^) 刪除不必要的參數(shù) 當(dāng)宏錄制器記錄一個(gè)方法時(shí),會包含所有參數(shù)的值。打開名為 Test.doc 的文檔時(shí),錄制了下面的宏。所得到的宏包含 Open 方法的所有參數(shù)。 Sub Macro1() Documents.Open FileName:="C:\My Documents\Test.doc", _ ConfirmConversions:= False, ReadOnly:=False, _ AddToRecentFiles:=False, PasswordDocument:="", _ PasswordTemplate:="", Revert:=False, _ WritePasswordDocument:="", _ WritePasswordTemplate:="", Format:=wdOpenFormatAuto End Sub 可以從錄制的宏中刪除不需要的參數(shù)。例如,可以刪除所有設(shè)置為空字符串的參數(shù)(如 WritePasswordDocument:=""),如下所示。 Sub MyMacro() Documents.Open FileName:="C:\My Documents\Test.doc", _ ConfirmConversions:= False, _ ReadOnly:=False, AddToRecentFiles:=False, _ Revert:=False, Format:=wdOpenFormatAuto End Sub 三、自動運(yùn)行的宏 通過為一個(gè)宏賦予某個(gè)特殊的名稱,就可在執(zhí)行某項(xiàng)操作(例如啟動 Word 或打開文檔)時(shí)自動運(yùn)行宏。Word 將下列名稱識別為自動宏,或稱“auto”宏。
當(dāng)以下條件之一為真時(shí),將識別代碼模塊中的自動宏。
與其他宏一樣,自動宏也可以保存于 Normal 模板、其他模板或文檔中。要讓自動宏運(yùn)行,它必須位于活動文檔的 Normal 模板中,或活動文檔選用的模板中。 唯一例外的是 AutoExec 宏,它只有存儲于以下位置時(shí)才可自動運(yùn)行:Normal 模板、通過“模板和加載項(xiàng)”對話框全局加載的模板、或由“Startup”文件夾指定的文件夾中的全局模板。 在命名沖突的情況下(多個(gè)自動宏名相同),Word 將運(yùn)行上下文中最近的自動宏。例如,如果同時(shí)在文檔及其附加的模板中創(chuàng)建了 AutoClose 宏,則僅執(zhí)行文檔中的自動宏。如果在 Normal 模板中創(chuàng)建了 AutoNew 宏,只有當(dāng)文檔或其附加模板中沒有名為 AutoNew 的宏時(shí),該自動宏才能運(yùn)行。(筆者注:簡稱"就近原則"!) 注釋 按住 Shift 可以終止自動宏的運(yùn)行。例如,基于包含 AutoNew 宏的模板新建文檔時(shí),按住 Shift 可終止 AutoNew 宏的運(yùn)行。方法是:按住 Shift,單擊(“文件”菜單)“新建”對話框中的“確定”按鈕,并在顯示新文檔前持續(xù)按住 Shift。如果運(yùn)行一個(gè)宏時(shí)有可能觸發(fā)自動宏,(這種情況,我沒遇過!)可用下列指令終止自動宏的運(yùn)行: WordBasic.DisableAutoMacros 四、修改 Word 命令 大多數(shù) Word 命令都可通過轉(zhuǎn)換為宏的方式對其進(jìn)行修改。例如,可修改“文件”菜單上的“打開”命令,使其不再顯示 Word 文檔文件列表(擴(kuò)展名為 .doc 的文件),而顯示當(dāng)前文件夾中的所有文件。 若要在“宏”對話框中顯示內(nèi)置 Word 命令列表,可在“宏的位置”框中選定“Word 命令”。顯示的命令列表中包含所有的菜單命令、工具欄命令或快捷鍵命令。菜單命令名稱以相關(guān)的菜單名稱開頭。例如,“文件”菜單中的“保存”命令顯示為“FileSave”。 方法是工具/宏/宏 通過將一個(gè)宏命名為與 Word 命令相同的名稱,就可用宏替代 Word 命令。例如,如果創(chuàng)建一個(gè)名為“FileSave”的宏,當(dāng)選擇“文件”菜單上的“保存”命令、單擊“保存”工具欄按鈕,或按“保存文件”快捷鍵時(shí),Word 將運(yùn)行該宏。 本示例介紹了修改 FileSave 命令的步驟。
FileSave 宏顯示如下: Sub FileSave() ' ' FileSave Macro ' Saves the active document or template ' ActiveDocument.Save End Sub 可添加指令或刪除現(xiàn)有的 ActiveDocument.Save 指令。之后在運(yùn)行“FileSave”命令時(shí),新的 FileSave 宏將取代 word 命令。若要恢復(fù)“FileSave”原有的功能,需重新命名新的 FileSave 宏或?qū)⒅畡h除。 說明: 也可以創(chuàng)建與 Word 命令同名的代碼模塊(例如 FileSave)并包含名為 Main 的子程序,以此替換 Word 命令。 五、將文本插入文檔 使用 InsertAfter 或 InsertBefore 方法在 Selection 或 Range 對象之前或之后插入文字。下列示例在活動文檔的末尾插入文字。 Sub InsertTextAtEndOfDocument() ActiveDocument.Content.InsertAfter Text:=" The end." End Sub 下列示例在所選內(nèi)容之前插入文字。 Sub AddTextBeforeSelection() Selection.InsertBefore Text:="new text " End Sub Range 對象或 Selection 對象在使用了 InsertBefore 或 InsertAfter 方法之后,會擴(kuò)展并包含新的文本。使用 Collapse 方法可以將 Selection 或 Range 折疊到開始或結(jié)束位置。 六、選定文檔中的文本 可使用 Select 方法選定文檔中的對象。Select 方法可用于多種對象,例如 Bookmark、Field、Range 和 Table 對象。下列示例選定活動文檔中的第一個(gè)表格。 Sub SelectTable() ActiveDocument.Tables(1).Select End Sub 下列示例選定活動文檔中的第一個(gè)域。 Sub SelectField() ActiveDocument.Fields(1).Select End Sub 下列示例選定活動文檔中的前四個(gè)段落。Range 方法用于創(chuàng)建一個(gè)引用前四個(gè)段落的 Range 對象,然后將 Select 方法應(yīng)用于 Range 對象。 Sub SelectRange() Dim rngParagraphs As Range Set rngParagraphs = ActiveDocument.Range( _ Start:=ActiveDocument.Paragraphs(1).Range.Start, _ End:=ActiveDocument.Paragraphs(4).Range.End) rngParagraphs.Select End Sub ' 選定文檔中的文本:我覺得用處不大,原因就是為什么要選中呢?能操作就直接操作,不能的話,就選中吧(他可以說是沒辦法的辦法). 七、編輯文字 本主題包含與下列任務(wù)相關(guān)的 Visual Basic 示例:
有關(guān)其他編輯任務(wù)的信息和示例,請參閱下列主題: 從文檔返回文本 選定文檔中的文本 將文本插入文檔 修改文檔的某一部分 http://club./dispbbs.asp?boardID=23&ID=153805&page=1 摘題目: 怎樣用宏統(tǒng)計(jì)word文件中某一個(gè)漢字,例如“的”字出現(xiàn)的數(shù)量? (可以這樣:新建一個(gè)文檔,輸入“=rand(50,50)”,再按回車(不包括雙引號“”),則產(chǎn)生了虛擬文本,在此虛擬文本中試驗(yàn)) 方法有三: Sub getfoundcount1() Dim a As Range, i% Dim c, d
c = Timer '設(shè)C為運(yùn)行前的時(shí)間 For Each a In ActiveDocument.Characters '在字符間循環(huán) If a Like "的" Then '如果是“的” i = i + 1 '則加上,i的初始值是0,不用設(shè)的,默認(rèn) End If Next d = Timer – c '用現(xiàn)在的時(shí)間減去運(yùn)行前的時(shí)間等于用時(shí)
MsgBox "Word 找到" & i & "個(gè)與此條件相匹配的項(xiàng)!", vbInformation, d End Sub '上面此法利用循環(huán)比較字符是否是的是“的”字,來判斷!用時(shí)下面的圖形的標(biāo)題欄 圖表 1 Sub GetFoundCount2() Dim FoundCount As Integer, myFindText As String Dim a, b a = Timer myFindText = "的" With ActiveDocument.Content.Find .Text = myFindText '要查找的字符 .MatchWildcards = False '通配符為不勾選 .Wrap = wdFindStop '當(dāng)查找到后停止,就是每次縮小范圍 Do While .Execute '當(dāng)查找時(shí)則累加 FoundCount = FoundCount + 1 Loop End With b = Timer - a Debug.Print b Debug.Print FoundCount MsgBox "Word 找到" & FoundCount & "個(gè)與此條件相匹配的項(xiàng)!", vbInformation, b End Sub '上面是標(biāo)準(zhǔn)的用查找來判斷累加,(也是老大的代碼) 圖表 2 Sub getfoundcount3() Dim a, b, c, d, e, f d = Timer a = ActiveDocument.Range.Text f = VBA.Asc("的") '取得“的”的Ascii碼 b = Split(a, Chr(f)) '用此Ascii碼來分裂 c = UBound(b) '取得上限 e = Timer – d '取得時(shí)間 Debug.Print e '這個(gè)是輸出到調(diào)試區(qū)的 Debug.Print c '這個(gè)也是 MsgBox "Word 找到" & c & "個(gè)與此條件相匹配的項(xiàng)!", vbInformation, e End Sub '上面是利用數(shù)組,把“的”看成是用于split數(shù)組的字符,通過是判斷數(shù)組的上限來判斷是幾位數(shù)組,即是幾個(gè)“的”。 圖表 3 Sub GetFoundCount4() Dim strText As String, myText As String Dim lngOld As Long, lngNew As Long Dim Times As Single Times = VBA.Timer strText = ActiveDocument.Content.Text myText = "的" lngOld = Len(strText) '包括“的”的長度 lngNew = Len(Replace(strText, myText, "")) '替換“的”后的長度 MsgBox "Word 找到" & lngOld - lngNew & "個(gè)與此條件相匹配的項(xiàng)!", vbInformation, VBA.Timer - Times End Sub 圖表 4 (上面是老大又寫了一個(gè),老大隨后的代碼的運(yùn)行速度更是十分驚人)
兩種方法運(yùn)行最高。 一個(gè)是0.1秒與一個(gè)是6秒,效率是可想而知!大家試試! 十、從文檔返回文本 使用 Text 屬性可以返回 Range 或 Selection 對象中的文本。下列示例選定下一個(gè)格式設(shè)為“標(biāo)題 1”樣式的段落。然后通過 MsgBox 函數(shù)顯示 Text 屬性的內(nèi)容。 Sub FindHeadingStyle() With Selection.Find .ClearFormatting .Style = wdStyleHeading1 .Execute FindText:="", Format:=True, _ Forward:=True, Wrap:=wdFindStop If .Found = True Then MsgBox Selection.Text End With End Sub 下列指令返回并顯示選定的文本。 Sub ShowSelection() Dim strText As String strText = Selection.Text MsgBox strText End Sub 下列示例返回活動文檔中的第一個(gè)單詞。Words 集合中的每一項(xiàng)是代表一個(gè)單詞的 Range 對象。 Sub ShowFirstWord() Dim strFirstWord As String strFirstWord = ActiveDocument.Words(1).Text MsgBox strFirstWord End Sub 下列示例返回與活動文檔中第一個(gè)書簽相關(guān)聯(lián)的文本。 Sub ShowFirstBookmark() Dim strBookmark As String If ActiveDocument.Bookmarks.Count > 0 Then strBookmark = ActiveDocument.Bookmarks(1).Range.Text MsgBox strBookmark End If End Sub
在一對話框來中顯示提示,等待用戶輸入正文或按下按鈕,并返回包含文本框內(nèi)容的 String。 語法 InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) InputBox 函數(shù)的語法具有以下幾個(gè)命名參數(shù):
說明:如果同時(shí)提供了 helpfile 與 context,用戶可以按 F1 (Windows) or HELP (Macintosh) 來查看與 context 相應(yīng)的幫助主題。某些主應(yīng)用程序,例如,Microsoft Excel,會在對話框中自動添加一個(gè) Help 按鈕。如果用戶單擊 OK 或按下ENTER ,則 InputBox 函數(shù)返回文本框中的內(nèi)容。如果用戶單擊 Cancel,則此函數(shù)返回一個(gè)長度為零的字符串 ("")。 注意 如果還要指定第一個(gè)命名參數(shù)以外的參數(shù),則必須在表達(dá)式中使用 InputBox。如果要省略某些位置參數(shù),則必須加入相應(yīng)的逗號分界符。 |
|