Crear hojas a partir de una modelo y otras cosas más

Mi novia trabaja para una pequeña empresa y le dieron la comisión de llevar el control de las vacaciones, días de enfermedad y otros similares de todos los empleados de la empresa, 50 por el momento.

Para ayudarle a ella, y facilitarle un poco el trabajo, estoy tratando de hacer un pequeño programa donde ella pueda ingresar los datos, antes mencionados, y en una hoja de RESUMEN, ella pueda tener la información de todos en esa hoja..

En este momento estoy atascado.

Tengo un libro llamado CONTROL DE EMPLEADOS, con dos hojas por el momento, MOLDE (hoja modelo a copiar) y RESUMEN (donde se mostrarán en forma resumida, los datos solicitados por el empleador).

En esa hoja RESUMEN, hay una lista que iré alimentando con los nombres de la empresa, máximo 50 nombres, cada vez que ingreso un nombre, ya sea de manera automática o con un botón, quiero que se active una macro que realice las siguientes cosas:

1- Que me pregunte elrango de las celdas (C4:C53) que necesito para crear tantas hojas como se lo indique o que haga todas las hojas del rango anterior, exceptuando las que ya existen y las celdas vacías.

2- Que las hojas sean renombradas con el nombre de cada empleado.

3- Que ponga el nombre la hoja sea puesto en la posición B2 de cada hoja correspondientemente.(YA PUDE hacerlo con la función CELDA).

4- Que el valor de la celda D4 de la hoja nueva, se copie en la hoja RESUMEN en la celda 4 posiciones a la derecha de donde tomo el nombre para renombrar la hoja.

5- Que el nombre que se ingresó en la hoja RESUMEN, en el rango (C4:C53) sea un hipervinculo a la hoja con dicho nombre.

Es bastante la explicación, quizá más grande que el mismo código de dicha macro. Si necesitan el archivo, por favor soliciténmelo y denme una dirección de correo para enviarlo a la mayor brevedad.

Gracias de antemano por la atención y especialmente por la ayuda.

1 Respuesta

Respuesta
1

Es la segunda vez que veo esta misma intervención (aunque la anterior fue con otro usuario) y si bien me parece bueno que quieras ayudar a tu novia, aunque suene un poco duro la verdad no estás pidiendo poco y quizá por eso nadie se animó a responder antes. Yo sugeriría ver ejemplos y avanzar el trabajo y ya sobre dichos avances vuelves por aquí a solicitar ayuda en cosas más puntuales y así estoy seguro será, a su vez, más fácil ayudarte.

Abraham Valencia

de acuerdo, cosas puntuales:

1- cómo obtener el VALOR y pasárselo a una variable (NOMBRE) del último valor de una columna. la posición la obtengo, si no me equivoco, con estas dos líneas:

Dim ultimaCelda As Range
Set ultimaCelda = Range("C1000").End(xlUp)

2- con NOMBRE, hacer que la hoja que ya cree a partir de la hoja MOLDE, se renombre con dicho valor.

3- tomar los valores de algunas celdas y copiarlos a otras en otra hoja y

4- hacer que los nombres de los empleados, sean hipervínculos.

con esas 4 cosas y logro terminar el dichoso programa.

gracias por la ayuda que me presten.

1 y 2:

Dim UltimaCelda  As Range
Dim Nombre As String
Set UltimaCelda = Cells(Rows.Count, 3).End(xlUp)
Let Nombre = UltimaCelda.Value
MsgBox Nombre
Sheets("Hoja2").Name = Nombre

3:

Sheets("Hoja1"). Range("C1:C5").Copy Destination:=Sheets("Hoja2"). Range("A1")

4: No es claro dicho punto ¿qué es y en dónde tienes esos nombres? Y quieres que sean ¿hipervínculos a qué?

Comentas

Abraham Valencia

Don Abraham, muchas gracias por esos tres tips.

Respecto al cuarto punto, los nombres están en la hoja llamada RESUMEN. El caso es el siguiente:

si la empresa contrata a un empleado llamado PÁNFILO, el digitador debe presionar un botón que activa varios procesos y uno de ellos es convertir el nombre de PÁNFILO en un hipervínculo a la hoja recién creada y renombrada con dicho nombre, esto con el fin de cuando necesiten ingresar a la hoja de este empleado, con sólo presionar sobre el nombre de este, el excel nos dirija a esa hoja.

Nuevamente le agradezco su ayuda y comprensión.

Esto:

Sub Ejemplo()
Dim UltimaCelda  As Range
Dim Nombre As String
Set UltimaCelda = Sheets("Resumen").Cells(Rows.Count, 3).End(xlUp)
Let Nombre = UltimaCelda.Value
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = Nombre
Worksheets("Resumen").Hyperlinks.Add Anchor:=UltimaCelda, Address:="", SubAddress:= _
"'" & Nombre & "'!A1"
End Sub

Salu2

Abraham Valencia

Don Abraham, del punto 1 y 2, la parte que corre perfectamente es la 1, la 2 he intentado que corra de diferentes formas  y no lo logro. hasta el Msgbox, todo bien. le agregué algunas líneas y ya logro que haga una copia de la hoja molde, pero no la renombra.

le adjunto lo que llevo:

Sub Crea_y_renombra_hojas()

Dim Hoja As Worksheet, HojaNueva As Worksheet
Dim UltimaCelda as range
Dim Nombre As String
Set Hoja = Hoja3
Set UltimaCelda = Cells(Rows.Count, 3).End(xlUp)
Let Nombre = UltimaCelda.Value
Hoja.Copy after:=Sheets(Sheets.Count)
Set HojaNueva = Sheets(Sheets.Count)
HojaNueva.Name = Nombre
MsgBox Nombre
Sheets("Hoja5").Name = Nombre
End Sub

estoy cometiendo un error, pero no lo veo.

como puede notar, mientras yo estaba escribiendo el mensaje anterior, usted me había enviado su último mensaje. voy a correrlo y ya le aviso.

No hay problema

Abraham Valencia

Don Abraham, sólo hay dos detalles que no lo puedo hacer correr correctamente. 

El primero es que al crear la hoja nueva, la crea completamente nueva, no lo hace a partir de la hoja MOLDE, pero sí la renombra con el nombre del último registro que hay en la columna C y coloca el cursor en la hoja recién creada.

Lo segundo, es que si bien nos lleva a la hoja recién hecha, no nos coloca en la celda C7, nos pone en la columna C pero en la posición de donde tomó el nombre de la hoja, por ejemplo, si el nombre está en la celda C20 de la hoja RESUMEN, nos coloca en la hoja nueva en la misma posición.

Intenté hacerlo yo, usando su código con el que yo puse y se me hizo un arroz con mango, que mejor dejé sólo lo suyo.

Son detallitos, por como yo lo veo, ya tengo 3 de los 4 solicitudes resueltas.

Prueba así

Sub Ejemplo()
Dim UltimaCelda  As Range
Dim Nombre As String
Set UltimaCelda = Sheets("Resumen").Cells(Rows.Count, 3).End(xlUp)
Let Nombre = UltimaCelda.Value
Worksheets("Molde").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Nombre
ActiveSheet.Range(UltimaCelda.Address).Select
Worksheets("Resumen").Hyperlinks.Add Anchor:=UltimaCelda, Address:="", SubAddress:= _
"'" & Nombre & "'!A1"
End Sub

Dale una repasada a la macro para que entiendas que hace cada línea

Salu2

Abraham Valencia

Don Abraham, seguí su consejo y cada línea del código que me mandó le agregué comentarios.

Sub Ejemplo()
Dim UltimaCelda As Range 'se declaran las variables, tipo rango y alfanumérica
Dim Nombre As String
Set UltimaCelda = Sheets("RESUMEN").Cells(Rows.Count, 3).End(xlUp) 'se utiliza SET para adjudicarle el valor de la expresión de la derecha, en este caso, el número de línea del último registro

Let Nombre = UltimaCelda.Value 'asigna el valor de la derecha y al mismo tiempo lo evalúa
Worksheets("MOLDE").Copy After:=Worksheets(Worksheets.Count) 'crea una copia de la hoja MOLDE
ActiveSheet.Name = Nombre 'renombra la hoja recién creada
ActiveSheet.Range(UltimaCelda.Address).Select 'NO TENGO IDEA, creo que guarda una dirección
Worksheets("RESUMEN").Hyperlinks.Add Anchor:=UltimaCelda, Address:="", SubAddress:= _
"'" & Nombre & "'!C7" 'hace que el último registro se convierta en hipervínculo a la hoja que le corresponde
End Sub

Si me equivoqué en algo, por favor indíquemelo.

Un bug que persiste, al ejecutar la macro y cuando nos lleva de la hoja RESUMEN a la hoja recién creada y renombrada, nos ubica en la columna C pero en la fila misma de donde tomó el nombre de la hoja. Ejemplo, cuando se introduzca el primer empleado en C4, en la hoja de RESUMEN y ejecutamos la macro, esta nos llevará a la nueva hoja creada y renombrada y nos si situará en la celda C4. Cuando sea el segundo caso y estaremos en C5, nos colocará en la nueva hoja en C5 y así sucesivamente. Cuando lleguemos a tener 100 registros, nos colocará en C103. La idea es que nos situé siempre en C7.

Esto sólo sucede cuando ejecutamos la macro, después SÍ nos coloca en la celda C7 de cualquier hoja de empleados.

Gracias por toda su ayuda y por su paciencia.

Otra vez:

Sub Ejemplo()
Dim UltimaCelda As Range 'se declaran las variables, tipo rango y alfanumérica
Dim Nombre As String
Set UltimaCelda = Sheets("RESUMEN").Cells(Rows.Count, 3).End(xlUp) 'Le damos a la variable el valor de la última celda llena de la columna "C" (3). AL ser variable
'del tipo "Range" el valor que obtiene es la celda
Let Nombre = UltimaCelda.Value 'Le damos a la variable el valor de la celda "Ultimacelda"
Worksheets("MOLDE").Copy After:=Worksheets(Worksheets.Count) 'crea una copia de la hoja MOLDE
ActiveSheet.Name = Nombre 'renombra la hoja recién creada
ActiveSheet.Range("C7").Select 'dejamos el cursor en la celda "C7"  de la hoja nueva
Worksheets("RESUMEN").Hyperlinks.Add Anchor:=UltimaCelda, Address:="", SubAddress:= _
"'" & Nombre & "'!C7" 'hace que el último registro se convierta en hipervínculo a la hoja que le corresponde
End Sub

Cuando vaya a Costa Rica me pagarás con cerveza por si acaso

Salu2

Abraham Valencia

qué casualidad, soy dueño de una pequeña taberna, de dónde es usted ??

Ja ja ja, no lo puedo creer. Pero es una broma, no te preocupes. Me divierte mucho ayudar en mis horas libres.

Un abrazo desde Lima, Perú.

Abraham Valencia

me imagino que usted es tomador de Cristal o de Pilsen ??

Pilsen bien helada  ;)

Abraham Valencia

aquí la de más venta, por el momento, es la Imperial Silver.

yo no soy de tomar, pero los que sí lo hacen, dicen que es muy buena.

Y habrá, algún día, oportunidad de probarla.

:)

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas