jueves, 22 de agosto de 2013

VBA: La propiedad CodeName de las hojas de trabajo en Excel.

Muy probablemente habrás creado alguna vez una macro o procedimiento en VBA haciendo mención al nombre de la hoja de trabajo, y con el tiempo, al pasar diferentes usuarios por el Libro, finalmente nuestra macro generaba un error motivado por el cambio del nombre de la hoja (propiedad .Name).
En el post de hoy aprenderemos que existe otra propiedad (sólo de lectura) que nos permite trabajar, no sobre el Nombre de la hoja (.Name), sino sobre el Nombre en codigo de la hoja (.CodeName).

Si te estás preguntado de que estoy hablando, en la imagen siguiente lo verás mucho más claro:

VBA: La propiedad CodeName de las hojas de trabajo en Excel.


El asunto está claro, la propiedad Name nos mostraría o permitiría cambiar el nombre visible de la hoja de trabajo:

Sub CambioNombreHoja()
'cambia el nombre de la hoja activa
ActiveSheet.Name = "NombreCambiado"
End Sub
''''''''''''''''''''''''''''''''''''''''''''
Sub MuestraNombreHoja()
'muestra en un cuadro mensaje el nombre de la hoja activa
MsgBox ActiveSheet.Name
End Sub


Esta propiedad es la que vemos reflejada en la hoja de cálculo como nombre de las diferentes hojas:

VBA: La propiedad CodeName de las hojas de trabajo en Excel.



El problema de trabajar en nuestros procedimientos mencionando o haciendo referencia a las hojas de trabajo, empleando estos nombres, es que si cambian, nuestros procedimientos fallarán.
Por ejemplo, tenemos nuestras tres hojas:
HojaRoja, HojaVerde y HojaAzul
y un sencillo procedimiento que suma el rango A1:A3 de la hoja 'HojaVerde' en la 'HojaRoja':

Sub RefNameHoja()
'sumamos en HojaRoja valores de la HojaVerde
Sheets("HojaRoja").Range("B1").Formula = _
    Application.WorksheetFunction.Sum(Sheets("HojaVerde").Range("A1:A3"))
End Sub


Obviamente nuestra macro funcionará siempre que dichas hojas 'HojaVerde' y 'HojaRoja' existan con esos nombres exactamente.
Si cambiamos uno de los nombres, bien directamente sobre la hoja de cálculo bien con algún procedimiento (por ejemplo el anterior CambioNombreHoja), el resultado que obtendremos al ejecutar nuestra macro RefNameHoja será un error del tipo 9:

VBA: La propiedad CodeName de las hojas de trabajo en Excel.



Y en este momento es donde cobra sentido emplear la propiedad de lectura .CodeName, ya que referirnos a las hojas de trabajo a través de esta propiedad, evitará que cambios 'accidentales' en los nombres de las hojas fuercen fallos en nuestros procedimientos.
Si nuestro procedimiento de suma se cambia por este:

Sub RefCodeNameHoja()
'sumamos en HojaRoja valores de la HojaVerde
'sean cuales sean sus nombres .Name
Hoja1.Range("B1").Formula = _
    Application.WorksheetFunction.Sum(Hoja2.Range("A1:A3"))
End Sub


Fijémosnos como nos referimos a las hojas directamente por su CodeName, sin necesidad de emplear el objeto WorkSheet, en nuestro ejemplo Hoja1 y Hoja2:
Hoja1.Range("B1")
Hoja2.Range("A1:A3")


Recordemos que esta propiedad .CodeName es sólo de lectura. Por ejemplo:
ActiveSheet.CodeName
nos mostraría el nombre en código de nuestra hoja activa.

3 comentarios:

  1. Hola:

    Tengo un procedimiento que sirve para limpiar varias hojas de excel, este procedimiento tiene varias sub rutinas, para cada hoja, la pregunta es como puedo aplicar esta funcion para que pueda cambiar el nombre de las diferentes hojas.

    Saludos

    ResponderEliminar
  2. JAJAJA SE ME CONTESTE A MI MISMO MA SALIO LA MACRO QUE QUERIA

    ResponderEliminar
    Respuestas
    1. ;-)
      puedes compartir la solución, si así lo deseas.
      Quizá sirva a alguién mas.
      Un saludo

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.