Lo que está viendo es un error de compilación que indica que una palabra clave Else (o ElseIf) no fue precedida por una declaración If correcta.
Es decir, el compilador encontró una declaración Else (que resaltará para el usuario) sin ver una declaración If en las líneas por encima de ella. Esto es un error porque viola la sintaxis correcta de una sentencia If-Then-Else. La sintaxis correcta es la siguiente:
Para utilizar la sintaxis abreviada de la sentencia if que especifica una condición y una acción (para cuando se cumple la condición):
Si
Entonces
Para utilizar la sintaxis estándar para una sentencia If que especifica una condición y una acción (para cuando la condición se cumple) y una acción alternativa para cuando la condición no se cumple:
Si
Entonces
Si
End if
Para especificar más de una condición (y sus acciones):
Si
Entonces
Si
Entonces
Si
End if
El error de compilación «Else sin If» se produce cuando «If
Then
» falta o está escrito incorrectamente. Vamos a discutir las causas comunes del error más en detalles a continuación con ejemplos.
Falta de declaración If
Cuando el compilador de VBA ve que la palabra clave Else no está precedida por una declaración If reconocible (correcta), genera un error ‘Else sin If’. Para cada Else, debe haber una sentencia If. Sin embargo, para cada If, no necesitamos necesariamente una sentencia else.
Ejemplo 1: Falta una sentencia If
En este ejemplo, mostramos un cuadro de entrada que toma la entrada del usuario y la almacena en x. Entonces nos encontramos con una palabra clave Else, pero no había ninguna sentencia If antes de ella. Esto, efectivamente, provocará un error del compilador: Else sin If.
Para resolver este problema, sólo tenemos que añadir una sentencia If. Una sentencia If consiste en If
Then
.
Seguir unas buenas prácticas de indentación es crucial para reconocer si cada lógica if-else-then consiste en las palabras clave necesarias (sentencia If, palabra clave Else, palabra clave End If).
Si
Entonces
Else
Si
Entonces
Else
Fin If
Fin If
Ejemplo 2: La sentencia Else está dentro de un bucle y la sentencia If está fuera
Puede que se sorprenda de que esté obteniendo el error cuando ya tiene la sentencia If presente en el código y colocada antes de la palabra clave Else y escrita correctamente. El problema puede no ser evidente a primera vista. Pero si miramos más de cerca, veremos que el ámbito de la sentencia If es diferente al de la sentencia else.
Todo lo que hay entre la sentencia If y la palabra clave End If pertenece al ámbito de esta sentencia If. También pueden existir otros ámbitos en el código debido a la existencia de bucles como el bucle For Next, el bucle Do Until o el bucle For Each Next.
Existe un ámbito cuando una sentencia lógica requiere múltiples palabras clave para indicar los puntos de inicio y final de la sentencia. Se produce un problema si se superponen los ámbitos de manera que uno se coloca parcialmente dentro del otro. La forma correcta de hacer que varios ámbitos funcionen entre sí es colocar uno totalmente dentro del otro.
En el siguiente ejemplo, If
Then
está seguido por el comienzo de un bucle For
seguido por la palabra clave Else
. Esto separa la sentencia If y la palabra clave Else y hace que aparezca el error.
Sub Else_Without_If()x = InputBox("Set x value")'iniciando el ámbito de la sentencia IfSi x = 1 Then MsgBox "el valor de x es igual a 1" 'iniciando un nuevo ámbito (bucle For Next) For R = 1 To 5'La palabra clave Else está separada de su sentencia If porque está en un ámbito diferente.Else Next R MsgBox "el valor x no es igual a 1 "End IfEnd Sub
Para solucionar el problema, nos aseguramos de que la sentencia lógica If en su conjunto está totalmente englobada dentro del bucle For. O que el bucle For esté totalmente englobado dentro de la acción de la sentencia lógica If; entre If y Else o entre Else y End If.
Como regla general, si una sección de su código tiene un cierto estado debido a que tiene un punto de inicio y de finalización (If – Else, Else – End If, For – Next, Do – Until) entonces no puede iniciar otra sección (ámbito) dentro de ella sin finalizarla dentro de la primera sección.
Punto de inicio (If, Else, For, Do)
Otro punto de inicio
Hacer algo
Otro punto de finalización
Punto de finalización (Else, End If, Next, Until)
Para aplicar esto a nuestro ejemplo, lo cambiamos por el siguiente código;
Sub Else_Without_If()x = InputBox("Set x value")'iniciando la sentencia if scopeIf x = 1 Then MsgBox "x value is equal to 1" 'iniciando un nuevo scope (For Next loop) For R = 1 To 5 MsgBox "x value is equal to 1" 'terminando el nuevo ámbito dentro del mismo ámbito en el que se inició Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Ejemplo 3: Colocación de la acción en la misma línea con la sentencia If
Otro error muy común que se suele cometer es escribir la sentencia If de forma incompatible con la utilización de la palabra clave Else.
Si queremos utilizar la palabra clave Else, debemos colocar la parte de acción de la lógica If-Then-Else en la siguiente línea después de la sentencia If. Si no estamos utilizando la palabra clave Else, entonces podemos colocar la acción en la misma línea que la sentencia If y no escribimos la palabra clave Else o la palabra clave End If.
Cuando la acción (que debe llevarse a cabo si la condición es verdadera) se coloca en la misma línea que la sentencia If, entonces la sentencia If se considera completa. Esto se considera una forma abreviada de escribir la lógica If – then.
Es por eso que cuando el compilador encuentra una palabra clave Else después de eso, no encuentra una sentencia If que pertenezca a la palabra clave Else, porque esa sentencia If se ha completado con la colocación de la acción en la línea como la sentencia If. El siguiente código NO es correcto y provocará el error del compilador: Else sin If.
La acción (MsgBox "valor x es igual a 1"
) debe colocarse en la siguiente fila después de la sentencia If para poder tener una sentencia Else utilizada en la lógica If-Then-Else. En el siguiente código, hemos movido la declaración de acción a la siguiente línea, lo que soluciona el problema.
Ahora hemos cubierto todas las posibles causas de error de compilación: Else sin if. Para recapitular, si obtiene este error, compruebe si
1) Hay una sentencia If en su lugar que precede a la palabra clave Else.
2) La línea de la sentencia if no contiene nada más que If
Then
.
3) Compruebe que la sentencia If y la palabra clave Else no están separadas por otro ámbito o sección, como los bucles.
Vea también: Cómo solucionar el error «End If sin bloque If»