簡體   English   中英

VBA Excel 簡單的錯誤處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM