




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
今年5月,美國Microsoft公司在中國推出了Office套件的最新版本Office 97中文版。該套件的各個軟體都提供Visual Basic for Application(VBA)作爲其巨集語言,爲使用這些軟體的廣大用戶提供了一個新的、更高層次的開發平臺。即使是非電腦專業的用戶,利用VBA也可以方便地開發出高水準的應用軟體系統。本講座主要以Excel 97爲例,介紹VBA的基本概念、主要特點和應用VBA開發應用軟體的基本步驟。 一、概述 1. Excel 97 Office 97中文版是Microsoft公司第一個完全漢化的Office套件,是運行於Windows 95/Windows NT環境下應用最爲廣泛的軟體之一。其中有Word 97、Excel 97、Power Point 97、Access 97和Outlook 97。其中的Access 97和Power Point 97是首次漢化,Outlook 97是新增的個人事務管理元件。 Excel 97是Microsoft Office 97家族成員。是一個功能強大、技術先進、使用方便的表格式資料綜合管理和分析系統。它採用試算表方式進行資料處理,工作直觀方便;提供了豐富的函數,可以進行各種資料處理、統計分析、輔助決策,適用于財政、金融、統計、管理等廣泛的應用領域;具有強大的製圖功能,可以方便地繪出各種專業圖表,實現了圖、文、表三者的完美結合;新推出的Excel 97還新增了預防巨集病毒的功能,插入地圖和超連結的功能(直接鏈結來自Internet或其他網路位址的文檔);以及視面管理器、共用活頁簿等功能。Excel 97的強大功能還在於它提供的巨集語言VBA。 2. Visual Basic for Application Visual Basic是Windows環境下開發應用軟體的一種通用程式設計語言,功能強大,直觀易用。一方面,它是可視性程式設計語言,許多複雜的用戶介面設計都可以直觀地利用滑鼠拖放以及對各種物件屬性的設置、修改完成,幾乎無需編程。另一方面,程式的控制普遍採用了事件驅動機制,根據用戶操作觸發的事件,執行不同的動作,完成相應的功能,因而都是一些短小精練的過程,容易設計和調試。VBA則是根據其嵌入軟體的不同,增加了對相應軟體不同物件的控制功能。例如Excel 97的VBA,主要增加了關於Excel工作簿、工作表、區域、樞紐分析表等物件的屬性、事件和方法。在Excel 97中使用VBA,可以更方遍地操作Excel,更好地控制Excel,進一步深入發掘Excel的強大功能,全面提高使用Excel工作的自動化水平。甚至可以在短短的幾天時間內就在Excel環境中開發出所需的完整的管理資訊系統。而且VBA廣泛地應用于Microsoft公司開發的各種軟體中,例如Office 97套件中的Powerpoint 97、Word 97、Outlook 97等。所以本講座介紹的內容不僅對Excel有用,對於其他包含Visual Basic的應用程式也同樣有用。 3. VBA與Excel 97的關係 早期電子資料表的巨集語言是模仿用戶介面的,實質上就是一些按鍵的組合,再加上一些類似於Basic語言中的INPUT、IFTHENE?Z?癛NC”相當於用戶鍵入R(區域“Range”)、N(名稱“Name”)C(創建“Create”),執行的是創建區域名的操作。這樣的巨集不僅難以閱讀,而且也與圖形用戶介面不適應。Excel 5.0以前的版本開始使用獨立於用戶介面的巨集語言。例如在Excel 4.0版中至少有三種不同的方法複製一個區域:使用Ctrl+C複合鍵;使用工具欄中的“複製”工具按鈕;使用“編輯”功能表中的“複製”命令。所有這些用戶操作序列都被翻譯成單一的巨集函數,=COPY( )。這樣的巨集的主要缺點是Excel巨集只能用於Excel,而無法適應其他應用程式。從Excel 5.0開始使用VBA作爲巨集語言,Excel 97中的VBA功能更爲強大,使用也更方便。 宿主於Excel 97中的VBA,不是嵌入在Excel內部,而是通過一組稱作物件庫的特殊命令與Excel關聯的。VBA與其他軟體的這種控制關係,使得VBA不僅可以控制Excel,而且可以控制任何提供物件庫的應用程式。例如所有的Office 97應用程式都提供物件庫,其他一些Microsft和非Microsoft應用程式也提供物件庫。同時宿主於Excel的VBA也不是唯一與Excel 物件庫通信的語言,還可以使用宿主於Word的VBA,獨立版本的Visual Basic,C+以及Delphi等操縱Excel。 4. VBA與Excel 物件的關係 Excel 97的衆多物件之間是相互關聯的,構成了一個有機的整體。其中Application物件位於最上層,代表了整個Excel應用程式。包括應用程式的各種選項以及當前活動的各種物件。其下面主要有Workbooks(工作簿集合)物件、Window(視窗)物件、Dialog(對話方塊)物件等。而Workbooks物件下面又有Worksheets(工作表)物件、Chart(圖表)物件、Window(視窗)物件、Name(名稱)物件等。Worksheets物件下面還有Range(區域)物件、Name(名稱)物件等。其中Application物件下面的Window物件與Workbook物件下面的Window物件是不同的。前者包含了Excel的所有窗口,而後者只包含指定工作簿中的窗口。 不同的物件通常具有不同的方法、屬性和事件。例如Workbooks物件有Add、Close、Open等方法,Application、Count、Item、Parent等屬性。集合型物件都有Count、Item屬性,可得到相應集合中的物件個數或指定的物件。而除了Application物件以外的所有的物件都有Parent屬性,可得到相應物件的父物件。不同物件包含的事件也是不同的。例如Worksheet物件就有Activate、Deactivate、Change等七個事件,而Workbook物件則包含了多達19個事件。 VBA主要是根據用戶對不同物件的操作、觸發的相應事件,去啟動相應的程式,通過對相關的物件執行不同的方法,或是修改相關物件的屬性來完成特定的工作。例如,下面是一段VBA程式: Sub Example( ) Range(“A1:F1”).Select Selection.NumberFormat = “$#.#0” ActiveWindow.DisplayGridlines = FalseEnd Sub 該段程式首先選定A1:F1單元區域(使用Range物件的Select方法),然後將選定物件的格式設置成指定的貨幣樣式(修改Selection物件的NumberFormat屬性),最後消除視窗中的格線(修改ActiveWindow物件的DisplayGridlines屬性)。 由於Excel 97物件衆多,而不同的物件其屬性、方法、事件又有較大的差異,學習起來較爲困難。Excel 97的VBA提供了物件瀏覽器、立即視窗、本地視窗、聯機幫助等多種工具,可以幫助我們系統地瞭解和學習物件。在實際使用VBA的過程中,還隨時可以利用VBA的自動列表功能。例如在輸入了“Selection.”後,VBA將自動彈出Selection物件可用的方法和屬性的自動列表供用戶選擇。而當輸入了某個函數名後,VBA將自動彈出該函數可用參數的自動列表。學習VBA的最有效的方法是利用巨集記錄器錄製有關的操作,將其轉換成VBA巨集語言,然後在其基礎上再編輯修改,建立自己需要的巨集。 二、創建簡單的宏 初次創建或使用巨集時,最好使用巨集記錄器。其基本步驟是:先將要完成的工作做一遍,以確認操作的正確;如果工作正常,啓動巨集記錄器,再做一遍。此時巨集記錄器將錄製所做的操作,並將其轉換成VBA巨集語言保存起來。最後再根據需要編輯修改錄製的巨集,並設置巨集執行的方法。下面以創建縱向合併單格的巨集爲實例,說明創建巨集的基本步驟。Excel 97的“格式”工具欄上已提供了橫向合併單格的工具按鈕。但是有些表格需要縱向合併若干個單格,爲此我們創建一個縱向合併單格的宏。具體步驟如下: 1. 執行相應操作 首先使用功能表命令一步步執行相應的操作。設要處理的工作表如下所示: 圖1 需要縱向合併A欄的行標題 選定區域A3:A10。(此時標題位於選定區域的最上面的單格。) 單擊“格式”功能表中的“單格”命令,然後單擊“對齊”選項卡。 選中“合併單格”核取方塊,在“水平對齊”和“垂直對齊”下拉清單框中選“居中”;然後拖拽“方向”框中的紅點,使其朝上旋轉90。 圖2 單元格格式對話方塊(對齊選項卡) 最後單擊“確定”完成合併及旋轉標題。合併結果如下所示: 圖3 縱向合併A3:A10 2. 錄製巨集 通過剛才的操作已正確地完成了縱向合併若干個單格的操作。下面可以錄製這些操作,並將它們轉換成VBA程式。在開始創建宏之前,先右擊任何工具欄,在彈出的工具欄快顯功能表中選擇Visual Basic工具欄。 選擇區域A3:A10,然後單擊Visual Basic工具欄上的“錄製巨集”按鈕。 圖4 錄製新巨集對話方塊 在“錄製新宏”對話方塊中,用“MergeVertical”替換默認的宏名,用“縱向合併單格”替換默認的描述,單擊“確定”。這時狀態欄出現“錄製”字樣,並出現“停止錄製”按鈕。此時開始錄製巨集。 執行一遍剛才做過的一系列操作。巨集記錄器立刻將相應的語句插入到宏中。 單擊“停止錄製”按鈕。 這樣就完成了錄製巨集的操作。 3. 查看錄製的宏 第一次錄製巨集時,Excel創建一個新模組。以後每次錄製新宏時,Excel都將新巨集添加到同一模組的結尾。當需要查看巨集時可以單擊“運行巨集”按鈕,選定要查看宏的名稱,再單擊“編輯”即可查看“代碼”視窗中的VBA程式。剛才錄製的VBA程式如下所示: Sub MergeVertical( ) With Selection .HorizontalAlignment = xlGeneral .VerticalAlignment = xlGeneral .WrapText = False .Orientation = 90 .ShrinkToFit = False .MergeCells = True End With End Sub宏是以Visual Baisc編寫的,並遵從標準Visual Basic規則:以Sub開始,以End Sub結束。該巨集顯示了關於單格對齊的6個不同的屬性,它們與前面介紹的對話方塊中看到的選項完全一致。這裏出現的With結構使得程式的可讀性更好,也更簡練。這裏相當與每個“.”前面的屬性都是Selection物件。 4. 運行巨集 現在可以試用一下宏,看它是如何工作的。 選定工作表的A11:A16單格。 單擊Visual Baisc工具欄上的“運行巨集”按鈕。 從列表中選定MergeVertical宏,然後單擊“運行”。 巨集將選定的單格區域縱向合併。 圖5 縱向合併後的工作表 如果創建的是經常使用的巨集,可以在創建巨集時指定快捷鍵,或是在編輯巨集時爲創建的巨集填加快捷鍵。注意:Ctrl+複合鍵大多已經是某些操作的快捷鍵,所以最好使用Ctrl+Shift+的方式定義巨集的快捷鍵。定義快捷鍵時,Ctrl鍵爲缺省的,故只需按Shift鍵和相應的字母鍵即可。這裏我們指定Ctrl+Shift+M作爲縱向合併單格宏的快捷鍵。以後使用時只要選定需要縱向合併的若干個單格,再按Ctrl+Shift+M複合鍵即可。使用更普遍的巨集還可以做成工具按鈕放到工具欄中,或是添加到功能表命令中。有關操作方法,將在後續講座中介紹。如果需要具體瞭解巨集是如何工作的,還可以選擇單步執行方式,一步步地運行宏。(按F8鍵可以逐條執行巨集式) 5. 優化記錄巨集 使用巨集記錄器錄製的巨集通常都是機械的,錄製完後通常需要修改它們,使其更通用、更簡潔。例如上面錄製的宏中,可以刪除“.WrapText = False”、“.ShrinkToFit = False”等與合併單格無關的語句。如果錄製的宏中有選定具體單格的語句,爲了使宏更爲通用,通常也應刪除它們。爲了增加宏的可讀性,還可以在巨集式後面添加有關的說明或注釋。 ! 首都經濟貿易大學 趙丹亞 邵麗 三、創建複雜的宏 如果要完成的工作較爲複雜,創建宏時,最好採用下述步驟: 將工作分解成若干步驟; 針對每個步驟分別創建巨集; 將創建的若干個巨集連接成一個巨集。 這樣可以使得創建、調試宏的工作較爲簡單,當需要修改巨集時,牽涉的範圍也較小。下面通過向已有圖表添加資料的工作說明。該工作並不太複雜,只是通過它示意創建複雜巨集的方法步驟。 1. 分解複雜操作 現有一個有關瀋陽萬利基金的個股股票工作簿,其中已建立了該股票K線圖。另外每天可以從即時股票系統中接收當天的股票行情。需要完成的工作就是根據每天接收的新資料,更新已有的股票資訊工作簿及K線圖。因爲該工作每個股票交易日都要進行,因此創建一個宏使其能夠自動完成是較爲理想的。我們可以將該工作分成如下步驟: 打開股票行情資料庫,篩選出所需的個股資料,刪除不需要的欄位,調整欄位順序,並將其行列轉置。 圖6 行情資料工作簿 打開個股股票工作簿,將股票行情資料庫中準備好的資料複製過來。 圖7 個股資料工作簿 更新K線圖。 圖8 添加資料後的K線圖 2. 創建分解的巨集 根據分解後的簡單工作,按照上一節介紹的工作步驟,採用錄製巨集的方法創建三個宏:Import_Data、Copy_Data和Update_Chart。由於篇幅所限,不一一介紹具體錄製巨集的具體操作。以下給出錄製、編輯後的VBA宏。 Sub Import_Data() 導入股票行情資料 快捷鍵: Ctrl+Shift+I Workbooks.Open FileName:=F:EXCELST1.XLS Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:=瀋陽萬利 Range(A1:K9).Select Selection.Copy Sheets.Add ActiveSheet.Paste Range(A:C,H:J).Select Range(C1).Activate Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range(A2:E2).Select Selection.Copy Range(A3).Select Selection.PasteSpecial Paste:=xlAll, _ Operation:=xlNone, SkipBlanks:=False, _ Transpose:=True End Sub Sub Copy_Data() 複製股票行情資料 快捷鍵: Ctrl+Shift+C Windows(ST1.XLS).Activate Range(A3:A7).Select Selection.Copy Windows(ST2.XLS).Activate Range(A2).Select Selection.End(xlToRight).Select ActiveCell.Offset(0, 1).Range(A1).Select ActiveSheet.Paste End Sub Sub Update_Chart() 更新K線圖 快捷鍵: Ctrl+Shift+U Sheets(K線圖).Select ActiveChart.SeriesCollection.Extend _ Source:=Sheets(瀋陽萬利).Range(CS2:CS6),_ Rowcol:=xlRows, CategoryLabels:=FalseEnd Sub 請注意,Import_Data宏中的檔案名、路徑名會因操作的環境不同,後半部分主要是關於工作表行列轉置的操作的巨集式,具體操作方法可以參見聯機幫助中“轉置行與列”。Copy_Data宏中的Selection.End(xlToRight).Select語句表示選定當前行的最後一個包含資料的單格(操作時按Ctrl+鍵)。語句ActiveCell.Offset(0, 1).Range(A1).Select中的Offset屬性表示相對引用,這裏表示選定當前單格同一行右邊相臨的單格,其中的Range(A1)是虛擬單格,並不表示實際的A1單格。這樣就保證了該宏的通用性。可以每次將資料都複製到指定工作表的最後一列。當需要使用相對引用時,在錄製相應操作前單擊“停止錄製”按鈕右邊的“相對引用”按鈕即可。 3. 裝配宏現在已有了完成各個步驟的巨集: Import_Data:導入股票行情資料。 Copy_Data:將股票行情資料複製到個股資料工作表。 Update_Chart:更新K線圖。 下面的工作是將其裝配在一起。最簡單的方法仍然是使用巨集記錄器,只是這次要錄製的是運行其他巨集的巨集。首先單擊“錄製巨集”按鈕,鍵入巨集的名稱“Auto_Add”,單擊“確定”。然後單擊“運行巨集”按鈕,逐個運行Import_Data、Copy_Data、Update_Chart宏。最後單擊“停止錄製”按鈕。錄製的宏如下: Sub Auto_Add( ) Application.Run “ST2.xls!Import_Data” Application.Run “ST2.xls!Copy_Data Application.Run “ST2.xls!Update_Chart End Sub 實際上宏名稱前面的“Application.Run “ST2.xls!”可以簡化掉,而不影響宏的運行。 通過上一講的學習,我們已初步掌握了如何利用VBA控制Excel。但都是利用巨集記錄器錄製的VBA巨集式。在實際應用中,記錄巨集只能機械地重復執行某些操作,而不能完成其他更複雜的功能。這一講將介紹如何編寫超出記錄巨集以外的VBA程式,如何在編寫巨集時構造分支和迴圈,從而使編寫出的宏功能更爲強大。 一、VBA控制結構 VBA是由Visual Basic語言發展而成的,其語言結構分爲兩部分:Visual Basic語言結構和其嵌入軟體的物件模組(如Excel物件模組)。其中,Visual Basic是一套完全獨立的Windows開發系統,是視覺化的、面向物件的、採用事件驅動方式的結構化高級程式設計語言。與其他高級程式設計語言的控制結構一樣,Visual Basic程式設計語言的控制結構分爲三種:順序結構、分支結構和迴圈結構。 順序結構:表示在每個過程或函數中程式依順序執行每條語句,無條件判斷轉移和迴圈。原始記錄巨集的結構就屬於順序結構,既不能根據具體情況作出判斷執行不同的操作,也不能對同一類問題自動地重復執行同一組操作。因而,要提高巨集的靈活性,增加巨集的功能,唯一辦法就是修改宏,加入選擇、判斷、迴圈控制功能。 1. 分支結構 VBA的分支結構有:If語句和Select Case語句。 If 語句 If語句是根據條件判斷控制程式的分支,有三種形式:一是單分支結構,僅當條件爲真時執行Then語句塊;二是雙分支結構,當條件爲真時執行Then語句塊,條件爲假時執行Else語句塊;三是多分支結構,格式如下: If 條件1 Then語句塊1ElseIf 條件2 Then語句塊2Else語句塊n+1End If 當條件1爲真時執行語句塊1,否則,若條件2爲真,則執行語句塊2如果所有的條件都不成立,則執行Else後面的語句塊n+1。 例如爲了更方便地瀏覽指定的工作表,希望限定活動單格指標只能在工作表的39列內移動;當活動單格位於39列之外時,將單格指標移至該行的第3列;當活動單格位於第9列,再右移時,單格指標自動移至下一行的第3列。爲此可以使用If結構的巨集實現。相應的VBA程式如下所示: Sub Move( )在工作表的39列內右移單元指標快捷鍵 Ctrl+Shift+MIf ActiveCell.Column 9 ThenCells(ActiveCell.Row, 3).SelectElseIf ActiveCell.Column = 9 ThenCells(ActiveCell.Row + 1, 3).SelectElseActiveCell.Offset(0, 1).SelectEnd IfEnd SubSelect Case語句Select Case語句與If.Then.ElseIf語句非常相似,只是當判斷控制僅取決於一個測試變數時,使用Select Case結構更有效、更簡捷。Select Case語句的格式如下:Select Case 測試變數Case 運算式1語句塊1Case 運算式2語句塊2Case Else語句塊n+1End Select 該語句的功能是:首先將測試變數的值與Case後面運算式的值相比較,哪個運算式與測試變數匹配就轉向執行哪段語句塊,執行完畢便轉向End Select語句之後繼續往下執行。如果所有的條件都不成立,則執行Case Else後面的語句塊n+1。 在Select Case語句中,測試變數可以是變數、屬性或運算式。Case語句後面的運算式有可以爲一般運算式,也可以爲Is關係運算式。 一般運算式可以由多個運算式組成,其間用“,”和“To”分隔,前者表示“或”,只要其中有一個運算式匹配即執行該Case語句對應的語句塊。後者表示範圍,指定範圍時,運算式值須從小到大排列。例如:Case 20 To 15,15 To 20 Is關係運算式。表示測試變數應該與Is關鍵字之後的運算式比較,當指定範圍爲真,則執行該Case下面的語句塊,反之轉向比較其他運算式。 注意:測試變數的類型必須與Case後面運算式的類型一致。 例如現有學生的考試成績存放在StScore工作表中,需要根據考試成績,在其右鄰單元給出優、良、中、及格、不及格五個等級。這可以方便地利用Select Case語句實現。相應的VBA巨集程式如下所示:Sub Score( )給出優、良、中、及格、不及格五個等級。快捷鍵 Ctrl+Shift+S Select Case ActiveCell.Value Case Is 60 Cells(ActiveCell.Row, ActiveCell.Column + 1) = 不及格 Case 60 To 69.9 Cells(ActiveCell.Row, ActiveCell.Column + 1) = 及格 Case 70 To 79.9 Cells(ActiveCell.Row, ActiveCell.Column + 1) = 中 Case 80 To 89.9 Cells(ActiveCell.Row, ActiveCell.Column + 1) = 良 Case Else Cells(ActiveCell.Row, ActiveCell.Column + 1) = 優 End SelectEnd Sub 2. 迴圈結構VBA的迴圈結構有:For.Next迴圈、For Each.Next迴圈和Do.Loop迴圈。 For.Next迴圈For.Next迴圈重復執行一組語句,直到迴圈次數達到指定次數爲止。其格式如下:For 變數=初值 To 終值 Step 步長語句塊Next 變數 下面舉例說明For迴圈的使用方法。 設電腦等級考試成績存放在Deg_Score工作表上,其中筆試成績存放在E列、上機成績存放在F列,且這兩個區域分別命名爲Pening、Operating。現需要創建一個巨集,將不及格的以紅色顯示、成績優秀(筆試成績和上機成績都在85分以上)的以綠色顯示。相應的VBA巨集程式如下所示: Sub DegreeScore( )Dim i As IntegerFor i = 1 To Range(Pening).Cells.CountIf Range(Penging).Cells(i) 60 Then Range(Pening).Cells(i).Interior.Color = vbRedEnd IfIf Range(Operating).Cells(i) 85 And Range(Operating ).Cells(i) 85 Then Range(Pening).Cells(i).Interior.Color = vbGreen Range(Operating ).Cells(i).Interior.Color = vbGreenEnd IfNext iEnd Sub 其中,Range(Pening).Cells.Count給出了區域內單格的個數;Range(Pening).Cells(i)返回Pening區域內的第i個單格;Range物件的Interior屬性返回引用的新物件:Interior物件。Interior物件控制單格內部的顔色和圖案格式。此外,在Visual Basic中已經爲常用顔色預先定義了名字,引用時直接引用顔色的名字即可。 For Each.Next迴圈 在Excel物件庫中處理一類物件時,應使用集合。如WorkBooks(工作簿集合)、WorkSheets(工作表集合)等等,稱爲物件集或物件類。要從物件集合中選定單一物件,需要指明物件的序號或是物件的名稱。例如,要得到Book2工作簿中第三頁工作表的C9單格資料,若不知道第三頁工作表的名稱,則可表示爲: Workbooks(“Book2”).Worksheets(3).Range(“C9”) 對於物件集或物件類,VBA提供了一種有效的迴圈控制結構:For Each迴圈,其格式如下: For Each 物件變數 In 物件集 語句塊Next 物件變數 其中,For Each語句的作用類似於Set語句,將物件引用賦值給變數。不過For Each語句是將同一物件集中的每個物件引用依次賦值給同一變數。For Each迴圈的功能是爲物件集中的每個物件重復執行一組語句。 下面舉例說明For Each迴圈的使用方法。 Excel提供了列印預覽工作表的方法,然而,每次只能對活動工作表進行列印預覽。假設現有一個包含若個部門預算工作表的工作簿,在列印前需要預覽每一個預算工作表,那麽可使用For Each迴圈編寫如下宏實現:Sub PrintPreviewSheets( ) Dim mySheet As WorksheetFor Each mySheet In WorksheetsmySheet.SelectmySheet.PageSetup.Orientation = xlLandscapemySheet.PrintPreviewNext mySheetEnd Sub PrintPreviewSheets宏的執行過程是:依次將工作表集合中的每個物件(工作表)引用賦值給變數mySheet,再選定物件指標指向的物件(即啟動工作表),然後將頁列印方向設置爲橫向,最後列印預覽該工作表。 同樣,可使用For迴圈編寫宏實現上述功能: Sub PrintPreviewSheets( )Dim mySheet As WorksheetDim i As IntegerFor i = 1 To Worksheets.CountSet mySheet = Worksheets(i)mySheet.SeletemySheet.PageSetup.Orientation = xlLandscapemySheet.PrintPreviewNext iEnd Sub 請注意區分:For語句是將一個值賦給變數,而For Each語句是將一個物件引用賦給變數。通常,使用For Each迴圈比使用For迴圈更方便、更快捷,但For迴圈的使用範圍更廣。例如,當需要利用計數器控制迴圈時,或要在兩個同類的物件集(如兩個區域)之間進行比較時,就只能使用For迴圈,而不能使用For Each迴圈。 DoLoop迴圈 For Each迴圈通過物件集來控制迴圈的執行與結束,For迴圈通過計數器的初值、終值、步長來控制迴圈執行的次數。然而在某些情況下,需要通過條件判斷來控制迴圈的執行與結束。爲此,Visual Basic提供了另一種更有效的迴圈控制結構:Do迴圈。 Visual Basic提供了多種靈活的Do迴圈形式,一方面可以用Until 條件或while 條件來控制迴圈,另一方面Until 條件和while 條件既可放在Do語句中,也可放在Loop語句中,使用十分方便。其中,最常用的Do迴圈格式如下:Do While 條件運算式語句塊Loop 該Do迴圈的功能是:只要條件爲真,就重復執行語句塊,直到條件爲假時才結束迴圈,執行Loop語句的下一條語句。 下面舉例說明Do While迴圈的使用方法。 假設需要對活動工作簿的Sheet1工作表先按第一列資料進行排序,然後刪除包含重復資料的行,使用Do While迴圈編寫如下VBA宏實現: Sub DeleteRepeatData( )Worksheets(Sheet1).Range(A1).Sort_ key1 :=Worksheets(Sheet1).Range(A1)Set currentCell = Worksheets(Sheet1).Range(A1)Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCellLoopEnd Sub Do迴圈具有很強的適應性,但使用時必須保證在循環體內有産生迴圈結束的程式碼,以避免出現閉環。譬如,在本例中若沒有Set currentCell = nextCell語句,就會出現閉環。 VBA提供了功能強大的分支結構和迴圈結構。如果能將迴圈控制結構與條件控制結構聯合使用,則可以設計出靈活多變、功能強大的宏。 3. 自定義函數 在VBA的整個程式結構中,自定義函數是非常重要且十分方便的工具。 自定義函數的結構與過程的結構非常相似,只是自定義函數的參數是必不可少的,且具有返回值。其基本結構如下所示: Function 函數名(參數1,參數2,) 語句塊End Function 下面舉例說明用戶如何建立自定義函數。 Excel和Visual Basic都有産生0與1之間亂數的函數。Excel的隨機函數RAND( )可用於工作表,而Visual Basic的隨機函數Rnd只能用於Visual Baisc巨集。現建立一個可隨時隨地調用,不受上述限制的産生亂數的自定義函數Random。其巨集程式如下: Function Random(Optional Midpoint = 0.5, Optional Range = 0.5, Optional Round = False)Application.Volatile TrueRandom = Rnd * (Range * 2) + (Midpoint - Range)If Round Then Random = CLng(Random)End IfEnd Function 其中: 函數的參數Midpoint、Range、Round描述了亂數區間,依次給出了:區間中點、正負範圍、是否對亂數進行四捨五入取整運算。 函數參數前的關鍵字Optional設定參數爲可選項,參數後用等號給出參數的預設值。 Application.Volatile True語句使得該函數爲易失函數。對於大多數函數,只有當與函數的參數相關聯的單格值改變時,才重新計算。而有些函數(如Excel中的RAND( )函數),只要工作表任何一個單格的值發生變化或按F9鍵,便重新計算,具有這種性質的函數稱爲易失函數。 函數CLng將一個數舍入成整數,再轉換爲長整型。 例如,選定某一單格,鍵入下列公式: =Random(1000,500,True) 則在此單格産生1000-500到1000+500,即500到1500之間的隨機整數。 二、VBA程式調試 在程式運行過程中,總會或多或少地遇到各種各樣的錯誤,這些錯誤大致可分爲以下幾類: 語法錯誤:指程式的某一語句的語法出現錯誤,如左右引號或括弧不匹配等。當程式設計人員輸入完一行語句時,Visual Baisc編輯器會自動檢測語法錯誤,並提醒程式師錯誤所在。 編譯錯誤:指在程式的編譯過程中檢測出來的錯誤。只檢測單行語句是不能發現編譯錯誤的。例如,以For Each開始的迴圈結構沒有Next語句。通常語法錯誤和編譯錯誤是容易發現和改正的。 邏輯錯誤:指思維錯誤導致程式運行結果與程式師的預期結果不同的編程思路錯誤。例如,想把工作簿的標題改爲“My Workbook”,卻拼寫成“My Werkbook”;應該是“=”卻寫成“”等等。邏輯錯誤是最常見也是最麻煩的一類錯誤,程式調試的大部分時間都耗費在發現和糾正邏輯錯誤上。一般可通過設置中斷點、單步執行、觀察值的變化來發現和糾正邏輯錯誤。 即時錯誤:指在程式運行過程中發現的錯誤。有時過程中的某條語句在某些條件下能正確執行,而在另一些條件下就不能正確執行。例如,有一條語句用於打開硬碟上某個文件,若文件存在,可以打開,語句執行正確;若文件不存在,怎麽打開?在即時錯誤中,有些是Visual Baisc能指出錯誤所在的,有些是程式師能預料的、能讓Visual Baisc自動處理的。 在程式調試過程中,VBA提供了各種強有力的調試工具來查找和糾正錯誤。 1.使用中斷模式 中斷模式是指在程式執行過程中被暫時停止。此時所有變數、屬性、運算式之值都維持在最新的狀態,可以進行分析、測試或是重新設置等,以便檢錯糾錯。 進入中斷模式的方法有以下幾種: 單步執行:按F8鍵。單步執行類似在下一條語句上設置中斷點,執行當前語句並清除中斷點。單步執行時,可觀察每條語句的執行情況。 設置中斷點:單擊要設置中斷點的語句行的左側邊界區域;或從“調試”功能表中選“切換中斷點”命令。相應語句行左側出現一個深紅色圓點,該行也以深紅色背景顯示。 設置臨時中斷點(即只用一次的中斷點):單擊要設置中斷點的語句行,從“調試”功能表中選“運行到游標處”命令。 在巨集程式中需中斷處加入Stop語句。 在宏執行時,按Ctrl+Break鍵。 在巨集執行時,産生即時錯誤,程式自動進入中斷模式。 符合監視運算式的條件與設定,程式進入中斷模式。 2.利用各種窗口 在VBA程式設計環境中,提供了“代碼”視窗、“本地”視窗、“立即”視窗、“監視”視窗、“工程”視窗、“屬性”視窗和“物件瀏覽器”視窗等7個視窗。從“查看”功能表中選擇相應的命令可以顯示出這些視窗。其中,“代碼”視窗、“本地”視窗、“立即”視窗、“監視”視窗是調試程式的得力工具。 “代碼”窗口:在中斷模式下運行巨集時,可以通過“代碼”視窗來仔細地觀察巨集的執行過程,也可以通過將滑鼠指標指向某變數來檢測變數的值。此時,在“代碼”視窗內,準備執行的語句以黃色高亮方式顯示,在其左邊有一個黃色箭頭。“本地”窗口:在運行一個宏時,可以通過“本地”視窗觀察巨集程式所使用的變數、運算式、物件的變化來尋找程式錯誤;也可在“本地”視窗直接改變屬性值,這與用VBA語句改變屬性具有同樣的效果;還可以通過“本地”視窗快速瀏覽某個物件的所有屬性。它清楚地顯示了哪些是包含值的屬性(在值欄中有值的屬性)和哪些是包含物件引用的屬性(在旁邊有加號的屬性)。通過單擊屬性的值看它能否改變,能很容易地發現具有值的屬性是不是唯讀的。 “立即”窗口:在程式調試中,有時需要給某一變數指定一個新值,或輸出顯示某些變數的值,對此使用“立即”視窗最爲方便。在“立即”窗口,可以輸入任何語句並立即執行它。例如,要查看活動工作簿中所有工作表的名稱,則可在“立即”窗口中鍵入語句For Each x in Workskeets: ?x.Name:Next x。通常,在“立即”窗口中,一條語句占一行,當多條語句排列在一行上時,要用冒號將其分開。並且在“立即”窗口中大都使用簡短、無意義的變數名,這並不影響語句的執行。 “監視”視窗:在執行巨集前,或進入中斷模式後,打開“監視”視窗,添加監視運算式以便觀察關鍵的測試變數或運算式隨巨集執行的變化情況。在“監視”視窗中添加監視運算式的方法是:使用滑鼠選中監視運算式,再單擊“調試”功能表上的“添加監視”或“快速監視”命令。要移去監視的變數,只需單擊該變數,再按Del鍵。 3.錯誤處理 當發生即時錯誤時,VBA一般會顯示一個錯誤資訊對話方塊,進入中斷模式。對於這樣的錯誤,在巨集設計中可以採用程式加以控制、監測錯誤,這種方法稱爲“錯誤捕獲”。它可檢測出錯誤並控制程式的流向。 設置忽略錯誤 語句1:On Error Resume Next 表示:若發生錯誤,則忽略它,跳到下一條語句繼續執行。 語句2:On Error GoTo 行號(或標號) 表示:若運行有錯,則跳到標號指定位置,轉去執行錯誤處理常式。 獲取錯誤資訊 在宏執行過程中,可以通過專用調試物件Err的屬性值來瞭解是否發生即時錯誤以及發生了什麽樣的錯誤。若Err.Number值爲0,則表明沒有産生錯誤,反之有錯誤。 下面通過兩個例子說明如何使用錯誤捕獲技術。 例1,假設有一學生檔案工作簿StudentBook,其中已有若干學生檔案工作表Student1、Student2以及其他一些工作表。現需要建立一個新的Student學生檔案工作表,但又不想刪除已有的Student工作表,如同Excel增加新工作表一樣,只是將工作表名稱的尾碼加1。則實現這一功能的VBA巨集程式如下所示: Sub MakeNextStudent( )Dim Sheet As WorksheetDim Base As StringDim Suffix As IntegerSet Sheet = WorkSheets.AddBase = “Student”Suffix = 1On Error Resume Ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业节能减排的技术与政策探讨
- 工业电机故障诊断与维护策略
- 工业设计在产品创新中的价值
- 工业节能的智慧能源管理
- 工业设计与产品创新表达
- 工业设计产品外观的色彩搭配与创新性
- 工作环境对教师工作满意度的影响
- 工厂企业消防安全管理
- 工程机械设备安全防护技术
- 工厂环境与职业健康安全培训
- 公司岗位价值评估报告
- GB 39496-2020 尾矿库安全规程
- 中国华电集团公司火电厂烟气脱硫工程(石灰石-石膏湿法)设计导则(A版)
- 译林版五下英语作文范文系列一
- 《小学英语小组合作学习的研究》课题结题报告
- 设计失效模式分析报告(DFMEA)
- 事业单位专业技术岗位说明书(小学)
- 广东省中医药文化养生旅游
- 试验设计与数据处理作业333333
- 树脂胶水物质资料安全表(MSDS)
- 降低给药错误发生率.pptx
评论
0/150
提交评论