Macro para duplicar hoja de excel y nombrarla a partir de una lista.

Comunidad de todo expertos soy nuevo por acá. Espero me tengan paciencia.

Tengo un libro de Excel en el cual llevo el control de las cuentas de mis clientes. La primera hoja es simplemente un "home", la segunda "clientes" en la cual esta la lista de nombres que uso en una lista desplegable en home para seleccionar a quien quiero consultar. Y la tercera "formato" donde está el formato vacío del estado de cuenta que usaré con cada cliente.

En "home" tengo un apartado de "dar de alta nuevo cliente". Y mi pregunta es, ¿cómo hago una macro que me permita que "formato" se replique una y otra vez por cada cliente nuevo dado de alta? Y que, además la hoja generada tenga el nombre del cliente ingresado puesto que en "home" tengo un botón que me permite imprimir el estado de cuenta del cliente a partir de la lista desplegable que mencionaba al inicio. He conseguido hasta ahora solo que la hoja de formato se replique pero no nombrarla con el nombre del cliente.

1 respuesta

Respuesta
1

He conseguido hasta ahora solo que la hoja de formato se replique pero no nombrarla con el nombre del cliente.

¿Ya tienes una macro? Pon aquí tu macro.

Entonces, ¿quieres agregar un cliente y en ese momento que se genere una copia de la hoja "formato"?

Entiendo que capturas el cliente en la hoja "Home", ¿en cuál celda?

Revisa si esto te ayuda:

Sub CopiarFormato()
  Sheets("Formato").Copy after:=Sheets(Sheets.Count)
  ActiveSheet.Name = Sheets("Home").Range("A2")
  Sheets("Home").Select
End Sub

Hola Dante Amor, gracias por tu amable respuesta. Mañana te coloco aquí lo que tengo escrito en mi macro. Pero por lo que veo el modelo que me pusiste funcionará. Solo me queda la duda: ese .range("a2") tomará todos los valores que haya en el listado que se vaya generando en la hoja "clientes" y como evitar que si no hay nada en los renglones consecutivos en ese listado aparezca el msje de error de subindice fuera de rango o algo así me parece que sale.

Gracias de nuevo. 

Entonces no entendí lo que necesitas.

¿Quieres crear una hoja o quieres crear varias hojas?

Lo que necesito es dar de alta tantos clientes como lo desee y que por cada cliente se genere su propia hoja de estado de cuenta.

En "home" esta una celda donde ingreso el nombre, luego le doy guardar cliente y se copia el nombre a la hoja "clientes". Y de ahi pretendo que con esa alta automáticamente se cree la hoja de estado de cuenta para ese cliente, considerando que ese estado de cuenta sale de la hoja "formato" vacía para que se replique con cada cliente que añada. 

No sé si me doy a entender. 

No, sigo sin entender. Lo puedes explicar con ejemplos.

- Vas a la hoja "Home"

- Ingresas el nombre, ¿pero en cuál celda? Para ti es obvio, porque estás viendo tu hoja, pero yo no tengo ni idea de cómo están tus datos.

- Luego vas a guardar cliente. Eso qué es? ¿Es una macro? ¿Es un botón?, copia el cliente a la hoja clientes, ¿de cuál celda a cuál celda?, ¿Solamente copias el nombre o copias otros datos?

- Solamente quieres copiar la hoja "Formato". ¿Ya probaste la macro que te envié?

Es decir, después de "guardar cliente", ejecuta la macro que te envié. Lo que hace es copiar la hoja formato al final de tus hojas y le cambia el nombre a la nueva hoja con el nombre del cliente.

Pero como yo no sé en cuál celda tienes el cliente, puse de ejemplo la celda A2, pero tú tienes que cambiar "A2" por la celda donde tienes el cliente.


Tomará todos los valores que haya en el listado que se vaya generando en la hoja "clientes"

Eso no lo entiendo, dices que quieres crear una hoja por cada vez que creas un cliente. Entonces si el día de hoy creas un cliente, entonces el día de hoy solamente se creará una hoja. No entiendo a qué te refieres con "tomará todos los valores que haya en el listado..."


Nuevamente si lo puedes explicar con ejemplos y con imágenes.

Hola otra vez Dante Amor, mira el asunto está así de una forma más visua. En home celda I25 escribo el nombre del cliente, abajo tengo mi botón de agregar cliente, y ese cliente automáticamente se va a la hoja "clientes" a un listado que me sirve para la lista desplegable de "home" celda J19 para seleccionar el cliente del cual quiero ver, actualizar o imprimir su estado de cuenta. 

El asunto es que quiero esa hoja "formato" replicada para todos los clientes nuevos que vaya agregando, con el nombre del cliente. Es decir: Si yo agrego Juan N. Se captura, y que automáticamente se genere una hueva hoja llamada Juan N. y que el contenido de esa nueva hoja sea el formato para empezar a llenarlo con la info de Juan N. Si yo agrego María L. se captura y se genera la nueva hoja llamada Maria L. y el contenido de esa nueva hoja sea el formato para empezar a llenarlo con la info de María L. Y así sucesivamente, para todo cliente nuevo que registre. 

Disculpa las molestias y no haber sido más visual antes. Agradezco mucho tu aportación y tu ayuda. Saludos. 

Entonces crea otro botón en tu hoja "home", por ejemplo le pones al botón "crear hoja formato" y pones esta macro en ese botón:

Sub CopiarFormato()
  Sheets("Formato").Copy after:=Sheets(Sheets.Count)
  ActiveSheet.Name = Sheets("Home").Range("I25")
  Sheets("Home").Select
End Sub

Entonces capturas un nombre en la hoja "home" en la celda I25 y presionas el botón "crear hoja formato" y listo.

O si ya tienes una macro para agregar el cliente: "abajo tengo mi botón de agregar cliente", entonces en esa misma macro, al final de la macro y antes del End Sub, puedes poner esta instrucción:

Call CopiarFormato

Si tienes dudas, pon aquí tu macro para agregar cliente y hago el ajuste para crear la copia de la hoja "formato".

Hola otra vez,

mira, con el código como está escrito, pasa que escribo el nombre del cliente, le doy generar alta del cliente, y si lo guarda en "CLIENTES", eso está bien hasta ahí, y si, replica "FORMATO" pero le da nombre "FORMATO (2)" según se aprecia en la imagen, y la idea es que esa nueva hoja se llame "JUAN N." Además, al hacer click en generar alta me genera un error en tiempo de ejecución: error definido por la aplicación o el objeto. 

La idea es que esa nueva hoja se llame "JUAN N."

Para eso es esta línea en al macro para poner el nombre "JUAN N." a la nueva hoja

ActiveSheet.Name = Sheets("Home").Range("I25")

Pero hay algo en tu libro que no permite cambiar le nombre a la hoja.

Dime:

- ¿Tienes hojas ocultas?

- ¿Hojas protegidas?

- ¿El libro está protegido?

Puedes hacer la prueba en un nuevo libro, solamente crear las 3 hojas: "home", "clientes", "formato" y realiza la prueba nuevamente.

Cambia la línea del error por esto y prueba nuevamente:

ActiveSheet.Name = Sheets("Home").Range("I25").Value

Negativo, no está protegido nada, y cambiando la línea del error por lo que me pusiste, sigue haciendo lo mismo, crea la nueva hoja pero sigue llamándose "Formato(2)"

¿Probaste en un nuevo libro?

Mira Dante Amor, ya consigo que formato se replique con el nombre del cliente, pero eso solo ocurre una vez, puesto que tengo que el nombre de la Hoja activa lo extraiga de la hoja "clientes", del listado del Rango("A2") que es el primero evidentemente, pero si sigo cargando mas clientes, en A3, A4, A5... ya no lo hace, pensé que poniendo Range(A2:A100) es decir 100 posibles registros nuevos de clientes, lo conseguiría, pero bota error.  

La macro solamente es para crear una sola hoja.

Por eso te pregunté, ¿si hoy creas un cliente entonces solamente hoy se creará una hoja?

Si, afirmativo. 

Pero en el caso de que en el mismo día quisiera crear más clientes? ¿Cómo debo de adaptar el código para que si el mismo rato hago 3 o 4 clientes, se creen 3 o 4 hojas?

Si creas 1 o más clientes cada que ejecutes la macro agregar clientes, se creará hoja.

Pero tu libro tiene algo que no permite el funcionamiento esta línea:

ActiveSheet.Name = Sheets("Home").Range("I25").Value

Envíame tu libro para revisarlo

[email protected]

Listo, lo envié. [email protected] es el correo del cual lo envié

En tu macro tienes esta línea:

Range("I25:J25"). ClearContents

Eso borra el nombre, por eso no puede poner el nombre en la nueva hoja, porque el valor de la celda es vacío.

Ya hice el ajuste a la macro, prueba con esta macro:

Sub Clientenuevo()
'
' Clientenuevo Macro
  Application.ScreenUpdating = False
  Range("I25").Copy
  Sheets("CLIENTES").Select
  Range("A101").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False
  Range("A2:A101").Select
  Range("A101").Activate
  Application.CutCopyMode = False
  ActiveWorkbook.Worksheets("CLIENTES").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("CLIENTES").Sort.SortFields.Add Key:=Range("A101") _
      , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("CLIENTES").Sort
      .SetRange Range("A2:A101")
      .Header = xlGuess
      .MatchCase = False
      .Orientation = xlTopToBottom
      .SortMethod = xlPinYin
      .Apply
  End With
  '
  Sheets("Formato").Copy after:=Sheets(Sheets.Count)
  ActiveSheet.Name = Sheets("HOME").Range("I25").Value
  ActiveSheet.Range("F11").Value = Sheets("HOME").Range("I25").Value
  Sheets("HOME").Select
  Range("I25:J25").ClearContents
  Application.ScreenUpdating = True
End Sub

Hace perfectísimamente todo lo que tiene que hacer el libro de excel. Ya no da ningún problema. En verdad muchísimas gracias por todo el tiempo invertido en ayudarme. Muy generoso de su parte. Yo de macros sé muy poco y por eso tanto atorarme. Miles de gracias. Saludos cordialísimos! :)

Me encantó ayudarte, g racias por comentar!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas