Copiar y pegar filas de una hoja a otra hoja VBA

Estoy buscando una macro que filtre, copie y pegue la información de una hoja que le llamo (Laboratorios) a otra que le llamo (Datos).

La hoja llamada (laboratorio) tiene una columna con ID que identifica los registros pero el cual se repite n veces, el objetivo de la macro es que copie la información del primer registro que encuentre con ese ID y luego copie los otros en la misma fila donde se copió la primera fila espero hacerme entender. Estado revisando códigos pero solo logro pegar la primera fila ..

Sub Copiar_Click()

Dim Perfil As String

Worksheets("L-25").Range("3:3"). Copy

Worksheets("Hoja1").Range("4:4"). PasteSpecial xlPasteAll

Application.CutCopyMode = False

End Sub

2 Respuestas

Respuesta
1

Puedes explicar con imágenes cómo están tus datos en la hoja "Laboratorios" y otra imagen para ver cómo quieres los datos en la hoja "Datos"

Explica uno de los ejemplos que vienen en las imágenes.

hola muchas gracias por tu rápida respuesta.

La primera imagen es la hoja "Laboratorio" y la segunda la hoja "DATOS". Lo ideal es que empiece a copiar los des pues del primer registro desde la columna D.

gracias por tu ayuda....

Hola mira de esta manera tengo construido parte del código, el cual me funciona bien pero he no se si adicionándole condiciones puedo hacer el copiado en filas.

Sub Copiar()
'copiar
Sheets("DATOS").Select
Rows("4:2000").Select
Selection.Delete Shift:=xlUp
Range("E9").Select
Sheets("Laboratorios").Select
Range("D10").Select
Rows("3:2000").Select
Selection.Copy
'Pegar
Range("E11").Select
Sheets("DATOS").Select
Range("A4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End Sub

¿Cuál es el número de ID? El que dice "Número de solicitud", ¿columna "D"?

¿De cuál columna a cuál columna se debe copiar desde la "E" hasta la "Z"?


En las imágenes no se ve el número de fila.

¿En cuál fila empiezan los datos en ambas hojas?


No te preocupes por el código, yo te entrego la macro, mejor explícame con tu ejemplo real, qué hay que copiar y exactamente en dónde pegar.

Prueba con la siguiente macro

Te copia las columnas de A a D, si los registros son iguales por el ID (columna "D") entonces te copia de la E a la Z, el siguiente registro de lo pone en la misma fila pero en la siguiente columna.

Sub Copiar_Datos()
'Por Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Laboratorios")
    Set h2 = Sheets("DATOS")
    '
    f_lab = 3       'fila inicial de los datos de laboratorios
    f_dat = 4       'fila inicial de los datos de Datos
    col = "D"       'columna con el ID
    '
    h2.Rows(f_dat & ":" & Rows.Count).ClearContents
    col_sig = Columns(col).Column + 1
    ant = h1.Cells(f_lab, col).Value
    For i = f_lab To h1.Range(col & Rows.Count).End(xlUp).Row + 1
        If ant = h1.Cells(i, col).Value Then
            h1.Range(h1.Cells(i, "A"), h1.Cells(i, col)).Copy
            h2.Cells(f_dat, "A").PasteSpecial xlValues
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "Z")).Copy
            h2.Cells(f_dat, col_sig).PasteSpecial xlValues
            col_sig = col_sig + 22
        Else
            f_dat = f_dat + 1
            col_sig = Columns(col).Column + 1
            h1.Range(h1.Cells(i, "A"), h1.Cells(i, col)).Copy
            h2.Cells(f_dat, "A").PasteSpecial xlValues
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "Z")).Copy
            h2.Cells(f_dat, col_sig).PasteSpecial xlValues
        End If
        ant = h1.Cells(i, "D").Value
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

Prueba y me comentas.

Si es lo que necesitas, podrías cambiar la valoración de la respuesta. "Votar" o "Excelente"

¡Gracias! 

¿Cuál es el número de ID? El que dice "Número de solicitud", ¿columna "D"?

  •  El numero ID  es la columna C - Perfil

¿De cuál columna a cuál columna se debe copiar desde la "E" hasta la "Z"?

  • Para el primer registro se debe copiar desde la  COLUMNA A  hasta la  FI
  • Si hay mas registros identificados con el mismo ID en la columna C quiero que se copien desde la columna E en la HOJA LABORATORIOS y se pegue en la HOJA DATOS después de la Columna FI y que se haga igual para los siguientes ID que se repitan.

¿En cuál fila empiezan los datos en ambas hojas?

  • En la hoja laboratorios empiezan en la fila 3  y en la hoja DATOS empieza en la fila 4.

Te anexo la macro actualizada

Sub Copiar_Datos()
'Por Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Laboratorios")
    Set h2 = Sheets("DATOS")
    '
    f_lab = 3       'fila inicial de los datos de laboratorios
    f_dat = 4       'fila inicial de los datos de Datos
    col = "C"       'columna con el ID
    '
    h2.Rows(f_dat & ":" & Rows.Count).ClearContents
    col_sig = Columns("E").Column
    ant = h1.Cells(f_lab, col).Value
    For i = f_lab To h1.Range(col & Rows.Count).End(xlUp).Row + 1
        If ant = h1.Cells(i, col).Value Then
            h1.Range(h1.Cells(i, "A"), h1.Cells(i, "D")).Copy
            h2.Cells(f_dat, "A").PasteSpecial xlValues
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "FI")).Copy
            h2.Cells(f_dat, col_sig).PasteSpecial xlValues
        Else
            f_dat = f_dat + 1
            col_sig = Columns("E").Column
            h1.Range(h1.Cells(i, "A"), h1.Cells(i, "D")).Copy
            h2.Cells(f_dat, "A").PasteSpecial xlValues
            h1.Range(h1.Cells(i, "E"), h1.Cells(i, "FI")).Copy
            h2.Cells(f_dat, col_sig).PasteSpecial xlValues
        End If
        col_sig = col_sig + 161
        ant = h1.Cells(i, col).Value
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

No olvides cambiar la valoración en la respuesta.

gracias nuevamente solo quiero preguntarte una ultima cosa me pide definir la variable h1 yo la defino, pero luego me pide definir un objeto para h1 y la verdad estoy un poco confundido....nuevamente gracias y te agradezco mucho..

Si tienes esta instrucción option explicit, puedes quitarla.

También revisa en el menú de VBA, Herramientas, Opciones, en Editor, la casilla Requerir declaración de variables debe estar apagada.

En VBA no es necesario declarar variables:

Según su función ¿Cómo declarar variables?

Si aun así te pide declarar, entonces solamente pon

dim h1, h2, f_lab, f_dat, col, col_sig, ant, i, etc

¡Gracias! 

Muchas gracias ya revise todo y quedo perfecto me esta funcionan muy bien, gracias por compartir tus conocimientos... y hasta una próxima.. 

Respuesta
1

Este el es resultado de la macro, de la hoja laboratorio copie los 1, los 3 y los 5 a la hoja datos,

con esta macro

Sub COPIAR()
Dim FUNCION As WorksheetFunction
Set FUNCION = WorksheetFunction
Set h2 = Worksheets("DATOS")
Set h1 = Worksheets("LABORATORIO")
Set datos = h1.Range("A1").CurrentRegion
With datos
    C = .Columns.Count
    ID = Val(InputBox("ID A COPIAR?, DEJAR EN BLANCO Y DAR ENTER PARA SALIR"))
    If ID = Empty Then End
    .Sort KEY1:=h1.Range(.Columns(1).Address), ORDER1:=xlAscending, Header:=xlYes
    CUENTA = FUNCION.CountIf(.Columns(1), ID)
    FILA = FUNCION.Match(ID, .Columns(1), 0)
    Set origen = .Rows(FILA).Resize(CUENTA)
    Set destino = h2.Range("A1").CurrentRegion
    R = destino.Rows.Count
    Set destino = destino.Rows(R + 1).Resize(CUENTA, C)
    destino.Value = origen.Value
End With
Set datos = Nothing: Set destino = Nothing: Set origen = Nothing
Set h1 = Nothing: Set h2 = Nothing: Set FUNCION = Nothing
End Sub

¡Gracias! por tu pronta respuesta

ya probé el código y veo que funciona bien pero también Quisiera que el valor del mismo ID se copiara en la misma fila que se guardo el primero las veces que este se repita....

algo como esto ,..

1   55

1  83

1  47 

y cuando yo copie que en la hoja DATOS quede de la siguiente manera en celdas apartes..

1   55   83   47

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas