Saber si un nombre de rango ya existe

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.

Anuncios

2 pensamientos en “Saber si un nombre de rango ya existe

  1. Una variación, a partir de las tuyas

    Function existeRangoEnHoja(Hoja As String, NombreRango As String) As Boolean
    On Error Resume Next
    Err.Clear
    ActiveSheet.Range(NombreRango).Select
    If Err.Description “” Then
    ExisteRango2 = False
    Else
    ExisteRango2 = True
    End If
    End Function

    Evalua si existe el rango en la hoja activa, funciona para celdas, rangos y rangos con nombres.

    • Tu idea es correcta, solo algunas correcciones.
      Function existeRangoEnHoja(NombreRango As String) As Boolean
      On Error Resume Next
      Err.Clear
      ActiveSheet.Range(NombreRango).Select
      If Err.Description “” Then
      existeRangoEnHoja = False
      Else
      existeRangoEnHoja = True
      End If
      End Function

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s