Copiar datos omitiendo las celdas en blanco.

Tengo un código que me permite copiar y pegar unos valores desde otro libro, pero tiene un defecto al momento de existir una fila en blanco, ya que pega los valores a partir de la ultima fila con datos, pero si esta esta entre datos remplaza los de abajo.

Sub prueba()
Dim wbDestino As Workbook
Dim wbOrigen As Workbook
Dim hdestino As Worksheet
Dim horigen As Worksheet
archivo = Application.GetOpenFilename
If archivo = False Then Exit Sub
Workbooks.Open archivo
ThisWorkbook.Activate
Set wsDestino = Workbooks(ThisWorkbook.Name)
Set hdestino = wsDestino.Worksheets("Acumulado Ventas")
Set wsOrigen = Workbooks.Open(archivo)
Set horigen = wsOrigen.Worksheets("Ventas")
ufila = horigen.Range("A" & Rows.Count).End(xlUp).Row
ufila1 = hdestino.Cells(Rows.Count, "A").End(xlUp).Row
horigen.Range(Cells(2, "O"), Cells(ufila, "O")).Copy Destination:=hdestino.Cells(ufila1 + 1, 1)
horigen.Range(Cells(2, "A"), Cells(ufila, "A")).Copy Destination:=hdestino.Cells(ufila1 + 1, 2)
horigen.Range(Cells(2, "B"), Cells(ufila, "B")).Copy Destination:=hdestino.Cells(ufila1 + 1, 3)
horigen.Range(Cells(2, "C"), Cells(ufila, "C")).Copy Destination:=hdestino.Cells(ufila1 + 1, 4)
horigen.Range(Cells(2, "F"), Cells(ufila, "F")).Copy Destination:=hdestino.Cells(ufila1 + 1, 5)
horigen.Range(Cells(2, "G"), Cells(ufila, "G")).Copy Destination:=hdestino.Cells(ufila1 + 1, 6)
Workbooks(wsOrigen.Name).Close SaveChanges:=False
End Sub

 Por ejemplo si existe una fila en blanco como esta

Los nuevos datos se pegaran a partir de la fila 6 y la idea es que no ocurra eso.

1 respuesta

Respuesta
1

En casos así se debe tener en cuenta, a la hora de buscar el fin de rango, aquella columna que si o si tenga información completa. Por ejemplo en tu caso puede ser la de Código o Producto o cualquiera que se observa hasta el final. Aquí tomé C:

ufila = horigen.Range("C" & Rows.Count).End(xlUp).Row

Es lo mismo para ufila1, pero en ese caso la primera fila para el pegado sería:

ufila1 = hdestino.Range("C" & Rows.Count).End(xlUp).Row + 1

Estás utilizando 2 expresiones diferentes pero ambas te hacen lo mismo.

Ahora, si tuvieses una hoja como en la siguiente imagen donde nunca se sabe cuál es la columna que más datos tiene hay que evaluar diferente. No sirve utilizar CurrentRegion porque una fila o columna vacía hace finalizar el rango aunque luego sigan más registros.

En este caso, toda la tabla está incompleta lo que dificulta saber donde termina un rango, por eso se lo busca con un bucle:

For i = 1 To 14      'controla col A:O  ..... ajustar
'la fila final se toma x aproximación y dependerá de qué tan larga será la tabla 
If horigen.Cells(10000, i).End(xlUp).Row > ufila Then ufila = horigen.Cells(10000, i).End(xlUp).Row
Next i

Para ufila1 sería:

For i = 1 To 14 'controla col A:O
If hdestino.Cells(10000, i).End(xlUp).Row > ufila1 Then ufila1 = hdestino.Cells(10000, i).End(xlUp).Row
Next i
Ufila1 = ufila1 + 1

Observa que al final le sumo 1 y así no necesitas agregarlo en cada instrucción de pase.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas