Modificar macro para que escriba en primera celda vacía

He utilizado esta macro hecha por Elsamatilde y funciona perfectamente, pero he intentado hacer que en vez de escribir en la hoja2 en la misma celda que en la hoja1 que lo haga en la primera celda vacía del rango seleccionado por la macro, siendo incapaz de resolverlo, agradecería que alguien me ayudara a resolverlo.

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'se controla el rango A2:A50 de la hoja1
'si se introduce algo en otro rango no se ejecuta el evento
If Intersect(Target, Range("A2:A50,e2:e50")) Is Nothing Then Exit Sub
'si se seleccionan varias celdas tampoco se ejecuta
If Target.Count > 1 Then Exit Sub
'se guarda el dato en Hoja2 en la misma ubicación que el ingresado
rgo = Target.Address(False, False)
Sheets("Hoja2").Range(rgo) = Target.Value
End Sub

1 Respuesta

Respuesta
1

Veo que el control se hace en 2 rangos distintos: A2:A50 y E2:E50.

Lo que intentas, ¿es qué se copie en la primer celda libre del rango?, es decir que si el dato se ingresa en A20 se copie dentro del rango A2:A50 pero en la primer libre que puede ser A35 y si ingresa algo en E2:¿E50 lo copie dentro de ese rango?

Si no es así mejor me lo explicas con un ejemplo escrito aquí.

Hola Elsa, saludos desde Barcelona,

Te explico cual es la necesidad, yo voy introduciendo datos en HOJA1 y se duplican en HOJA2 siempre en la misma fila como ya hace tu macro.

He creado un botón en la HOJA1 que ejecuta otra macro que hace que se imprima la HOJA2 y borra todo el contenido de las celdas. Mi problema es que cuando continuo introduciendo datos después de borrar el contenido de la HOJA2 deberían de colocarse los nuevos datos en la primera fila vacía de la HOJA2.

Como hay 2 rangos de ingreso de datos, la rutina busca la primer fila libre según la col del Target:

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'se controla el rango A2:A50, E2:E50 de la hoja1
'si se introduce algo en otro rango no se ejecuta el evento
If Intersect(Target, Range("A2:A50,e2:e50")) Is Nothing Then Exit Sub
'si se seleccionan varias celdas tampoco se ejecuta
If Target.Count > 1 Then Exit Sub
'se guarda el dato en Hoja2 en la primer fila libre de a col ingresada
libre= Sheets("Hoja2").Cells(65536, Target.Column) + 1
Sheets("Hoja2").Cells(libre, Target.Column) = Target.Value

Disculpa Elsa, no funciona coloca los datos de todas las filas de hoja1 en la misma fila de la hoja2 sobrescribiendo los datos.

Si, disculpa, cuando quise aclararlo no pude ingresar nuevamente.

La línea correcta es:

libre= Sheets("Hoja2").Cells(65536, Target.Column).End(xlup).Row + 1

PD) En la sección Macros de mi sitio podés encontrar otras instrucciones para obtener fines de rango.

Muchas gracias, funciona perfectamente, pero me di cuenta de algo al probarla, a ver si se puede solucionar.

Cuando escribo en los rangos de Hoja1 copia en la misma fila de Hoja2 hasta ahi correcto pero al querer modificar una linea ya escrita en Hoja1, me lo da como linea nueva en Hoja2, ¿se puede hacer que si modifico la linea ya escrita en Hoja1 corrija la misma linea de Hoja2?.

Si consideras que es una nueva pregunta finalizo esta y vuelvo a pedir ayuda

Saludos

Si por favor, esta ya está resuelta... te espero con la otra. Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas