Macro excel: copiar datos en otro libro y eliminar datos de libro original

Hola,

Estoy intentando hacer una macro que haga lo siguiente, pero no lo consigo.

Tengo un libro (llamémosle "original"), en el cual tengo una hoja "índice" visible, y numerosas hojas ocultas. Cada una de estas hojas ocultas se está nombrada según la columna A de la hoja "índice" (en el rango desde a4 hasta la primera celda vacía).

En la columna C de la la hoja índice tengo ciertos valores, correspondientes a cada elemento de la columna A.

Aparte tengo otro libro (llamémosle "histórico"), en el cual archivo todos los datos de cada elemento (la fila completa) del original (copio la fila completa de datos), cuando se ha acabado la vida útil del elemento.

Lo que quiero es hacer una macro, que me archive automáticamente los elementos que han acabado su vida útil, del libro original, y me los archive en el histórico. Para ello:

1º. Debe buscar los elementos que han finalizado la vida útil, que serán los que en la columna C de "índice" aparezcan con el valor "1".

2º. Copie la fila completa de cada elemento al "histórico" (tiene los mismos campos).

3º. Visualice y elimine la hoja (inicialmente oculta) de cada elemento. Estas hojas contienen toda la información, que ya no es necesario guardar, en el histórico.

4ª. Elimine la fila del elemento correspondiente de la hoja "índice" del libro "original".

Posibilidades:

Según me recomendéis, puedo partir del libro "histórico" abierto, o cerrado. Si parto de él cerrado, deberé abrirlo y cerrarlo al finalizar.

Prefiero no poneros aquí lo que tengo preparado, ya que sería más complicado. Con esta información entiendo que será suficiente, y más sencillo.

Muchísimas gracias.

1

1 respuesta

1
Respuesta de

Hola Carlos23578, tengo una duda, quieres copiar los datos de la hoja indice a tu histórico o hay algo en indice que referencie a las hojas ocultas las filas de datos que quieres copiar al histórico.

Ya me dices y te ayudo de inmediato

Hola y muchas gracias por el interés. Te explico.

En "índice" hay datos que hacen referencia a las hojas ocultas. Por esto, antes de eliminar las hojas ocultas hay que pasar los datos de la hoja "índice" al libro "histórico".

Un saludo y gracias de nuevo.

Hola Carlos,

Espero haber entendido bien tu petición, vamos a suponer que tienen en el mismo directorio dos ficheros:

ORIGINAL.xlsm (donde copiaras la macro que adjunto) (grabar como fichero con macros)

HISTORICO.xlsx

Te darás cuenta que esta hecho en excel 2007, pero no hay problema si lo haces en 2003, solo que la extensión será solo xls en ambos ficheros.

en el fichero original tendrás una hoja llamada INDICE y otras hojas llamadas A1, A2, A3, A4..., asumo que en indice tienes definido tus datos de la siguiente manera:

TIT1 TIT2 TIT3(vida útil) ....

A1 DATO 1 ...

A2 DATO 0 ...

A3 DATO 0 ...

A4 DATO 1

De tal forma que las hojas A1 y A4 serán borradas del fichero original y las filas 2 y 5 del fichero original se copiarán integras y como valores al fichero histórico.

Si lo he entendido bien, este es el código que necesitas:

Sub GenerarHistorico()
'primero desactivamos los movimientos en pantalla y las alertas
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Workbooks.Open Filename:=ThisWorkbook.Path & "/HISTORICO.xlsx", ReadOnly:=False
Workbooks("ORIGINAL.xlsm").Activate
'**** Vamos a buscar los datos que ya cumplieron su vida útil ****
Sheets("INDICE").Select
Cells(1, 1).Select
'la variable fila guarda el número de filas que tiene la hoja origen
fila = Cells(65536, 1).End(xlUp).Row
'Asignemos una variable de la fila utilizada en la hoja destino
For i = 1 To fila
Sheets("INDICE").Select
Cells(i + 1, 1).Select
If ActiveCell.Offset(0, 2) = "1" Then
borrar_hoja = ActiveCell
ActiveCell.EntireRow.Select
Selection.Copy
Workbooks("HISTORICO.xlsx").Activate
Worksheets("Hoja1").Select
filacopia = Cells(65536, 1).End(xlUp).Row
Cells(filacopia + 1, 1).Select
ActiveCell.PasteSpecial xlPasteValues
Workbooks("ORIGINAL.xlsm").Activate
Selection.Delete Shift:=xlUp
Sheets(borrar_hoja).Select
i = i - 1
ActiveWindow.SelectedSheets.Delete
Worksheets("INDICE").Select
End If
Next
'grabamos y cerramos el libro histórico
Workbooks("HISTORICO.xlsx").Save
Workbooks("HISTORICO.xlsx").Close
'volvemos a activar las alertas y los cambios en pantalla
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Espero que haya sido lo que necesitas.

Saludos,

Freddy

Hola Freddy, y gracias por tu dedicación.

Muy a mi pesar, no tengo tiempo de probarlo ahora, ya que en breve tendré que dejar el ordenador, y casi seguro que hasta el miércoles. Así que no te preocupes si tardara en contestarte.

No obstante, he estado echando un vistazo a lo que has escrito, y aunque no entiendo todo bien (soy un poco novato, y tendría mirarlo detenidamente), he visto algo que no puedo poner. Se trata de utilizar para localizar la fila, la función "up" (fila = Cells(65536, 1).End(xlUp).Row). No puedo ya que 2 filas por debajo de todas estas filas de elementos, tengo una fila a modo de resumen o total. Es decir, que a la hora de copiar los datos al histórico, en algún momento tengo que situarme en la posición que corresponda, e insertar una nueva fila, para poder copiar estos datos.

¿Podría ubicarme en ella por medio de un offset? ¿O puedo hacerlo a través de la función contraria "down"?

Por otra parte, ¿es seguro con este código, que los datos se copian antes de eliminar la hoja?. De no ser así, no podría hacerse, ya que desaparecerían los datos.

No dudes que estoy muy ilusionado de probar el código que me propones en cuanto tenga tiempo.

Muchas gracias y espero tu respuesta.

Un saludo.

Hola Carlos,

La instrucción asigna a la variable fila, la última fila utilizada, fila = Cells(65536, 1).End(xlUp).Row, funciona de la siguiente manera, se va a la última fila del fichero (asumiendo que es 2003 Cells(65536,1), y luego sube a la última fila con información, si tienes totales en la fila 65534, hará un loop por 65534 veces antes de terminar el FOR.

Te recomiendo que tu fila de totales la pongas al inicio como cabecera, por tanto haría la cuenta del FOR desde 2 (FOR i=2 to fila), otra desventaja de poner tus totales al final de la hoja es que el código luego de copiar la fila al fichero HISTORICO, borrará la fila del fichero ORIGEN y subirá todos los datos una fila hacia arriba, por lo que si traspasa 20 datos, tu fila de totales terminará 22 filas por encima del final de la hoja.

Si tienes excel 2007, debes cambiar las 65,536 filas por 1'048,575 que son las filas que te permite tener.

Tambien puedes usar el down, pero tendrías que ubicarte no en Cells (65536,1) sino en Cells(1,1), ojo que si tienes una celda en la columna A en blanco y luego mas datos, se detendrá allí (o sea en la primera celda que encuentre en blanco) y no verificará ningún dato que este debajo de esa celda. IGUAL AL BORRAR SUBIRÁ UNA FILA POR CADA VEZ.

Ya me cuentas como te fue con el código.

No olvides que siempre antes de probar, debes guardar tus ficheros originales en otra carpeta de respaldo por si algo sale mal.

Esto de la programación es como la medicina, necesitamos ver al enfermo para tratarlo, y por la web solo tenemos una referencia de lo que pasa asi que no podemos hacer de doctores, solo de farmacéuticos.

Saludos,

por cierto, el código copia UNICAMENTE las FILAS de la hoja INDICE que contienen 1 en "vida útil", el contenido de las hojas A1, A2, A3, etc que se borran, no se copia en ningún sitio, que es lo que entendí. Ya que en el índice asumo que tienes algo asi como totales de los datos.

Te cito:

2º. Copie la fila completa de cada elemento al "histórico" (tiene los mismos campos).
3º. Visualice y elimine la hoja (inicialmente oculta) de cada elemento. Estas hojas contienen toda la información, que ya no es necesario guardar, en el histórico.
4ª. Elimine la fila del elemento correspondiente de la hoja "índice" del libro "original".

Lo repito, siempre guarda copias de respaldo de tus ficheros antes de modificarlos.

Saludos,

Hola Carlos,

No olvides cerrar la pregunta si consideras que ha sido contestada. Gracias por tu tiempo!!!

Gracias.

Tranquilo que no dejo a quien me ayuda tirado. A ver si tengo tiempo mañana de mirarlo detenidamente.

Hasta la vista y gracias de nuevo por el interés.

Hola de nuevo.

He estado adaptando a mi excel y probando la macro y tengo un problemilla, aunque no creo que sea de difícil solución.

El tema es que a la hora de borrar la hoja correspondiente al elemento del listado, en vez de eliminarme esa, se basa en la posición física de las hojas en el libro.

Es decir, lo he probado con un elemento a borrar, denominado "2". Pues bien, me borra la hoja 2 del libro, pero por posición, no por nombre.

El resto creo que va bien, aunque tendría que hacer más pruebas, que hasta que no aclare esto no puedo hacer.

Espero tu aclaración y gracias de nuevo.

Hola Carlos,Para evitar controversias, asegurate de nombrar a las hojas de manera que no se confunda la posición con el nombre. Si a la Hoja1 le nombro Hoja3, corro el riesgo que al no encontrarla asuma que hablamos del nombre indice y no de la hoja como tal.

Haz la prueba de nombrarles con A1, A2, A3, etc como en el ejemplo y no debería haber problemas.

Hola.

Pero no puedo nombrarlas de tal manera, ya que tengo ya todo el excel preparado (macros incluidas), de forma que sea posible nombrar los elementos (y por tanto las hojas), como simples números.

¿No hay ninguna forma de hacerlo así?

Gracias de nuevo.

Gracias por todo.

El problema de que "borrar_hoja" me borrara las hojas según su orden en vez de según su nombre, lo solucioné añadiendo la sentencia:

Dim borrar_hoja as string

antes de:

borrar_hoja = ...

Un saludo, y espero no haberte causado molestias.

Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje
¿No es la respuesta que estabas buscando? Puedes explorar otras preguntas del tema Microsoft Excel o hacer tu propia pregunta: