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.
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é.
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
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 Next
souvent 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.
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!
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