Quan necessiteu fer front als errors a Excel VBA, podeu utilitzar la instrucció OnError. No obstant això, primer cal saber algunes coses. Podeu utilitzar la instrucció On Error de tres maneres.
Sintaxi |
Què fa |
En cas d'error GoTo etiqueta |
Després d'executar aquesta instrucció, VBA reprèn l'execució a la
instrucció que segueix l'etiqueta especificada. Heu d'incloure dos punts
després de l'etiqueta perquè VBA la reconegui com a etiqueta. |
En cas d'error GoTo 0 |
Després d'executar aquesta instrucció, VBA reprèn el seu
comportament normal de comprovació d'errors. Utilitzeu aquesta instrucció després d'utilitzar una de les
altres sentències On Error o quan vulgueu eliminar el tractament d'errors
del vostre procediment. |
En cas d'error Reprèn Següent |
Després d'executar aquesta instrucció, VBA simplement ignora tots els errors
i reprèn l'execució amb la següent instrucció. |
Es reprèn després d'un error
En alguns casos, simplement voleu que la rutina acabi amb gràcia quan es produeix un error. Per exemple, podeu mostrar un missatge que descrigui l'error i després sortir del procediment. (L'exemple EnterSquareRoot5 mostrat anteriorment utilitza aquesta tècnica.) En altres casos, voleu recuperar-vos de l'error, si és possible.
Per recuperar-se d'un error, heu d'utilitzar una instrucció Resume. Això esborra la condició d'error i us permet continuar amb l'execució en algun lloc. Podeu utilitzar la instrucció Resume de tres maneres.
Sintaxi |
Què fa |
Resum |
L'execució es reprèn amb la instrucció que va provocar l'error. Utilitzeu-
ho si el vostre codi de gestió d'errors corregeix el problema i
està bé continuar. |
Reprendre Següent |
L'execució es reprèn amb la instrucció immediatament després de la
instrucció que ha provocat l'error. Això bàsicament ignora l'
error. |
Etiqueta de currículum |
L'execució es reprèn a l' etiqueta que especifiqueu. |
L'exemple següent utilitza una instrucció Resume després que es produeixi un error:
Sub EnterSquareRoot6()
Dim Num com a variant
Atenuar el missatge com a cadena
Dim Ans com a nombre enter
Torna-ho a provar:
' Configura la gestió d'errors
En cas d'error GoTo BadEntry
' Demanar un valor
Num = InputBox("Introdueix un valor")
Si Num = "" Aleshores Surt Sub
' Insereix l'arrel quadrada
ActiveCell.Value = Sqr(Num)
Sortir de Sub
BadEntry:
Msg = Err.Number & “: “ & Error (Err.Number)
Msg = Missatge i vbNewLine i vbNewLine
Msg = Msg & "Assegureu-vos que s'ha seleccionat un interval",
Msg = Msg & "el full no està protegit",
Msg = Msg & "i introduïu un valor no negatiu".
Msg = Msg & vbNewLine & vbNewLine & "Torna-ho a provar?"
Res = MsgBox(Msg, vbYesNo + vbCritical)
Si Res = vbSí, reprèn la prova de nou
End Sub
Aquest procediment té una altra etiqueta: TryAgain. Si es produeix un error, l'execució continua a l'etiqueta BadEntry i el codi mostra el missatge següent. Si l'usuari respon fent clic a Sí, s'activa la instrucció Resume i l'execució torna a l'etiqueta TryAgain. Si l'usuari fa clic a No, el procediment finalitza.
Si es produeix un error, l'usuari pot decidir si ho torna a provar.
Tingueu en compte que el missatge d'error també inclou el número d'error, juntament amb la descripció de l'error "oficial".
La instrucció Resume esborra la condició d'error abans de continuar. Per veure-ho, proveu de substituir la declaració següent per la penúltima declaració de l'exemple anterior:
Si Res = vbSí, aneu a provar de nou
El codi no funciona correctament si feu servir GoTo en lloc de Resume. Per demostrar-ho, introduïu un nombre negatiu. Obteniu el missatge d'error. Feu clic a Sí per tornar-ho a provar i, a continuació, introduïu un altre número negatiu. Aquest segon error no està atrapat perquè la condició d'error original no s'ha esborrat.
Error de gestió en poques paraules
Per ajudar-vos a mantenir clar tot aquest negoci de gestió d'errors, aquí teniu un resum ràpid i brut. Un bloc de codi de gestió d'errors té les característiques següents:
-
Comença immediatament després de l'etiqueta especificada a la instrucció On Error.
-
La vostra macro només hauria d'arribar-hi si es produeix un error. Això vol dir que heu d'utilitzar una instrucció com Exit Sub o Exit Function immediatament abans de l'etiqueta.
-
Pot requerir una declaració de resum. Si trieu no avortar el procediment quan es produeix un error, heu d'executar una instrucció Resume abans de tornar al codi principal.
Saber quan ignorar els errors
En alguns casos, està perfectament bé ignorar els errors. És llavors quan entra en joc la declaració On Error Resume Next.
L'exemple següent fa un bucle per cada cel·la de l'interval seleccionat i converteix el valor a la seva arrel quadrada. Aquest procediment genera un missatge d'error si alguna cel·la de la selecció conté un número o text negatiu:
Sub SelectionSqrt()
Atenuar la cel·la com a rang
Si TypeName(Selection) <> "Range" Aleshores sortiu de Sub
Per a cada cel·la a la selecció
cel·la.Valor = Sqr(cel·la.Valor)
Següent cel·la
End Sub
En aquest cas, potser voldreu ometre qualsevol cel·la que contingui un valor que no podeu convertir en una arrel quadrada. Podeu crear tot tipus de capacitats de verificació d'errors utilitzant estructures If-Then, però podeu idear una solució millor (i més senzilla) simplement ignorant els errors que es produeixen.
La rutina següent ho aconsegueix mitjançant la instrucció On Error Resume Next:
Sub SelectionSqrt()
Atenuar la cel·la com a rang
Si TypeName(Selection) <> "Range" Aleshores sortiu de Sub
En cas d'error Reprèn Següent
Per a cada cel·la a la selecció
cel·la.Valor = Sqr(cel·la.Valor)
Següent cel·la
End Sub
En general, podeu utilitzar una instrucció On Error Resume Next si considereu que els errors són inofensius o no tenen importància per a la vostra tasca.