[英]VBA Excel simple Error Handling
我盡可能多地在線查看(除了 Microsoft 支持網站,該網站因某種原因在工作中被屏蔽)。 我試圖簡單地跳過一個錯誤。 我在這里編寫的代碼經過簡化,但應該以相同的方式工作。
我的代碼應該做什么:我的一個子程序在循環中創建形狀並命名它們(btn_1、btn_2 等)。 但在創建它們之前,它會調用一個試圖刪除它們的子程序,以免創建重復項。 該子循環遍歷(btn_1、btn_2 等)並使用以下命令刪除形狀:
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
當然,碰巧無法刪除該形狀,因為它根本不存在。 我發現大多數情況下,推薦的修復方法是在設置形狀之前添加(下一個錯誤恢復),因為我收到一個錯誤說它不存在。 我在循環內部、循環之前等嘗試過,如下所示:
for i = 1 to (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
據我所知,如果形狀不存在,它應該直接循環,但是無論我接下來是否添加 On error resume,我仍然會遇到相同的錯誤! 我究竟做錯了什么?
編輯:當形狀確實存在時沒有錯誤。
我發現大多數情況下,推薦的修復方法是在設置形狀之前添加(下一個錯誤恢復),因為我收到一個錯誤說它不存在。
處理運行時錯誤的推薦方法不是將它們推到地毯下並繼續執行,就好像什么也沒發生一樣 - 這正是On Error Resume Next
所做的。
避免運行時錯誤的最簡單方法是檢查錯誤條件,並避免執行導致 100% 失敗率的代碼,例如嘗試在Nothing
對象引用上運行方法:
For i = 1 To (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
If Not shp Is Nothing Then shp.Delete
Next
如果您無法檢查錯誤條件並且必須處理錯誤,推薦的方法是處理它們:
Private Sub DoSomething()
On Error GoTo CleanFail
'...code...
CleanExit:
'cleanup code here
Exit Sub
CleanFail:
If Err.Number = 9 Then 'subscript out of range
Err.Clear
Resume Next
Else
MsgBox Err.Description
Resume CleanExit
End If
End Sub
使用OERN ( On Error Resume Next ) 並沒有錯,只要您了解自己在做什么以及它將如何影響您的代碼。
在您的情況下,使用 OERN 是完全正常的
Dim shp As Shape
For i = 1 To (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.Delete
On Error GoTo 0
Next
同時確保你不要做類似的事情
On Error Resume Next
<Your Entire Procedure>
On Error GoTo 0
這將抑制所有錯誤。 使用適當的錯誤處理,如 Matt 所示
編輯:
這是另一個關於如何使用OERN 的漂亮示例。此功能檢查特定工作表是否存在。
Function DoesWSExist(wsName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Sheets(wsName)
On Error GoTo 0
If Not ws Is Nothing Then DoesWSExist = True
End Function
如果您願意,還可以遍歷所有工作表以檢查工作表是否存在!
與其試圖盲目地刪除形狀和跳過錯誤,不如遍歷已知形狀的列表並刪除它們。 這樣您就不必擔心經常被濫用的On Error Resume Next
。
Sub Test(TheSheet As Worksheet)
Dim Shp as Shape
For Each Shp in TheSheet.Shapes
If left(Shp.Name, 4) = "btn_" Then
Shp.Delete
End if
Next
End Sub
如果要刪除所有形狀,請刪除If
語句。 如果要刪除多個不同命名的形狀,請適當修改If
語句。
聽起來您設置了錯誤的錯誤捕獲選項。 在 VBA 編輯器中,選擇Tools -> Options
。 在打開的窗口中,選擇General tab
,然后選擇Break on Unhandled Errors
單選按鈕。 這應該允許 Excel 正確處理On Error Resume Next
命令。
我懷疑您選擇了Break on All Errors
。
嘗試:
On Error Resume Next
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
if err<>0 then err.clear else shp.delete
next
on Error Goto 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.