Copiar toda una fila a otra hoja si se aplica condición

a [email protected]

Hoy estaba intentando llevar acabó la siguiente macro en VBA.

Tengo un libro con dos hojas:

Hoja1 : Datos

Hoja2 : Finalizados

Hoja Datos, consta de columnas desde "A" hasta "R" y en toda la columna R tiene aplicado una Validación de datos modo "Lista" con la palabra "Done".

Hoja Finalizados consta de las mismas columnas que Hoja Datos pero sin la Validación de datos en modo "Lista".

Bien lo que necesitaría es que cuando en la Hoja Datos finalice de cubir todas las celdas y llegué a la última R y seleccione Done (en el desplegable que me sale), todo esa fila se copié en la Hoja Finalizados en la última fila que tenga libre y en la Hoja de Datos no quede una línea en blanco dónde estaba esa fila.

Es decir que la selección de la celda R con la opción Done sea el desencadenante de mover toda esa fila a la última fila libre de la hoja Finalizados y que en la hoja Datos no se vean las líneas vacías que deja esa fila movida.

Así consigo saber qué tengo pendiente por terminar y tambien poder consultar las que ya finalicé si me hiciera falta

También tengo que decir que la hoja Datos nunca tiene unas determinadas tareas ya que según me salen más las voy metiendo así que necesitaría que la macro estuviera implementada para todas las filas hoy puedo tener 10 filas mañana 25 y así...

Agregó el cutre código que me salió y no me vale de mucho puesto que lo tengo que activar mediante botón y aún por encima me lo copia en la hoja Finalizados pero me sobreescribir lo que ya estaba pasado. Vamos una basura que no me vale por eso pido ayuda.

Sub mover()

Dim LastRow As String

LastRow = ActiveSheet.Range ("A" & Rows.Count).End(xlUp).Row

x = 2

For i = 2 To LastRow

Sheets("Datos").Activate

If Cells (I, "R").Value = "DONE" Then

Range(Cells(I, "A"), Cells (I, "R")).Cut

Sheets("Finalizados"). Activate

Cells(x, "A").Select

ActiveSheet.Paste

X = x + 1

End if

Next

End sub

Cómo dije no le hagáis mucho caso ya que quería que me sirviera de apaño pero ni eso.

1 respuesta

Respuesta
2

Pon el siguiente código en los eventos de la hoja "Datos"

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range, c As Range, filas(), n As Long, i As Long
  Application.ScreenUpdating = False
  Set r = Intersect(Target, Range("R:R"))
  If Not r Is Nothing Then
    For Each c In r
      If LCase(c.Value) = LCase("Done") Then
        ReDim Preserve filas(n)
        filas(n) = c.Row
        n = n + 1
        With Sheets("Finalizados")
          Range("A" & c.Row & ":R" & c.Row).Copy .Range("A" & .Range("R" & Rows.Count).End(3).Row + 1)
        End With
      End If
    Next
    If n > 0 Then
      For i = UBound(filas) To 0 Step -1
        Application.EnableEvents = False
        Rows(filas(i)).Delete
        Application.EnableEvents = True
      Next
    End If
  End If
  Application.ScreenUpdating = True
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro

Regresa a Excel, captura tu registro y selecciona Done en la columna R, el registro se moverá en automático a la hoja "Finalizados".

Hola Dante

Muchas gracias por tu ayuda.

Me hace una cosa extraña, cuando selecciono DONE mueve toda la fila sin problemas y no deja fila vacía (todo correcto), pero al copiarlo en la hoja FINALIZADOS lo hace en la fila 334 que no es la ultima fila libre, la última es la 338 en la 334 tengo datos y me los elimina para pegar la nueva fila.

Por otro lado cuando le doy a otro registro DONE lo mueve a la fila también 334 sobrescribiendo la anterior.

Sabes de donde puede venir el problema?

Un saludo.

¿Modificaste algo de la macro?

Hola Dante,

Nada de nada, hice copiar y pegar.

Un saludo y muchas gracias

En la hoja "finalizados" todas las filas con datos deben tener en la columna "R" la palabra "Done".

Completa todas las celdas que estén vacías y prueba nuevamente.

La pregunta no admite más respuestas

Más respuestas relacionadas