除錯

除錯是一種非常強大的方法,可以仔細檢視並修復錯誤的工作(或非工作)程式碼。

逐步執行程式碼

在除錯過程中,你需要做的第一件事是在特定位置停止程式碼,然後逐行執行程式碼以檢視是否發生了預期的情況。

  • 斷點( 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")
  • 描述哪一行給出了錯誤的行為,以及它是什麼(錯誤,錯誤的結果……)