Excel VBA 程式設計教學:除錯技巧與錯誤處理

這裡介紹各種處理 VBA 程式的除錯技巧與錯誤處理用法,並提供幾個基礎範例。

在 Excel 中使用 VBA 撰寫程式,難免都會遇到程式出問題的狀況,例如程式跑不出來,或是執行結果不正確等,通常程式的問題可分為兩種,一種是程式開發者不小心所造成的臭蟲(bug),例如程式設計不良、程式碼打錯字等,這種狀況就要在開發程式時,使用 VBA 的各種除錯技巧把問題找出來。

另外一種狀況是程式本身沒問題,但使用者操作不當所造成的錯誤(error),例如輸入錯誤的資料、或是程式需要讀取的檔案不存在等,遇到這類的問題就要撰寫 VBA 的錯誤處理程式碼,針對各種錯誤進行妥善的處理。

除錯技巧(Debug)

開發 VBA 程式時,在撰寫好程式碼之後,都會先測試一下,看看執行的結果如何,若要測試 VBA 程式碼的執行狀況,最方便的做法就是善用 Visual Basic 的開發工具。

若要測試某個子程序(Sub)的執行狀況,可將游標移動到該子程序中,這時候視窗右上角的子程序名稱會即時顯示目前游標所在的子程序名稱,接著按下工具列上面的執行按鈕,這樣就可以立刻執行這個子程序,觀察執行結果。

測試 VBA 程式

如果程式出現問題時,就會出現類似這樣的錯誤訊息視窗,這時候如果要檢查錯誤的程式碼,可以選擇「偵錯」。

VBA 程式錯誤訊息

點選「偵錯」之後,就會開啟中斷模式的程式碼視窗,並顯示目前程式出問題的位置。

VBA 程式錯誤位置

如果遇到語法錯誤、打錯字等比較單純的問題,我們可以透過檢查出問題的程式碼,找出問題的所在,但如果是邏輯性的問題,可能就要查看程式執行時,每個變數的實際內容。

在中斷模式中,我們可以將滑鼠移動到要觀察的變數上,這樣就可以立即查看變數的內容,幫助我們找出問題點。

顯示變數內容

如果程式碼中有比較複雜的運算,也可以用滑鼠把運算式子選取起來,這樣它就會顯示運算出來的數值。

程式中斷點

如果遇到程式執行都沒有出現錯誤,但是執行的結果又跟預期不同,也不曉得問題在哪裡的時候,就可以考慮使用設定程式中斷點的方式來除錯。

首先在程式比較可疑的地方,使用滑鼠新增中斷點,設定好之後,再執行程式。

設定程式中斷點

設定中斷點之後,程式執行時就會在中斷點的位置暫停,讓開發者可以慢慢檢查每個變數的內容。

程式中斷點

逐行執行

如果程式要檢查的地方非常多,就可以直接使用逐行執行程式的方式來除錯。

使用 F8 逐行執行程式

按下 F8 按鍵之後,程式就會從子程序的第一行開始逐行執行,每按一下就會執行一行,而在程式執行的期間,我們都可以隨時用滑鼠來查看每個變數的內容,找出有問題的地方。

使用 F8 逐行執行程式

中斷程式執行

如果在寫迴圈時,不小心寫成了無窮迴圈,執行之後就會停不下來,就像這樣:

Dim x As Long
x = 5

' 無窮迴圈
Do While x > 2
    x = x + 1
Loop

遇到無法停止的程式,可以按下鍵盤上的 Esc 按鍵,或是 Ctrl + break 按鍵,讓程式立即停止執行。

監看式

在程式的除錯過程中,我們可能會需要觀察多個變數或運算式的內容變化,這時候就可以將有興趣的運算式選取起來,在滑鼠右鍵選單中點選「新增監看式」。

新增監看式

填入想要觀察的運算式。

新增監看式

設定好的監看式會顯示在監看式的視窗中,這樣就可以比較方便同時觀察好多的變數或是運算式。

監看式

Windows, 程式設計

6 留言

  1. YAN

    您好,想請教您一個問題,以下兩種寫法出來的結果是不同的。
    Dim eachdate, justdate As String
    eachdate = “05”
    Cells(1, 1) = eachdate

    justdate = “5”
    Cells(2, 1) = justdate

    If Cells(2, 1) = Cells(1, 1) Then
    MsgBox “great”
    End If
    ———————————–
    Dim eachdate, justdate As String
    eachdate = “05”
    Cells(1, 1) = eachdate

    justdate = “5”
    Cells(2, 1) = justdate

    If eachdate = justdate Then
    MsgBox “great”
    End If
    ——————————–
    只是改了if的條件攔位名稱,結果就不同,想問原因是什麼,感謝您。

    • xLFungx

      你把eachdate和justdate存進cells之後,cell會自動把cell format改成Number,裹面的data就變成了兩個cell都是”5″。
      所以比較兩個cell的時候它們是相同的。
      後面是因為比較string,所以2個string不相同就不相同。

  2. excel vba 程式碼的執行已被中斷

    之前都可使用 直接案下F5 就自動跑了
    現在卻 案F5 卻自動 跳出 “程式碼的執行已被中斷”
    可是案下F8 一步一步的 又很順利阿
    一案F5 又來了 自動 跳出 “程式碼的執行已被中斷” 見鬼了???

  3. Ian

    您好,想請教個問題
    為何以下function 及用with 在幫資料加框線時會無法處理第一個column ?
    要怎麼修改才能符合需求,感謝

    Function getlastrow() As Long ‘找到最后一列-資料範圍
    Dim lngReturn As Long
    Dim wks2 As Worksheet
    Set wks2 = Worksheets(2)
    lngReturn = wks2.Range(“A2”).End(xlDown).Row
    getlastrow = lngReturn
    End Function

    LastRow = getlastrow

    With wks2.Columns(“A:H” & CStr(LastRow)) ‘調整儲存格範圍
    .HorizontalAlignment = xlCenter ‘文字置中對齊
    .VerticalAlignment = xlCenter
    .Font.Name = “calibri” ‘字型
    .Font.Size = 10 ‘字型大小
    .Borders().LineStyle = xlNone ‘儲存格框線的線條樣式
    .Borders().Weight = xlThin ‘儲存格框線粗細設定
    End With

  4. 鄭學隆

    請問現在還有人回答問題嗎?

  5. 徐墩煌

    您好:
    我的Excel是2016版本,執行VBAproject系統提示(不支援此語法)
    .Connection = _
    “URL;https://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43_print.php?l=zh-tw&d=” & Sheets(“設定”).Range(“B5”).Value & “&stkno=” & Sheets(“設定”).Range(“B1”).Value & “&s=0”
    請解惑,謝謝!

Comments are Closed