VBA Excel traitement simple des erreurs

j'ai regardé en ligne autant que j'ai pu (sauf pour le site Microsoft support, qui est bloqué au travail pour une raison quelconque). Je suis en train de tout simplement ignorer une erreur. Mon code écrit ici est simplifié mais devrait fonctionner de la même manière.

Ce que mon code est censé faire: Un de mes sous-titres crée des formes dans une boucle et les nomme (btn_1, btn_2, etc.). Mais avant de les créer, il appelle un sous qui tente de les supprimer afin de ne pas créer de doublons. Ce sous-boucles par (btn_1, btn_2, etc) et supprime les formes en utilisant:

for i = 1 to (a certain number)
    Set shp = f_overview.Shapes("btn_" & i)
    shp.delete
next

bien sûr, il arrive que la forme ne puisse pas être supprimée parce qu'elle n'existe tout simplement pas. J'ai trouvé que la plupart du temps, le correctif reccomendé est d'ajouter (sur la reprise d'erreur suivant) avant de définir la forme, comme je reçois une erreur disant qu'il n'existe pas. Je l'ai essayé, à l'intérieur de la boucle, avant la boucle, etc, comme suit:

for i = 1 to (a certain number)
    On Error Resume Next
    Set shp = f_overview.Shapes("btn_" & i)
    shp.delete
next

autant je comprends qu'il est censé boucle de droit si la forme n'existe pas, mais j'obtiens toujours la même erreur que j'ajoute ou non l'erreur sur le CV suivant! Ce que je fais mal?

EDIT: il n'y a pas d'erreur quand les formes existent.

19
demandé sur David G 2015-05-27 20:11:41

5 réponses

on dirait que vous avez la mauvaise option de piégeage des erreurs. Dans L'éditeur VBA, sélectionnez Tools -> Options. Dans la fenêtre qui s'ouvre, sélectionnez l' General tab, et de choisir les Break on Unhandled Errors bouton radio. Cela devrait permettre à Excel de traiter correctement le On Error Resume Next la commande.

je soupçonne que vous avez Break on All Errors sélectionné.

8
répondu Degustaf 2015-05-27 18:35:18

j'ai trouvé que la plupart du temps, le correctif reccomendé est d'ajouter (sur la reprise d'erreur suivant) avant de définir la forme, comme je reçois une erreur disant qu'elle n'existe pas.

Non!

La méthode recommandée pour poignée les erreurs d'exécution sont pour les pousser sous le tapis et poursuivre l'exécution comme si de rien n'était - et c'est exactement ce que On Error Resume Next ne.

La façon la plus simple de éviter runtime les erreurs sont pour vérifier les conditions d'erreur, et éviter d'exécuter du code qui entraîne un taux d'échec de 100%, comme essayer d'exécuter une méthode sur une référence d'objet qui est Nothing:

For i = 1 To (a certain number)
    Set shp = f_overview.Shapes("btn_" & i)
    If Not shp Is Nothing Then shp.Delete
Next

dans les cas où vous ne pouvez pas vérifier les conditions d'erreur et gérer les erreurs, la méthode recommandée est d' poignée:

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
23
répondu Mathieu Guindon 2015-05-27 18:49:39

au lieu d'essayer de supprimer aveuglément les formes et de sauter les erreurs, pourquoi ne pas passer en revue la liste des formes connues et de les supprimer. Ensuite, vous n'avez pas à vous soucier d'un On Error Resume Nextsouvent finit par être abusé.

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

si vous voulez supprimer toutes les formes, supprimez le If déclaration. Si vous voulez supprimer un certain nombre de formes nommées différemment, modifiez le If déclaration de façon appropriée.

13
répondu FreeMan 2015-05-27 17:22:34

il n'y a rien de mal à utiliser OERN ( On Error Resume Next) pourvu que vous compreniez ce que vous faites et comment cela va affecter votre code.

dans votre cas, il est parfaitement normal d'utiliser 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

en même temps assurez-vous que vous ne faites pas quelque chose comme

On Error Resume Next
<Your Entire Procedure>
On Error GoTo 0

ceci supprimera toutes les erreurs. Utilisez la bonne gestion des erreurs comme indiqué par Matt

Modifier:

Voici un autre bel exemple sur la façon d'utiliser OERN cette fonction vérifie si une feuille de travail existe ou non.

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

Si vous le souhaitez, vous pouvez également parcourir toutes les feuilles à vérifier est la feuille existe ou pas!

13
répondu Siddharth Rout 2015-05-27 17:50:42

Essaie:

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
2
répondu nutsch 2015-05-27 22:11:37