除錯
除錯是一種非常強大的方法,可以仔細檢視並修復錯誤的工作(或非工作)程式碼。
逐步執行程式碼
在除錯過程中,你需要做的第一件事是在特定位置停止程式碼,然後逐行執行程式碼以檢視是否發生了預期的情況。
- 斷點( F9,Debug - Toggle 斷點):你可以向任何已執行的行新增斷點(例如,不對宣告),當執行到達該點時停止,併為使用者提供控制。
- 你還可以將
Stop
關鍵字新增到空白行,以使程式碼在執行時停止在該位置。例如,如果在無法新增斷點的宣告行之前,這很有用 F9 - Step into( F8,Debug - Step into):只執行一行程式碼,如果是一個使用者定義的子/函式的呼叫,則逐行執行。
- 跳過( Shift + F8,除錯 - 跳過):執行一行程式碼,不進入使用者定義的子/函式。
- 跳出( Ctrl + Shift + F8,除錯 - 跳出):退出當前子/功能(執行程式碼直到結束)。
- 執行到遊標( Ctrl + F8,除錯 - 執行到遊標):執行程式碼直到到達游標所在的行。
- 你可以使用
Debug.Print
在執行時將行列印到立即視窗。你也可以使用Debug.?
作為Debug.Print
的快捷方式
手錶視窗
逐行執行程式碼只是第一步,我們需要了解更多細節,其中一個工具是監視視窗(View - Watch 視窗),在這裡你可以看到已定義表示式的值。要將變數新增到監視視窗,請執行以下任一操作:
- 右鍵單擊它,然後選擇新增手錶。
- 在監視視窗中單擊滑鼠右鍵,選擇新增監視。
- 轉到除錯 - 新增手錶。
新增新表示式時,你可以選擇是僅檢視其值,還是在程式碼執行時或在其值發生更改時中斷程式碼執行。
即時視窗
即時視窗允許你執行任意程式碼或列印專案,在它們之前使用 Print
關鍵字或單個問號“?
”
一些例子:
? ActiveSheet.Name
- 返回活動工作表的名稱Print ActiveSheet.Name
- 返回活動工作表的名稱? foo
- 返回foo
*的值x = 10
設定x
到 10 *
*通過立即視窗獲取/設定變數值只能在執行時進行
除錯最佳實踐
每當你的程式碼沒有按預期工作時,你應該做的就是仔細閱讀它,尋找錯誤。
如果這沒有用,那就開始除錯吧; 對於簡短的程式,逐行執行它可能是有效的,對於較長的程式,你可能需要在觀察的表示式上設定斷點或中斷,這裡的目標是找到不按預期工作的行。
一旦你得到了給出錯誤結果的行,但原因尚不清楚,嘗試簡化表示式,或用常量替換變數,這有助於理解變數的值是否錯誤。
如果你仍然無法解決它,並尋求幫助:
- 儘可能包含程式碼的一小部分,以便了解你的問題
- 如果問題與變數的值無關,則用常量替換它們。 (所以,而不是
Sheets(a*b*c+d^2).Range(addressOfRange)
寫Sheets(4).Range("A2")
) - 描述哪一行給出了錯誤的行為,以及它是什麼(錯誤,錯誤的結果……)