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:
El asunto está claro, la propiedad Name nos mostraría o permitiría cambiar el nombre visible de la hoja de trabajo:
Esta propiedad es la que vemos reflejada en la hoja de cálculo como nombre de las diferentes hojas:
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':
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:
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:
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.
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:
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:
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:
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.
Hola:
ResponderEliminarTengo 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
JAJAJA SE ME CONTESTE A MI MISMO MA SALIO LA MACRO QUE QUERIA
ResponderEliminar;-)
Eliminarpuedes compartir la solución, si así lo deseas.
Quizá sirva a alguién mas.
Un saludo