2022年8月3日 星期三

vba 偵錯入門(二)

在vba 偵錯入門一文中,透過resume 方式找到那一行指令有誤,但!!!!

很多時候其實是來源資料的問題說,這時候該怎辦呢!

小編 自己小小經驗是 做自動除錯功能來讓工作更順利。

但滿多教科書都是以資料要優先處理後,確認資料無異常後,方執行執行程式的。

小編 僅是分享一點自己在debug的經驗歐,供作參考。


 example4:

on error goto line1

a = 1

b = 0

c = a / b

line1:

MsgBox Err.Description & ";" & Err.Number '這行筆者加的,讓錯誤變成對話框內容

DEBUG.PRINT Err.Description & ";" & Err.Number   '這行筆者加的,讓錯誤顯示在即時運算畫面當中。

RESUME ' '這行筆者加的的目的,是要顯示錯誤行別 記得要點反紅點

更新成自動除錯版:

example4:

On Error GoTo line1

a = 1

b = 0

c = a / b

line2:

         Exit Sub

line1:

If Err.Number = 11 Then

    If b = 0 Then

            c = "error"

            On Error GoTo 0

            GoTo line2

    End If

End If

但這邊問題還是會衍生一些小問題存在的,有測試就知道。

先賣關子,後面會有解說

所以當a與b都變成是陣列變數時,就可以快速帶入error的判斷在資料集中,不會因為一筆資料就需要重新debug了。

自動除錯 在升級,前面有提到賣關子 ㄏㄏ

其實前面提的方式有一個小缺點就是錯誤僅能產生一次,第二次產生時就會失效!!!

那怎辦?

思考運算改成單獨SUB,每一個獨立的SUB其實都是個體戶,每次重新呼叫都是一個新的個體,當執行結束後,會從記憶體中洗掉,來看看怎做。

 example4:

on error goto line1

a = 1

b = 0

c = a / b

line1:

MsgBox Err.Description & ";" & Err.Number '這行筆者加的,讓錯誤變成對話框內容

DEBUG.PRINT Err.Description & ";" & Err.Number   '這行筆者加的,讓錯誤顯示在即時運算畫面當中。

RESUME ' '這行筆者加的的目的,是要顯示錯誤行別 記得要點反紅點

更新成自動除錯版:

example4:

Sub A1()

A = Array(0, 1, 2, 3, 4, 5, 6, 7)

B = Array(0, 1, 2, 3, 4, 5, 6, 7)

           For I = 0 To 6 Step 1

                Call A2(A(I), B(I), I)

           Next I

End Sub

Sub A2(A, B, I)

On Error GoTo line1

C(I) = A / B

Exit Sub

line1:

            C(I) = "error"

End Sub

範例如上操作,把錯誤留給可以擦掉的白板 XD

簡單說明:

SUB A1丟資料給SUB A2計算,當出現錯誤,就用ERROR寫入C陣列中,嚴格說起來也不算除錯,以上。


 



沒有留言:

張貼留言

打破人力資源最好的教案:川普

打破人力資源最好的教案: 川普 why? 過去討論人才       好用、解決問題,多少證照,還是產值? 現在討論人的重量?      重量如同金錢一樣      一公升92汽油多少錢?      淋在人身上跟加在車輛內會衍生多少"量化"? 對主管來說,人的重...