Cuando trabajamos con VBA (Macros) y Excel por lo general asignamos nombres a los rangos para facilitarnos la lectura y escritura de formulas o código VBA y en ocasiones cuando recorremos las hojas por medios de VBA necesitamos saber si en alguna hoja tenemos definido un nombre de rango especifico ya que cuando hacemos referencia a un nombre de rango en una hoja en el que no existe dicho nombre de rango ocurrirá un error. Para solucionar esto hay varios códigos en VBA que nos ayudaran a evitar esos errores.
La primera forma es con una función de Excel llamada «ISREF» o «ESREF» en ingles y español respectivamente. Lo que hace esta función es devolver verdadero cuando el rango existe y falso cuando no existe. Ejemplo:
For i=1 To Thisworkbook.Sheets.Count
If Application.Evaluate("ISREF(" & Thisworkbook.Sheets(i).Name & "!Fecha)")=True Then
Thisworkbook.Sheets(i).Range("Fecha")=Now
End If
Next
Este código recorre todas las hojas del libro actual y asigna la fecha actual al rango «Fecha» de cada hoja siempre que el rango exista en la hoja.
La desventaja que tiene esta forma de comprobar si existe un rango en una hoja determinada es que solo funciona para nombres de rango de ámbito de hoja y si no existe un rango con ámbito libro con el mismo nombre, es decir si en el ejemplo anterior hubiera un nombre de rango de ámbito libro llamado «Fecha» el código siempre devolvería verdadero ya que Excel automáticamente al no encontrar el nombre de rango en la hoja especificada busca si existe el rango en el ámbito libro y si lo encuentra devuelve verdadero.
La segunda forma es con esta función.
Function ExisteRango(Hoja As String, NombreRango As String) As Boolean
On Error Resume Next
Dim valor As String
Err.Clear
valor = ThisWorkbook.Sheets(Hoja).Range(NombreRango)
If Err.Description <> "" Then
ExisteRango = False
Else
ExisteRango = True
End If
End Function
Esta función intenta asignar el valor del rango especificado a una variable, si ocurre un error entonces asume que el rango no existe aunque también puede significar que la hoja no existe.
Para utilizar esta función en el primer ejemplo seria de la siguiente forma.
For i=1 To Thisworkbook.Sheets.Count
If ExisteRango(Thisworkbook.Sheets(i).Name,"Fecha")=True Then
Thisworkbook.Sheets(i).Range("Fecha")=Now
End If
Next
Una tercera forma es con la siguiente función
Function ExisteRango(Hoja As String, NombreRango As String) As Boolean
On Error Resume Next
Dim i As Integer
For i = 1 To ThisWorkbook.Sheets(Hoja).Names.Count
If (ThisWorkbook.Sheets(Hoja).Names(i).Name = Hoja & "!" & NombreRango) Or (ThisWorkbook.Sheets(Hoja).Names(i).Name = "'" & Hoja & "'!" & NombreRango) Then
ExisteRango = True
Exit For
End If
Next
End Function
Esta función recorre los nombres de rango de la hoja especificada y los compara con el nombre que estamos buscando, si lo encuentra devuelve verdadero y si no falso.
Para aplicar esta función seria igual que en la anterior.
For i=1 To Thisworkbook.Sheets.Count
If ExisteRango(Thisworkbook.Sheets(i).Name,"Fecha")=True Then
Thisworkbook.Sheets(i).Range("Fecha")=Now
End If
Next
Estas son tres formas en que se puede saber si un nombre de rango existe o no en una hoja especifica de Excel.