Els gestors d'errors us permeten especificar què passa quan es troba un error mentre s'executa el codi de macro d'Excel. Els gestors d'errors són línies semblants a les següents:
En cas d'error GoTo MyError
Sense gestors d'errors, qualsevol error que es produeixi al vostre codi demanarà a Excel que activi un missatge d'error poc útil que normalment no transmetrà clarament el que ha passat. Tanmateix, amb l'ajuda dels controladors d'errors, podeu optar per ignorar l'error o sortir del codi amb gràcia amb el vostre propi missatge a l'usuari.
Hi ha tres tipus de declaracions d'error:
-
En cas d'error GoTo SomeLabel: el codi salta a l'etiqueta especificada.
-
En cas d'error Resume Next: l'error s'ignora i el codi es reprèn.
-
En cas d'error GoTo 0: VBA es restableix al comportament normal de comprovació d'errors.
En cas d'error GoTo SomeLabel
De vegades, un error al vostre codi significa que heu de sortir del procediment amb gràcia i donar als vostres usuaris un missatge clar. En aquestes situacions, podeu utilitzar la instrucció On Error GoTo per dir a Excel que salti a una determinada línia de codi.
Per exemple, a la petita part de codi següent, dieu a Excel que divideixi el valor de la cel·la A1 pel valor de la cel·la A2 i, a continuació, col·loqueu la resposta a la cel·la A3. Fàcil. Què podria sortir malament?
Sub macro1()
Interval("A3").Valor = Interval("A1").Valor / Interval("A2").Valor
End Sub
Com a resultat, dues coses principals poden sortir malament. Si la cel·la A2 conté 0, obteniu un error de divisió per 0. Si la cel·la A2 conté un valor no numèric, obtindreu un error de no coincidència de tipus.
Per evitar un missatge d'error desagradable, podeu dir a Excel que En cas d'error, voleu que l'execució del codi salti a l'etiqueta anomenada MyExit.
Al codi següent, l'etiqueta MyExit va seguida d'un missatge a l'usuari que ofereix un consell amigable en lloc d'un missatge d'error desagradable. Tingueu en compte també la línia Sub-eixida abans de l'etiqueta MyExit, que assegura que el codi simplement sortirà si no es troba cap error:
Sub macro1()
En cas d'error GoTo MyExit
Interval("A3").Valor = Interval("A1").Valor / Interval("A2").Valor
Sortir de Sub
La meva sortida:
MsgBox "Si us plau, utilitzeu números vàlids diferents de zero"
End Sub
En cas d'error Reprèn Següent
De vegades, voleu que Excel ignori un error i simplement reprèn l'execució del codi. En aquestes situacions, podeu utilitzar la instrucció On Error Resume Next.
Per exemple, el següent fragment de codi està destinat a suprimir un fitxer anomenat GhostFile.exe del directori C:Temp. Després de suprimir el fitxer, un quadre de missatge agradable indica a l'usuari que el fitxer ha desaparegut:
Sub macro1()
Elimina "C:TempGhostFile.exe"
MsgBox "El fitxer s'ha suprimit."
End Sub
El codi funciona molt bé si realment hi ha un fitxer per esborrar. Però si per algun motiu el fitxer anomenat GhostFile.exe no existeix a la unitat C:Temp, es genera un error.
En aquest cas, no t'importa si el fitxer no hi és perquè l'aniries a eliminar de totes maneres. Així que simplement podeu ignorar l'error i continuar amb el codi.
Mitjançant la instrucció On Error Resume Next, el codi segueix el seu curs tant si el fitxer de destinació existeix com si no:
Sub macro1()
En cas d'error Reprèn Següent
Elimina "C:TempGhostFile.exe"
MsgBox "El fitxer s'ha suprimit."
End Sub
En cas d'error GoTo 0
Quan s'utilitzen determinades declaracions d'error, pot ser necessari restablir el comportament de verificació d'errors de VBA. Per entendre què significa això, mireu el següent exemple.
Aquí, primer voleu suprimir un fitxer anomenat GhostFile.exe del directori C:Temp. Per evitar errors que puguin derivar-se del fet que el fitxer de destinació no existeix, utilitzeu la instrucció On Error Resume Next. Després d'això, intenteu fer algunes matemàtiques sospitoses dividint 100/Mike:
Sub macro1()
En cas d'error Reprèn Següent
Elimina "C:TempGhostFile.exe"
Interval ("A3"). Valor = 100 / "Mike"
End Sub
L'execució d'aquest fragment de codi hauria de generar un error a causa de les matemàtiques difuses, però no és així. Per què? Perquè l'última instrucció que vau donar al codi va ser On Error Resume Next. Qualsevol error que es trobi després d'aquesta línia s'ignora efectivament.
Per solucionar aquest problema, podeu utilitzar la instrucció On Error GoTo 0 per reprendre el comportament normal de comprovació d'errors:
Sub macro1()
En cas d'error Reprèn Següent
Elimina "C:TempGhostFile.exe"
En cas d'error GoTo 0
Interval ("A3"). Valor = 100 / "Mike"
End Sub
Aquest codi ignorarà els errors fins a la declaració On Error GoTo 0. Després d'aquesta declaració, el codi torna a la comprovació d'errors normal i activa l'error esperat derivat de les matemàtiques difuses.