Hojas de cálculo en Excel - página principal

Crear hojas con un clic

Vamos a profundizar un poco más, sobre algo que ya había hablado en otro artículo, cuando explicaba como verificar si existe una hoja de cálculo.

Para ello, vamos a resolver el ejercicio que nos plantea Pedro, a través de un comentario que ha dejado en el blog. El enunciado es este:

Dada una hoja índice cuya primera columna contiene diversos "nombre", crear una macro que realice lo siguiente:

Al hacer clic sobre cualquier "nombre" de esta primera columna:

1.- Crear una nueva hoja (si no existe) con ese "nombre" a partir de otra hoja (plantilla vacía) ya existente, es decir, copiar plantilla y renombrar.

2.- En esa nueva hoja, poner como título en una celda el "nombre" de la hoja.

3.- Ir a esa hoja.

Si la hoja ya existía con anterioridad, entonces ir a esa hoja.


Comenzaremos diciendo que el punto 1 puede interpretarse de varias formas. ¿Los nombres serán hipervínculos, y al cliquear sobre ellos, se ejecutará el macro, o no serán hipervínculos, y solo nos bastará con seleccionar la celda que contiene el dato, para que se ejecute el macro?. Yo he optado por esta segunda opción, porque los hipervínculos no me parecen tan elegantes.

Antes de comenzar, un par de observaciones imprescindibles:

Para que se vea que realmente cogemos una hoja dada, la copiamos y la pegamos cambiándole el nombre a ésta última, tal y como se indica en el punto 1 del enunciado, he puesto de color rojo la hoja que hará de plantilla. Para darle color a una hoja, solo hay cliquear con el botón derecho del mouse sobre la hoja cuyo color queramos cambiar, y seleccionaremos la opción Color de etiqueta.... Desde ahí podremos seleccionar el color que queramos darle a la pestaña.


Como veréis en el macro, en lugar de utilizar el nombre visible de la pestaña, para llamar a la hoja 2 (la que hace de plantilla), he utilizado el nombre interno que se ve en VBA, de esa forma si alguien cambia el nombre a la hoja (desde la pestaña), no tendremos problemas con copiar y pegar la hoja, pues su nombre interno seguirá siendo el mismo.


Para que podamos resolver el ejercicio, es lógico que el libro de excel que tengamos, deba contener como mínimo dos hojas (dos pestañas). La primera será el índice, donde estarán los nombres en la primera columna, y la segunda hoja será la que hará de plantilla. En el ejemplo que he colgado con el ejercicio resuelto, he creado un libro de excel con cinco hojas.

Vayamos a lo realmente interesante, la solución al ejercicio. Para ello, tan solo tendremos que entrar en modo VBA, ya sabéis, Atl+F11, y sobre la hoja que hará de índice, es decir, la hoja en cuya primera columna estarán los nombres, copiaremos este procedimiento (ojo, este procedimiento no deberá ir en la sección de módulos, sino en la hoja que hará de índice):


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
'ocultamos el procedimiento, para que
'no se vea la ejecución del macro

Application.ScreenUpdating = False
'pasamos a una variable el rango de datos
'en este caso toda la columna A. Si solo fuera
'un área determinada entre unas pocas celdas,
'tendríamos que cambiar el rango, de tal forma que
'si por ejemplo fuese de A1 a A20, pondríamos esto:
'Set datos = Range("A1:A20")

Set datos = Range("A:A")
'Si seleccionamos una celda de ese rango
'(en este caso, toda la columna A), y además
'esa celda no está vacía (porque si está vacía
'no crearemos una hoja sin nombre), entonces...

If Union(Target, datos).Address = datos.Address And ActiveCell <> "" Then
'creamos una hoja con el nombre que haya
'en esa celda que hemos seleccionado, siempre
'y cuando no exista ya, partiendo de otra
'hoja ya existente.

hoja_de_calculo = ActiveCell.Value
'seleccionamos la hoja con ese nombre
Sheets(hoja_de_calculo).Select
'si no existe esa hoja, la creamos
'a partir de otra ya existente

If ActiveSheet.Name <> hoja_de_calculo Then
'quitaremos los caracteres no permitidos en
'el nombre de las hojas, por si las moscas

hoja_de_calculo = Replace(hoja_de_calculo, ":", "")
hoja_de_calculo = Replace(hoja_de_calculo, "/", "")
hoja_de_calculo = Replace(hoja_de_calculo, "\", "")
hoja_de_calculo = Replace(hoja_de_calculo, "?", "")
hoja_de_calculo = Replace(hoja_de_calculo, "*", "")
hoja_de_calculo = Replace(hoja_de_calculo, "[", "")
hoja_de_calculo = Replace(hoja_de_calculo, "]", "")
'volvemos a comprobar que queda "algo" después de
'eliminar los carecteres raros

If hoja_de_calculo <> "" Then
'copiaremos la Hoja2 (nombre interno VBA)
'así si le cambian el nombre a la hoja (pestaña)
'no tendremos ningún problema

Hoja2.Select
'la pegamos al final (tras la última hoja)
Hoja2.Copy After:=Sheets(Sheets.Count)
'le cambiamos el nombre, y le pondremos
'el que figura en la celda seleccionada
'pero para evitar problemas con la longitud
'del nombre que haya en la celda, limitaremos
'el nombre de la hoja, a los primeros 31 caracteres,

ActiveSheet.Name = Left(hoja_de_calculo, 31)
'Ponemos en una celda, el nombre
'de la hoja de cálculo (por ejemplo en A1)

Range("A1").Select
ActiveCell = hoja_de_calculo
End If
Else
'si ya existe una hoja con ese nombre,
'nos situamos en ella

hoja_de_calculo.Select
End If
'finalizamos el condicional que comprueba
'si nos hemos situado en una celda del rango

End If
'limpiamos el objeto
Set datos = Nothing
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Desde aquí podéis descargar el fichero de excel, con el ejercicio resuelto.



31 comentarios:

Pedro dijo...

Bravo!! :)

Espero que hayas recibido mi archivo, como te comentaba por e-mail, el invento de realizar una lista de tareas (la lista de "nombres" que llevan a la hoja de tareas copiada con ese "nombre"...) con este método es más propio de Access, pero desde luego no necesario y queda en Excel vistoso y rápido de elaborar.

gracias !!

Javier Marco dijo...

Sí, lo he recibido. En cuanto tenga un ratito le echo un vistazo en profundidad.

Gracias.

Pedro Silvestre dijo...

Hola Javier...

Muchas gracias por el ejemplo, es justamente lo que buscaba desde hace mucho tiempo.

Solo tengo una pequeña duda, cómo podría hacer para que en una HOJA RESUMEN compile ciertos datos de todas ó algunas de las hojas creadas en la hoja INDICE , por ejemplo los totales ubicados en la fila 25 de las columnas C a X? Espero que me puedas entender..


Saludos desde Guatemala

Teto Medina dijo...

Muchas gracias, este ejemplo me sirvió de mucho, hace tiempo que quería hacer algo similar.

Puedo crear una nueva hoja con el nombre de pestaña que quiero, pero no quiero el dato de la columna A en la celda A1, yo quisiera poner el dato de la columna B por ejemplo. Podrías explicarme como se hace esto?

Gracias

Javier Marco dijo...

Gracias por tu comentario...

Fíjate que el código fuente está comentado (texto de color verde). Si lo miras con detenimiento, verás que hay un sitio donde pone (al principio):

Set datos = Range("A:A")

Eso está indicando que escoja la columna A. Si quieres que lo haga con la columna B, ¿es sencillo, verdad?. Si solo quieres un rango de celdas (un área determinada), fíjate en el texto de color verde que hay justo encima de esa línea. Está todo muy "mascadito" ;-)

Teto Medina dijo...

Hola,
Gracias por tu rápida respuesta. Soy usuario de Excel desde hace mucho pero ahora estoy empezando a meterme con los macros. Creo que no me expliqué bien.

Yo necesito mantener ese Range A:A tal cual esta para el nombre de la pestaña .

Luego quisiera un Range B:B para tomar el dato de la misma fila y ponerlo en la celda A1 de la nueva hoja.

He intentado con la declaración:
dato_celda = Range("B:B")
puesto a continuación de primer rango A:A, y más adelante lo leo con:
ActiveCell = dato_celda
pero cuando leo la variable siempre me devuelve el primer valor (B1).
No sé si de alguna forma tengo que hacer avanzar el puntero del vector hasta la posición deseada.
En el ejemplo la columna A tiene grupos de rock y la columna B pongámos animales (B1=perro,B2=gato, etc.) presionando A7 me crearía una hoja con la pestaña QUEEN y en su celda A1 JIRAFA, pero siempre me pone PERRO...
Alguna sugerencia?

Javier Marco dijo...

Te explico la técnica, pues es bastante sencilla:

Fíjate que hay una variable llamada "hoja_de_calculo". Esto funciona como las variables de matemáticas (X, Y, ...).

En esa variable tenemos almacenado el nombre de la hoja.

Lo que tu quieres, es hacer que una vez creada esa hoja, te coja el dato de la columna B, que está a la misma altura (misma fila), que el nombre de la hoja creada, y que te lo escriba en la celda A1 de esa nueva hoja, ¿verdad?.

Pues es sencillo. Con la propiedad Offset lo tienes chupado. Con Offset (que quiere decir desplazamiento), le podemos decir a Excel "oye, coge tal o cual celda que esté situada a tal o cual distancia de la celda actual (celda activa)".

Si sabes que:

hoja_de_calculo = ActiveCell.Value

Entonces, el dato que haya a su derecha será este:

dato = ActiveCell.Offset(0,1).select

Eso le está diciendo a Excel, lo siguiente: "selecciona 0 filas, y 1 columna a la derecha de la celda actual (de ahí ese 0, y ese 1), y grábame ese dato en la variable llamada precisamente así, dato" (a esa variable, la podíamos haber llamado pepito, celda_derecha, coger_dato, o como queramos).

Por tanto, en la variable dato tendrás almacenado el valor que hay en la columna B, a la derecha del nombre del dato que hay en la columna A.

Tan solo te quedará escribir ese dato, en la nueva hoja. Cuando la crees, justo una vez la hayas creado, escribe algo como esto:

Range("A1") = dato

Y eso es todo.

Teto Medina dijo...

Javier Marco... ERES EL MASTER DE MASTERS !!!!

Muchas gracias, era precisamente lo que quería lograr. La verdad que en pocas palabras has sido conciso y efectivo, porque la ayuda del Excel es de poca ayuda...

Espero que los elogios te sirvan de recompensa por el gran soporte que nos das a los ineptos que pasamos por tu blog.

Tenkiu!!!

Javier Marco dijo...

Gracias por los elogios, pero creo que son inmerecidos.

Un saludo.

Teto Medina dijo...

Hola nuevamente,
He estado bastante ocupado dándole vueltas a este tema y ahora que lo he resuelto (al menos hace lo que quiero ;) quería comentarte dos cosas.

En primer lugar el código del ejemplo tiene una particularidad: solamente copia el valor en la celda de la hoja nueva según donde está parado en la plantilla. Es decir, siempre ha copiado en la A1 porque en la plantilla estaba parado en la A1, pero si en la plantilla me paro en la A10, copiará en la A10 de la nueva hoja.

Esto le he resuelto con:
Sheets(hoja_de_calculo).Cells(11, 3) = animal
Sheets(hoja_de_calculo).Cells(11, 5) = hoja_de_calculo
(copia el grupo de rock en la C11 y el animal en la E11 de la nueva hoja sin importar la celda activa de la plantilla.

El otro asunto tiene que ver con la solución que me habías presentado para mi problema:
dato = ActiveCell.Offset(0,1).select
En este caso al copiar la variable dato (o animal en mi caso) en la celda C11 de la nueva hoja con:
Range("A1") = dato
solamente me ponía VERDADERO, o sea que me ponía que existía pero no ponía el valor de la variable.

Esto lo resolví con:
(a continuación debido al límite en los mensajes)

Teto Medina dijo...

PRIMERA PARTE DEL CODIGO:

dato = ActiveCell.Offset(0, 1).Value

En definitiva mi código quedó así (intercambiar animal=dato a gusto del consumidor, espereo que la tabulación salga bien):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
'ocultamos el procedimiento, para que
'no se vea la ejecución del macro
Application.ScreenUpdating = False
'pasamos a una variable el rango de datos
'en este caso toda la columna A. Si solo fuera
'un área determinada entre unas pocas celdas,
'tendríamos que cambiar el rango, de tal forma que
'si por ejemplo fuese de A1 a A20, pondríamos esto:
'Set datos = Range("A1:A20")
Set datos = Range("A:A")
'Si seleccionamos una celda de ese rango
'(en este caso, toda la columna A), y además
'esa celda no está vacía (porque si está vacía
'no crearemos una hoja sin nombre), entonces...
If Union(Target, datos).Address = datos.Address And ActiveCell <> "" Then
'creamos una hoja con el nombre que haya
'en esa celda que hemos seleccionado, siempre
'y cuando no exista ya, partiendo de otra
'hoja ya existente.
hoja_de_calculo = ActiveCell.Value

'NUEVO: COPIO EL VALOR DE LA CELDA A LA DERECHA DE LA CELDA SELECCIONADA
'EN LA VARIABLE animal
animal = ActiveCell.Offset(0, 1).Value

'seleccionamos la hoja con ese nombre
Sheets(hoja_de_calculo).Select
'si no existe esa hoja, la creamos
'a partir de otra ya existente
If ActiveSheet.Name <> hoja_de_calculo Then
'quitaremos los caracteres no permitidos en
'el nombre de las hojas, por si las moscas
hoja_de_calculo = Replace(hoja_de_calculo, ":", "")
hoja_de_calculo = Replace(hoja_de_calculo, "/", "")
hoja_de_calculo = Replace(hoja_de_calculo, "\", "")
hoja_de_calculo = Replace(hoja_de_calculo, "?", "")
hoja_de_calculo = Replace(hoja_de_calculo, "*", "")
hoja_de_calculo = Replace(hoja_de_calculo, "[", "")
hoja_de_calculo = Replace(hoja_de_calculo, "]", "")
'volvemos a comprobar que queda "algo" después de
'eliminar los carecteres raros

Teto Medina dijo...

SEGUNDA PARTE DEL CODIGO:

If hoja_de_calculo <> "" Then
'copiaremos la Hoja2 (nombre interno VBA)
'así si le cambian el nombre a la hoja (pestaña)
'no tendremos ningún problema
Hoja2.Select

'EN EL EJEMPLO SE COPIABA UNA HOJA TRAS OTRA EN ORDEN CON:
'Hoja2.Copy Before:=Sheets(Sheets.Count)
'PERO YO NECESITABA UN ORDEN INVERTIDO, LA HOJA MAS NUEVA AL PRINCIPIO
'Y LO CONSEGUI DE FORMA MAS SIMPLE USANDO LA PROPIEDAD After
' --NO SE EL EFECTO DE Sheets.Count
Hoja2.Copy After:=Hoja2

'le cambiamos el nombre, y le pondremos
'el que figura en la celda seleccionada
'pero para evitar problemas con la longitud
'del nombre que haya en la celda, limitaremos
'el nombre de la hoja, a los primeros 31 caracteres,
ActiveSheet.Name = Left(hoja_de_calculo, 31)
'Ponemos en una celda, el nombre
'de la hoja de cálculo (por ejemplo en A1) c11 EN MI CASO PERO NO FUNCIONA

'CON EL EJEMPLO PROPUESTO:
''Range("C11").Select
''ActiveCell = animal
'NO ME COPIA EL CONTENIDO DE LA VARIABLE animal
'PERO DIRECCIONANDO -POR LA FUERZA- SI LO HACE

Sheets(hoja_de_calculo).Cells(11, 3) = animal
Sheets(hoja_de_calculo).Cells(11, 5) = hoja_de_calculo


End If
Else
'si ya existe una hoja con ese nombre,
'nos situamos en ella
hoja_de_calculo.Select
End If
'finalizamos el condicional que comprueba
'si nos hemos situado en una celda del rango
End If
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Javier Marco, no quiero abusar de tu amabilidad pero me gustaría que me hagas algún comentario al respecto ya que luego de muchos años de pelearme con las funciones de las celdas decidí ponerme las pilas para aprender VBA y macros y es eso estoy. Gracias!

Emilio dijo...

He leido con mucha atencion lo expuesto por uds. voy a llevar a cabo esta macro por que es lo que andaba buscando, si me funciona me habrán solucionado un gran problema. De ahí les comento como me resulto.

Emilio

Emilio dijo...

Bueno aqui estoy, para dar las gracias a aquellos que comparten esta importante informacion, me dio excelente resultado.
mil gracias. Emilio

Anónimo dijo...

cuando se emplean numeros en los nombres de referncia realiza la cración d ela nueva hoja pero cuando se hace clic en el nombre (numero)inicial de las lista no lo lleva a uno a la hoja ya creada sino que sigue haciendo una nueva hoja

Anónimo dijo...

Hola a todos.
Me llamo Javier y acabo de conocer el blog y me parece estupendo, sobre todo porque no tengo ni idea de programación y aún así he hecho cosillas que he visto por aquí, en especial este ejercicio.
Tal y como está lo estoy usando aunque adaptado un poco a mis necesidades.
Lo único que me gustaría es saber el código, si es posible, para una vez que tienes la plantilla (Hoja2, por ejemplo) y el listado de gente o de cosas (en mi caso es de gente a la que evaluar) pulsando un botón o celda se generaren todas las hojas necesarias, sin necesidad de ir uno a uno.
Muchas gracias de antemano y un saludo desde las Islas Canarias.

Javier Marco dijo...

Hola tocayo. Elimina el código que has visto en este artículo, de la hoja que hace de índice, y copia este otro código que te incluyo a continuación, en un módulo (ojo, en un módulo). Como verás, partiendo de la hoja índice, te va a crear tantas hojas, como filas con datos contíguos tengas desde la celda A1 hasta abajo:

Sub Crear_hojas()
On Error Resume Next
'ocultamos el procedimiento, para que
'no se vea la ejecución del macro
Application.ScreenUpdating = False
'Nos situamos en la celda con el primer dato
Range("A1").Select
'creamos un bucle para recorrer el rango contínuo de celdas
Do While Not IsEmpty(ActiveCell)
'creamos una hoja con el nombre que haya
'en esa celda, siempre siempre que no exista
hoja_de_calculo = ActiveCell.Value
'fichamos la celda donde estamos
celda = ActiveCell.Address
'seleccionamos la hoja con ese nombre
Sheets(hoja_de_calculo).Select
'si no existe esa hoja, la creamos
'a partir de otra ya existente
If ActiveSheet.Name <> hoja_de_calculo Then
'quitaremos los caracteres no permitidos en
'el nombre de las hojas, por si las moscas
hoja_de_calculo = Replace(hoja_de_calculo, ":", "")
hoja_de_calculo = Replace(hoja_de_calculo, "/", "")
hoja_de_calculo = Replace(hoja_de_calculo, "\", "")
hoja_de_calculo = Replace(hoja_de_calculo, "?", "")
hoja_de_calculo = Replace(hoja_de_calculo, "*", "")
hoja_de_calculo = Replace(hoja_de_calculo, "[", "")
hoja_de_calculo = Replace(hoja_de_calculo, "]", "")
'volvemos a comprobar que queda "algo" después de
'eliminar los carecteres raros
If hoja_de_calculo <> "" Then
'copiaremos la Hoja2 (nombre interno VBA)
'así si le cambian el nombre a la hoja (pestaña)
'no tendremos ningún problema
Hoja2.Select
'la pegamos al final (tras la última hoja)
Hoja2.Copy After:=Sheets(Sheets.Count)
'le cambiamos el nombre, y le pondremos
'el que figura en la celda seleccionada
'pero para evitar problemas con la longitud
'del nombre que haya en la celda, limitaremos
'el nombre de la hoja, a los primeros 31 caracteres,
ActiveSheet.Name = Left(hoja_de_calculo, 31)
'Ponemos en una celda, el nombre
'de la hoja de cálculo (por ejemplo en A1)
Range("A1").Select
ActiveCell = hoja_de_calculo
'volvemos donde estábamos inicialmente
Hoja1.Select
'bajamos una fila, partiendo de
'la celda donde nos habíamos quedado
Range(celda).Select
ActiveCell.Offset(1, 0).Select
End If
Else
'si ya existe una hoja con ese nombre,
'pasamos a la fila siguiente
Hoja1.Select
Range(celda).Select
ActiveCell.Offset(1, 0).Select
End If
Loop
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Para ejecutar ese macro, la forma más sencilla es asociándolo a un botón.

Saludos desde Barcelona.

Anónimo dijo...

Muchas gracias Javier.
Me ha servido de gran ayuda lo que has publicado. era justo lo que necesitaba.
Saludos.

J. Javier dijo...

Hola tocayo.
En verdad que estoy aprovechando mucho tu blog para hacer cosas de mi trabajo (soy profe). Al final lo que está pasando es que uno pone el listón cada vez más alto y yo no tengo los conocimientos para hacer ese tipo de cosas.
Resulta que con el código que me pasaste he realizado justo lo que quería, generar mediante el botón las hojas con el nombre de todos los nombre que pongo en la columna determinada.
El siguiente paso sería que esas hojas que se crean incluyan en cada hoja los datos que hay en ciertas columnas del índice, no sé si me explico. Se trata de crear el libro del profesor, mediante una panorámica con el nombre de todos los alumnos (por ejemplo en columna A), con el nombre de una tarea (columna B), con el nombre de otra tarea (columna C) y así con todos los datos que se crean oportuno. Con esta forma se reduce y ayuda mucho a los profesores a la hora de generar las notas y los informes con las competencias básicas.
Espero no haber sido muy rollero, pero estoy atascado con este reto y creo que en este blog puede encontrar una guía.
Espero no abusar de tu amabilidad.

Muchas gracias de antemano.

Saludos desde Fuerteventura.

Javier Marco dijo...

Es muy sencillo. Si te fijas, en el primer macro (el del artículo, no el de mi comentario anterior), verás que incluyo el nombre de la hoja en la celda A1, de cada hoja que vamos creando.

Simplemente debes añadir líneas (de la misma forma como ves en ese artículo). Por ejemplo debajo de estas 2 líneas que hay en el código (y que deberás incluir en la adaptación del macro que te puse en el comentario):

Range("A1").Select
ActiveCell = hoja_de_calculo

puedes poner más cosas (debajo). Por ejemplo:

Range("A2") = "Asignatura:"
Range("B2") = "Matemáticas"
Range("A3") = "Profesor:"
Range("B3") = "Javier"

Simplemente debes coger parte del código del artículo, añadir cosillas (como yo acabo de hacer), e incluir eso en el macro que te puse en el comentario anterior (en el sitio adecuado, claro está, ...para ello, solo tienes que leer el código, pues está comentado).

Saludos

J. Javier dijo...

Muchas gracias tocayo.
Me pongo a ello a ver si sale.
Saludos.

hermit dijo...

como hago para listar las hojas en excel cuando tengo una gran cantidad en un libro

Javier Marco dijo...

Este sencillo macro te escribe el nombre de todas las hojas, en aquella hoja desde la que ejecutes el macro (si estás en la hoja 1, pues en la hoja 1), y a partir de la celda A500:

Sub hojas()
'nos situamos en la celda A500
Range("A500").Select
'miramos todas las hojas
For i = 1 To Sheets.Count
'escribimos su nombre a partir de la celda activa
ActiveCell = Sheets(i).Name
'bajamos ua celda
ActiveCell.Offset(1, 0).Select
Next
End Sub

Saludos

Javier EsMi dijo...

Hola Javier.
He intentado hacer lo que me dices y sí, funciona, pero no es exáctamente lo que quiero hacer. Me explico. En la hoja2 tengo un cuadrante en el que la columna A, tengo los nombre de los alumnos, en la B (que se llama "libreta") están las notas, en la C (que se llama "examen") están las notas de los exámenes; y así sucesivamente. Resulta que en la hoja2, que es el modelo de informe quiero que en la fila 1 ponga el nombre del alumno (al igual que en la pestaña), en la fila 2, la nota de la libreta; en la 3, la del examen; y así sucesivamente...
He intentado cambiando el código en la macro, añadiendo y eliminando cosas pero no logro hacer lo que quiero.
Espero no molestar con tanto comentario.
Muchas gracias y saludos desde las Canarias.

Cristobal Muñoz, Universidad de Talca dijo...

Hola Javier,

esta super bueno tu ejemplo. Sabes como puedo hacer que cuando se precione nuevamente algun nombre de una columna que ya existia no se cree nuevamente una hoja, indicando el nombre de la hoja 2

Ejemplo.

en columna tengo:Tengo hoja INDICE y ESTRUCTURA

En hoja indice tengo lo siguiente en la columna A
401
402
403
etc.

Al precionar dos veces 401 me aparece una hoja 401 y una que dice estructura (2).

Como podría corregir ese problema, para que simplemente no se muestre. si ya aparece con anterioridad.

gracias

Javier Marco dijo...

Acabo de comprobar que efectivamente, cuando se trata de un número, crea n versiones (tantas, como veces cliqueemos). Para solucionarlo, solo se me ocurre que le des formato de texto a esa columna de números, pero no de la forma tradicional, es decir, no desde Formato --> Celdas --> Texto, sino poniendo una comilla simple delante del número como en este ejemplo:

'401
'402

Visualizarás el número de forma normal, aunque tratado como texto, y alineado a la izquierda.

Saludos.

Oscar Menacho dijo...

Estimado Javier, permiteme calificar tu blog como EXCELENTE!
Soy aprendiz (1 de 10)en el tema de macros, pero con tus explicaciones las macros de excel parecen 'pan comido' o 'la cosa mas facil'. Me incentiva a seguir aprendiendo mas del tema... y sobre todo que tienes el buen animo de compartir . . . felicitaciones otra vez. No encontre como suscribirme a tu blog, pero ya esta en 'mis favoritos'
Slds Oscar Menacho (Lima)

Lucía Flores dijo...

Excelente todo lo que has escrito. Javier, mi felicitación y agradecimiento por lo que compartes y sobre todo por lo bien que explicas cada paso que se ejecuta. Bendiciones desde México.

Carlos dijo...

Saludos,

Yo tengo un problema parecido al que tuvo uno de los que comentaron años atrás.

Resulta que yo quiero hacer eso pero en las celdas estan en grupos de 10 y en diferentes columnas.

He intentado añadiendo las siguientes lineas al código original.

Código inicial:
Set datos = Range("A10:A31")

Código añadido:
Set datos = Range("C10:C31")
Set datos = Range("E10:E31")
Set datos = Range("G10:G31")

Resulta que al añadir las demás, el código no funciona ya que, el código, no da un valor a "datos", con lo cual, cuando llega a la línia

If Union(Target, datos).Address = datos.Address And ActiveCell <> "" Then

se salta el proceso de creación de la nueva hoja ya que "datos" no tiene ningún valor asignado.

Espero que me podais ayudar.

Antonio Giraldos dijo...

Hola Javier:
fantástico el blog, me has ahorrado muchas horas de trabajo tedioso.
Para redondear, sería posible añadir código para copiar el texto bajo la casilla que genera la nueva hoja en un rango de 2 columnas (siempre 2) y tantas filas hasta encontrar un espacio en blanco?
Le di a Me gusta en tu Face.
Muchas gracias por tu inestimable ayuda. Antonio.
agiraldos@grupo-vive.com

Paco Salcedo dijo...

Ya se que este hilo es antiguo pero tengo problemas para que en vez de texto el nombre de los indices sean fechas 04/09/2015

la primera vez se crea perfecto, y los nombres de las hojas adicionales aparecen como 04092015 que es producto de la eliminación de caracteres no compatibles con los nombres de las hojas
eso perfecto

pero cuando quiero seleccionar otra vez una fecha con una hoja ya creada se crea hoja2(2) en ves de posicionarse en la hoja 04092015

alguna ayuda?
gracias