Sobre la macro de Excel Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Tengo un problema con esta macro que copia el dato en otra hoja cada vez que se haga click en el, el problema es que lo copia en el mismo rango de la celda, quisiera saber como hacer para que copie el dato pero debajo del dato ya guardado, Gracias por su respuesta

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
i = 1
If Target.Count > 1 Then
For Each c In Target
Sheets("Hoja2").Range("A" & LTrim(Str(i))).Value = c.Value
i = i + 1
Next c
Else
Sheets("Hoja2").Range("A1").Value = Target
End If
End Sub

El problema

1 Respuesta

Respuesta
2

filx = Sheets("Hoja2").Range("A & Rows.Count).End(xlup).Row +  1

Sheets("Hoja2").Range("A" & filx).Value = Target

De este modo busca desde abajo hacia arriba la primer fila libre según col A.

Otros modos de encontrar fin de rango los tengo explicados en la sección Macros de mi sitio.

Muchas gracias por su respuesta, pero hay un error cuando cambio el valor 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
i = 1
If Target.Count > 1 Then
For Each c In Target
Sheets("Hoja2").Range("A" & LTrim(Str(i))).Value = c.Value
i = i + 1
Next c
Else
filx=Sheets("Hoja2").Range("A & Rows.Count).End(xlup).Row+1
Sheets("Hoja2").Range("A" & filx).Value = Target
End If
End Sub

¿Y dónde se produce el error?

Solo me ocupé de responder a tu consulta, cómo agregar el dato en Hoja2 a continuación de los que ya se encuentran. No me puse a analizar el resto de tu macro.

Enviame imagen del error o detalles de la línea que pueda estar marcando Excel.

Sdos!

Muchas gracias, por su respuesta

Si, disculpa. Falta una comilla de cierre:

filx = Sheets("Hoja2").Range("A" & Rows.Count).End(xlUp).Row + 1

Sdos!

Muchas gracias!, una ultima consulta, si quisiera copiar toda la fila con un click, o al menos todas las celdas que contengan datos dentro de la fila por ejemplo (A5:D5), como haría. Gracias nuevamente!

Por ser tu primer consulta quizás aún no sepas, pero es conveniente que realices una consulta 'completa'... no por partes.

Si necesitas copiar una fila no hará falta que selecciones el rango, solo una celda del rango, por lo tanto se ejecutará la 2da parte de la macro.

La macro sería así para todos los casos:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim filx As Integer
filx = Sheets("Hoja1").Range("A" & Rows.Count).End(xlUp).Row + 1
Target.EntireRow.Copy Destination:=Sheets("Hoja1").Range("A" & filx)
End Sub

De todos modos no se si esta es tu 'real' situación. Aclara con imágenes los posibles rangos que necesitas pasar a la otra hoja, porque tu macro original da idea confusa: para rangos pegas a partir de fila 1 y cuando es celda a continuación del último.... Está poco claro.

Sdos!

Mil disculpas por no ser muy especifico en la pregunta, estaba buscando en bastantes lugares pero la verdad no encuentro la forma de hacerlo,espero su comprensión. El caso es este: Tengo una lista de productos que me envían los proveedores en la cual me desempeño, el cual elegimos los productos que vamos a pedir y de inmediato se responde con una lista de los productos que ya seleccionamos. 

En la siguiente imagen muestro una lista de el proveedor:

A continuación muestro lo que debería hacer la macro al hacer click en el producto (Copiar el contenido: Código, Producto y Precio, en la Hoja2)

2),

Con la macro anterior logre que se copiara solo un dato, el detalle seria para copiar el dato con su respectivo codigo y su precio. Espero haber sido un poco mas claro. 

Que tenga un buen día.

Ahora se comprende. Como verás no se puede copiar la fila entera porque perderías la fórmula de TOTAL, así que vamos a copiar solo las 3 col:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'x Elsamatilde
Dim filx As Integer
'acotamos la ejecución solo a la col B
If Target.Column <> 2 Then Exit Sub
'primer fila libre en Hoja2, según col B (la col A podría estar vacía)
filx = Sheets("Hoja2").Range("B" & Rows.Count).End(xlUp).Row + 1
'puede haber 1 o varios productos seleccionados
For Each cd In Selection
    'solo se tienen que copiar las 3 col para no perder la fórmula en destino
    Range("A" & cd.Row & ":C" & cd.Row).Copy Destination:=Sheets("Hoja2").Range("B" & filx)
    filx = filx + 1
Next cd
End Sub

Como lo tenés colocado en el evento SelectionChange debemos evitar que se ejecute desde cualquier lado. Por eso la acoté a la col B

Podés seleccionar un rango continuo (por ej: B20:B23) y sino una celda sola ... pero no podrás seleccionar un rango discontinuo con la tecla CTRL porque se te repetirán los elementos.

¡Gracias! Funciona a la perfección

¿Y entonces porqué una valoración solo 'Buena'?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas