Comparar 2 listados y copiar filas nuevas en otra hoja ordenadamente

Necesitaría de su ayuda para resolver lo siguiente:

Tengo 2 hojas en la que Hoja1 contiene un listado que incluye celdas combinadas del siguiente modo:

En la Hoja2 tengo un listado que irá cambiando cuando se abra el libro, con los datos de este modo:

En la Hoja2 se encuentra un listado que ira creciendo N filas y estará desordenado siempre.

En la Hoja1 hay un listado que al abrir el libro se actualizará con las nuevas "Granjas" que se añadieron en la Hoja2, este listado tiene que estar siempre ordenado ascendentemente por el campo "ID" asociado a esa nueva Granja.
De momento la macro que tengo es un cuadro de dialogo que pregunta si queremos actualizar los datos, descombina todas las celdas de la hoja, ordena el listado y vuelve a combinar las celdas(me falta saber la manera de saber el rango de celdas para combinar porque de momento es un valor fijo) y me falta saber como añadir las filas nuevas de la Hoja2 al listado de la Hoja1, luego mediante formula añadiría contenido a las columnas D y E de la Hoja1.

Éste sería el código:

'Preguntamos al usuario si quiere actualizar los datos

'Si no quiere salimos de la macro sin modificar los datos
Sub Inicio()

Dim Mensaje01 As Variant

Mensaje01 = MsgBox("¿Desea actualizar los datos?", vbYesNo + vbInformation, "")
If Mensaje01 = vbYes Then Prueba Else Exit Sub
End Sub

'Lanzamos la actualizacion de datos en orden

Sub Prueba()
'Primero tenemos que descombinar todas las celdas de la hoja
Range("A2:AY2537"). UnMerge
Call Ordenar_Datos_Ascendente

'Segundo Llamamos a la funcion que trae los nuevos datos
'Call InsertarFilas

'Tercero combinamos las celdas para dejarlo como estaba
Range("C2:C3").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
End Sub

Sub Ordenar_Datos_Ascendente()
'ORDENA DE A Z segun la columna A
Range("C1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub

¿Alguien puede echarme una mano?

Muchas gracias a quien pueda orientarme/ayudarme.

Respuesta
1

La verdad que no le veo ninguna utilidad a combinar las celdas B2:B3 y C2:C3 más que la estética, por eso la solución que te propongo no incluye combinar celdas.

La Macro que necesitas para insertar filas es la siguiente:

Sub InsertarFilas()

Sheets("Hoja2").Range("C2").Select
Do
If ActiveCell.Value = False Then
fila = ActiveCell.Row
valor = Cells(fila, 1).Value
Sheets("Hoja1").Select

Range("A1").Select
Do
ActiveCell.Offset(1, 0).Select
Loop Until ActiveCell.Value = ""
ActiveCell.Offset(0, 1).Value = valor
Sheets("Hoja2").Select
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop Until ActiveCell.Value = ""

End Sub

Esta macro va a buscar las ID de la hoja2 que no estén en la hoja1 y las añadirá en la hoja1

He añadido una columna auxiliar en hoja2 para simplificar, te dejo el archivo en dropbox para que puedas verlo para entender mejor la idea y adaptarla a tus necesidades.

Espero te sirva

Un saludo

https://www.dropbox.com/s/87qqmhel7pp64vy/cabras%20y%20ovejas.xlsm?dl=0 

Muchas gracias por la rapidez,

Lo de combinar las celdas también es para evitar que hagan filtros a esa columna, pero también me puede servir no combinarlas. El objetivo de esto es para evitar que la gente qeu abra la hoja haga un filtro y muestre solo los mataderos del Centro1 (cogiendo tu ejemplo de dropbox).

En el ejemplo que me sugieres, al copiar los elementos nuevos a la hoja1 el listado no queda ordenado por id sino que se copia al final, necesitaría saber como se hace esto último.

Alguna sugerencia?

De nuevo muchas gracias por tu código.

En tu código ya estaba para ordenar:

Sub Ordenar_Datos_Ascendente()
'ORDENA DE A Z segun la columna A
Range("C1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub

¿Lo qué faltaba era añadir filas no?

Este es el código que estoy usando actualmente:

'Preguntamos al usuario si quiere actualizar los datos
'Si no quiere salimos de la macro sin modificar los datos
Sub Inicio()
Dim Mensaje01 As Variant
Mensaje01 = MsgBox("¿Desea actualizar la Hoja1?", vbYesNo + vbInformation, "")
If Mensaje01 = vbYes Then Prueba2 Else Exit Sub
End Sub

Sub Ordenar_Datos_Ascendente()
'ORDENA DE A Z segun la columna A
Range("C1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub

Sub Prueba2()
'Se ejecuta desde Hoja2 volcando nueva lista en Hoja1
'Quitamos la propiedad de celdas combinadas a toda la hoja
Range("A2:AY2537").UnMerge
'Borramos Hoja1 de datos anteriores

'Esta opcion tengo que descartarla porque los datos de la columna D de la Hoja1 son estaticos
'Sheets("Hoja1").Range("A2:B2537") = ""
'Numero de fila destino donde se empezara copiara el listado
filx = 2
Sheets("Hoja2").Select
'recorremos la col A hasta encontrar una celda vacía. Fin de rango
Range("A2").Select
While ActiveCell.Value <> ""
ActiveCell.Copy Destination:=Sheets("Hoja1").Range("A" & filx)
'Sumamos 2 porque al combinar celdas queda una celda en blanco que habrá que saltarse
filx = filx + 2
'pasa a la fila siguiente en Hoja2 y repite el bucle
ActiveCell.Offset(1, 0).Select
Wend
'Lo mismo para la col B
Range("B2").Select
filxB = 2
While ActiveCell.Value <> ""
ActiveCell.Copy Destination:=Sheets("Hoja1").Range("B" & filxB)
'Sumamos 2 porque al combinar celdas queda una celda en blanco que habrá que saltarse
filxB = filxB + 2
'pasa a la fila siguiente en Hoja2 y repite el bucle
ActiveCell.Offset(1, 0).Select
'Ordenamos el listado
Call Ordenar_Datos_Ascendente---->Esta funcion la pongo mas abajo 
Wend
MsgBox "Actualización de Hoja1 terminada."
End Sub

Sub Ordenar_Datos_Ascendente()
'ORDENA DE A Z segun la columna A
Range("C1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
End Sub

Mi código deja ordenado el listado de la hoja 2 y no debo hacerlo, tambiéntiene el erro que cuando se ingresa un nuevo elemento con el Id más pequeño que el último ingresado, el listado de la hoja1 se descuadra quedando el listado corrpto y sin correspondencia logia con el listado de la hoja2

Hoja1:

Hoja2:

Vuelvo a subir el archivo pero ya preparado para que englobe todo. Pruébalo

Un saludo

https://www.dropbox.com/s/mu3nt7hyhdctwuy/cabras%20y%20ovejas2.xlsm?dl=0 

GREGORI0001 el archivo que has subido esta protegido por contraseña y no puedo abrirlo, cual es?

Como puedo hacer para que en la hoja1, la columna C tome su valor correspondiente de la hoja2 columna B? actualmente se queda en blanco

Pon esta fórmula en hoja1 C2 y arrastra hacia abajo

=SI(A2="";"";BUSCARV(A2;Hoja2!$A$2:$B$37;2;FALSO))

Muchas gracias! ahora solo tengo que averiguar como hacer el combinado de celdas...:) 

Para poder ejecutar la macro sin problemas uso esta funcion para descombinar todo al principio:

'Quitamos la propiedad de celdas combinadas a toda la hoja
Range("A2:AY2537").UnMerge

Pero luego no se como decir que combine las celdas de la columnaB y las celdas de la columna C (para que queden el doble de altas)  y solo hasta la últia fila escrita, de momento tengo esto:

Range("C2:C3").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Range("C4:C5").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge

.....y así hasta la última

End Sub

Es decir...tengo puesto a pelo las celdas, pero claro, no es funcional y ni va a funcionar siempre.

Esto te valdrá, pero como te dije, combinar celdas suele conllevar problemas

Sub merge()

i = 2
j = 3

Sheets("Hoja1").Select

Do
Range(Cells(i, j), Cells(i + 1, j)).Select
If ActiveCell.Value = "" Then Exit Sub
Selection.merge
i = i + 2
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
End With
Loop

Selection.UnMerge

End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas