Excel VBA出錯時給出的錯誤信息極少,需要充分利用各種工具來進行調試。
1.編譯錯誤
常見的編譯錯誤有:
錯誤的源代碼格式,比如if后面缺少then:在編輯器中該行會變成紅色。
錯誤的語法結構,比如if和end if沒有對應上:代碼運行前會給出編譯錯誤提示。
類型不匹配:函數輸入的參數與定義時的參數類型不同時會出現該類錯誤。
變量未定義:指使用了沒有申明的變量類型(當Option Explicit時)
建議:
格式規范化,嚴格縮進。VBA插件Smart Indent是一個很好的輔助工具。這樣做讓源代碼更具備可讀性,從而更快檢測源代碼格式和語法結果錯誤,。
勾選上「工具——選項——編譯器——要求變量聲明」,或者在每個代碼模塊最前面手工加上 Option Explicit 。在代碼編輯中,很多錯誤只是因為手誤,這個選項會讓編譯器強制檢查變量申明,從而在編譯時便發現錯誤。
2.運行中出錯或者運行結果錯誤
當程序編譯沒有問題,但運行中出錯或者運行的結果與想象中不符,就需要用到VBA的調試功能。下面是VBA提供的幾個重要的調試功能,這些功能能讓程序停在某些特定的位置上等待檢查:
F9:設置程序斷點,在代碼左側欄點擊有相同效果。重新按F9即取消斷點。
F8:單步跟蹤,當調用子函數會跟蹤到子函數內部
Shift+F8:單步跟蹤,但不會進入子函數內部
Ctrl+Shift+F8:跳出正在跟蹤的函數,直接返回上一層函數。
F5:運行程序,直到出現錯誤、程序結束或程序斷點為止
Ctrl+F8:運行程序,直到出現錯誤、程序結束、程序斷點或當前光標所在行為止
debug.print var:在立即窗口中顯示var的值
debug.assert var:當var==false時程序自動停止
以上命令也可在菜單和命令欄中獲取。
在調試過程中,可通過下面幾種方法查看各個變量的值,當變量和預期不一樣時,也就找到了程序出錯的原因,便能對照修改:
立即窗口(快捷鍵Ctrl+G):在該窗口里會顯示debut.print的結果值,以及隨時計算和運行代碼。在代碼前面添加「?」,可以在立即窗口中顯示運行結果。
監視窗口:可以將變量以及表達式添加到監視窗口,可以實時查看變量和表達式的值。支持將代碼窗口里的變量和表達式拖入到見識窗口
本地窗口:本地窗口里可以查看目前的local變量和global變量的變量值。
編輯窗口:將鼠標停在編輯窗口的變量上可顯示該變量的值。
有一些方法可減少程序錯誤以及降低調試的難度:
添加重要的代碼注釋。
源代碼格式規范化,增加代碼可讀性。VBA插件Smart Indent是一個很好的輔助工具。
盡可能聲明變量類型,少用Variant變量。
注意函數的參數傳遞方式,默認為傳引用,子函數會修改變量的值。
盡量將功能函數化,不同的功能分開寫。
避免在VBA中引用絕對地址,如Range("A1")。可先在Excel中定義名稱"abc=$A$1",然后引用Range("abc")。
避免使用ActiveSheet, ActiveWorkbook等可變變量,用Sheet1,ThisWorkbook這種絕對變量。絕對變量不受外界操作影響。
出處:http://www.elsyy.com/s/article/view-2473-11703
========================================================================
VBA測試與錯誤處理
1.測試
測試代碼,檢查它是否正確。為確保代碼能夠正常作用,必須盡力模擬代碼運行的不同環境,並檢查其正確性。
程序中的錯誤一般分為如下幾類:
(1)語法錯誤(如輸入時關鍵字或標點符號拼寫錯誤) 。
(2)編譯錯誤(如使用對象的方法時,該對象並不支持這個方法) 。
(3)運行期間錯誤(如除0、打開或關閉並不存在的文檔、關閉未打開的文檔等) 。
(4)邏輯錯誤(邏輯鍺誤是最難查找的錯誤類型,它們是由程序中使用的邏輯引起的。
2.調試
要確保代碼中的變量和表達式按照預想的方式運行,可以使用VBA中的各種調試工具跟蹤它們。VBE有以下調試工具。
(1) 中斷模式
①進入中斷模式方法:在過程的開始位置按下F8鍵(“逐語句”執行)。使用“切斷斷點“(F9鍵或者單擊當前空白指示器欄)。使用Stop語句。當過程運行時,按下Ctrl+Break鍵。使用運行期間錯誤MsgBox對話框。
②退出中斷模式方法:從運行菜單中選擇“運行子過程/用戶窗體)”;或者按下F5鍵,或者單擊“調試”工具欄上的“運行子過程/用戶窗體”按鈕。從“運行”菜單中選擇“重新設置”選項,或者單擊“調試”工具欄上的“重新設置”按鈕。
(2) 單步執行過程
① 單步執行過程:從“調試”菜申中選擇“逐過程”選項,或者按下Shift+F8鍵。
②跳出過程(跳過程剩余部份):從“調試”菜單中選擇“跳出”選項,或者按下Ctrl十shift十F8鍵。
③運行到光標處(跳過一組語句):從“調試”菜單中選擇“運行到光標處”或按下Ctrl+F8鍵。
④設置下一條語句為光標所指語句(要警惕會忽略不執行中間的語句):從“調試”菜單中選擇“設置下一條語句”或者按下Ctrl十F9鍵。
⑤“顯示下一條語句”選項指明下一個將要執行的語句是什么。當需要在程序窗口中監視很多過程、卻丟失了跟蹤時,就可使用這個調試功能。
(3) 監視過程
①“本地”窗口(顯示當前過程中使用所有變量及其值,還會顯示當前加載窗體和控件的屬性。):從“視圖”菜單中選“本地窗口”選項。
②“調用堆棧”對話框(查看所有活動的過程調用):從“視圖”菜單中選“調用堆棧”或按下Ctrl+L鍵。
③“立即窗口”(可查詢並設置變量值,創建或撤銷對象,執行單行命令)。從“視圖”菜單中選擇“立即窗口”或按下Ctrl+G鍵。
④“監視窗口”(是一個調試工具,在中斷模式下可使用它更改變量和表達式的值,以查看不同的值如何影響代碼)。從“視圖”菜單中選擇。
3.預防錯誤
(1)注釋 。
(2)縮進代碼:Tab鍵或啟用Too1s(工具)菜單選Options(選項)Editor(編輯器)選項卡中的Auto Indent(自動縮進)。
(3)使代碼模塊化。
(4)顯式聲明變量:使用Option Explicit語句,或啟用工具菜單選“選項”編輯器選項卡中的“需要變量聲明”復選框。
(5)避免使用變體Variant(當某變量可能包含NULL值時就只能惟一指定Variant類型了)。
(6)打開語法檢查:啟用工具菜單選“選項”編輯器選項卡中“自動語法檢測”。
(7)謹防Dim陷阱:Dim str1, str2 As String '並未聲明str1變量。
4.錯誤處理
調試只能夠發現可以預測的錯誤,要處理不可預測的和不可避免的錯誤時,就必須使用錯誤處理。通過啟用錯誤處理,捕獲並提示錯誤處理,可以使程序更健壯。就可以使應用程序更穩定、更健壯。如果應用程序中包含了好幾個過程,那么可以考慮采用集中式錯誤處理程序。
(1) 捕獲錯誤:On Error Goto line (On Error Goto 0會在當前過程禁用錯誤處理程序) 在這個語法中,line指定了發生運行期間錯誤時控制將跳轉到的代碼行。
(2) 編寫錯誤處理程序:給用戶顯示錯誤信息;提示補救方法;允許繼續或取消操作。使用Err對象:
屬性 |
說明 |
Number |
存儲最后一個錯誤的數字ID。這是默認屬性 |
Description |
存儲說明錯誤的有關信息 |
Source |
包含發生了錯誤的對象名或應用程序名 |
HelpFile |
包含幫助文件的名字 |
HelpContextID |
包含錯誤號對應的幫助上下文ID |
LastDLLError |
包含最后一次調用DLL的系統錯誤代碼 |
Raise方法可以讓用戶自定義錯誤處理信息,還可把錯誤處理信息傳回調用過程: Err.Raise number[, source, description, helpFile, helpContext]
Clear方法清除Err對象的所有屬性值:Err.Clear (當調用On Error, Exit Sub, Exit Function, Exit Property, Resume 等語句時,會自動調用Err.Clear方法。)
(3) 退出錯誤處理程序:
①0n error Resume:當錯誤處理程序已經修復錯誤后,可以用它來返回控制給引起錯誤的語句。但注意如果錯誤還在的話,會引起無限循環。
②0n error Resume Next:忽略錯誤語句,繼續下一句。
③Resume [LineLabel]: 把控制傳遞給行標號(必須和Resume語句處在同一個過程中)所在點的語句。
④也可使用Exit Sub或者Exit Function甚至End語句退出已產生錯誤的過程,但這些語句應放在錯誤處理程序之前,這樣當未產生錯誤時就不會執行錯誤處理程序。
出處:http://blog.163.com/xing_aixin/blog/static/372355052008377252250/