Macro para copiar según nombre de hoja

Tengo una macro con una hoja de registros por filas (hoja total), de esta hoja, con una macro paso los registros que tienen el la columna B:B el nombre de una hoja, a la correspondiente hoja.

Esta es la mcro que repito para cada nombre de hoja:

Sub ActualizarCuentas()
Dim cel As String
Application.ScreenUpdating = False
Sheets("CAR").Select
Range("A2:k65536").Select
Selection.ClearContents
Sheets("Total").Select
Range("B2").Select
Do While ActiveCell <> ""
If ActiveCell.Offset(0, -1).Value = "CAR" Then
Range(ActiveCell, ActiveCell.Offset(0, 10)).Copy
ActiveCell.Offset(1, 0).Select
Sheets("CAR").Select
ActiveCell.PasteSpecial
ActiveCell.Offset(1, 0).Select
Sheets("Total").Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop

Empezamos con otra hoja.

Quisiera saber si se puede abreviar la macro(con una variable) y, no repetir toda la macro para cada hoja.

1 respuesta

Respuesta
2

No me queda claro cómo querés seleccionar la hoja pero podrías guardar el nombre de la hoja que señala la celda activa al comenzar la macro:

Sub ActualizarCuentas()
Dim cel As String
Application.ScreenUpdating = False

'la macro se ejecuta estando seleccionada la celda que indica el nombre de hoja

nbreHoja = activecell.value
Sheets(nbreHoja).Select
Range("A2:k65536").Select
Selection.ClearContents
Sheets("Total").Select
Range("B2").Select
Do While ActiveCell <> ""
If ActiveCell.Offset(0, -1).Value = nbreHoja Then

'sigue tu macro

Si esto resuelve tu consulta no olvides finalizarla.

Puede que no me haya explicado bien.En la hoja se incorpora nuevos registros cada semana, tras lo cual ejecuto la macro y pasa las celdas indicadas de cada registro a la hoja que corresponde, según el nombre que figura en cada fila de la columna B,(que corresponde con un nombre de hoja) pero tengo una macro muy larga, con las mismas instrucciones repetidas para cada nombre de la columna B.

¿Se puede abreviar la macro, tal vez haciendo una lista con los nombres de las hojas para que repita la macro con cada nombre, o con una variable que recorra los nombres?

No sé si esta vez me habré explicado bien.

Gracias por tu tiempo y por la ayuda que nos prestas.

Saludos

Bien, basándome en tu macro, le agregué un bucle que recorre la col M donde tendrás la lista de hojas.

Te dejé una línea opcional xq me parece que solo 1 vez encontrará la hoja y copiará el rango de las 10 filas, es decir que cuando realice esto ya puede terminar el bucle do y buscar otra hoja.

Si esto es correcto habilitá la línea del Exit do, sino dejá tal como está, pruébalo y si todo queda algo sin resolverse debieras enviarme copia de tu hoja Total que es la que se recorre.

Sub ActualizarCuentas()
Dim cel As String
Application.ScreenUpdating = False
'en col M de hoja Total se encuentra la lista de hojas
nro = 1

i=0
'repito el bucle hasta encontrar una celda vacía
While i = 0
nbrehoja = Sheets("Total").Range("M" & nro)
'si encuentra una celda vacía es el fin del proceso
If nbrehoja = "" Then i = 1: Exit Sub
'incremento en 1 el nro de fila en col M
nro = nro + 1
'selecciono la hoja buscada
Sheets(nbrehoja).Select
Range("A2:k65536").Select
Selection.ClearContents
Sheets("Total").Select
Range("B2").Select
Do While ActiveCell <> ""
If ActiveCell.Offset(0, -1).Value = nbrehoja Then
Range(ActiveCell, ActiveCell.Offset(0, 10)).Copy
ActiveCell.Offset(1, 0).Select
Sheets(nbrehoja).Select
ActiveCell.PasteSpecial
ActiveCell.Offset(1, 0).Select
Sheets("Total").Select
'Exit Do 'opcional: salir si ya copió el rango
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
'repito para la siguiente hoja de la col M
Wend

Es justamente lo que me hacía falta y funciona perfectamente.

Gracias por tu atención y por ayudarnos a aprender cada día.

Saludos

Raimund

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas