Organizar dos columnas con datos similares
Perdí una plantilla que me ordenaba dos columnas y la necesito para el trabajo.
La columna a es fija y la que varia mnensualmente es la b, aunque puede darse el caso que en b aparezcan mensualmente números que no exiten en a.
Supongamos que en la columna a tengo los números comprendidos entre el (1 al 100) faltando el 5,8 y 20. En la columna b tengo los números del (1 al 97) faltando el 6, 9 70. Lo que me hace falta es que al ordenar las columnas, queden los números ordenados por filas es decir:
a1-1 b1-1, a2-2 b2-2 etc.
Cuando en la columna a, lleguemos a la fila 5 al no existir ese numero y si existir en la columna b, en la columna a quedaría la celda en blanco
Al igual como el 6 que no existe en la columna b quedaría en blanco esa celda, de la columna b pero en la columna a quedaría el numero 6
1 Respuesta
H o l a :
La macro está según los ejemplos que pusiste, es decir, los números de la columna A y la B empiezan en la fila 1. Si tienes encabezados o no empiezan en la fila 1, entonces hay que hacer adecuaciones a la macro.
Sub OrdenarColumnas()
'Por.Dante Amor
Application.ScreenUpdating = False
Set h1 = ActiveSheet
u1 = Range("A" & Rows.Count).End(xlUp).Row
With h1.Sort
.SortFields.Clear: .SortFields.Add Key:=h1.Range("A1:A" & u1)
.SetRange h1.Range("A1:A" & u1): .Header = xlNo: .Apply
End With
For i = u1 To 2 Step -1
num = Cells(i, "A") - 1
Do While num > Cells(i - 1, "A")
Cells(i, "A").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
u2 = Range("B" & Rows.Count).End(xlUp).Row
With h1.Sort
.SortFields.Clear: .SortFields.Add Key:=h1.Range("B1:B" & u2)
.SetRange h1.Range("B1:B" & u2): .Header = xlNo: .Apply
End With
For i = u2 To 2 Step -1
num = Cells(i, "B") - 1
Do While num > Cells(i - 1, "B")
Cells(i, "B").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
u1 = Range("A" & Rows.Count).End(xlUp).Row
u2 = Range("B" & Rows.Count).End(xlUp).Row
u = Application.Max(u1, u2)
For i = u To 1 Step -1
If Cells(i, "A") = "" And Cells(i, "B") = "" Then
Rows(i).Delete
End If
Next
Application.ScreenUpdating = True
MsgBox "Proceso terminado", vbInformation, "ORDENAR COLUMNAS"
End SubTe anexo la macro actualizada
Sub OrdenarColumnas()
'Por.Dante Amor
Application.ScreenUpdating = False
Set h1 = ActiveSheet
u1 = Range("A" & Rows.Count).End(xlUp).Row
With h1.Sort
.SortFields.Clear: .SortFields.Add Key:=h1.Range("A2:A" & u1)
.SetRange h1.Range("A1:A" & u1): .Header = xlYes: .Apply
End With
u2 = Range("B" & Rows.Count).End(xlUp).Row
With h1.Sort
.SortFields.Clear: .SortFields.Add Key:=h1.Range("B2:B" & u2)
.SetRange h1.Range("B1:B" & u2): .Header = xlYes: .Apply
End With
'
If Cells(2, "A") <> Cells(2, "B") Then
Cells(2, "B").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(2, "B") = Cells(2, "A")
inicial = True
End If
For i = u1 To 3 Step -1
num = Cells(i, "A") - 1
Do While num > Cells(i - 1, "A")
Cells(i, "A").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
For i = u2 To 3 Step -1
num = Cells(i, "B") - 1
Do While num > Cells(i - 1, "B")
Cells(i, "B").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
If inicial Then Cells(2, "B") = ""
u1 = Range("A" & Rows.Count).End(xlUp).Row
u2 = Range("B" & Rows.Count).End(xlUp).Row
u = Application.Max(u1, u2)
For i = u To 2 Step -1
If Cells(i, "A") = "" And Cells(i, "B") = "" Then
Range("A" & i & ":B" & i).Delete Shift:=xlUp
End If
Next
Application.ScreenUpdating = True
MsgBox "Proceso terminado", vbInformation, "ORDENAR COLUMNAS"
End Sub
disculpame Dante,
he abierto un libro nuevo en excel, he grabado la macro. en la hoja uno en la columna a he metido ciertos numeros; pero cuando los meto en b no me ordena. es como si la macro no funcionara.
me puedes explicar paso a paso como tengo que hacer.
trabajo con excel 2003
gracias
Nuevamente yo.
Cuando ejecuto la macro me sale un mensaje
Se ha producido el error 438 en tiempo de ejecución
El objeto no admite esta propiedad o método
Si le doy a depurar, me lleva a la macro y pinta en amarillo With h1.Sort
La macro funciona para excel 2007.
Vamos a hacer lo siguiente.
Pon tus datos en la hoja. Tanto la columna A como la B deben tener encabezados en la primera fila y los números empezar en la fila 2.
Ordena la columna A de forma ascendente.
Ordena la columna B de forma ascendente.
Ahora ejecuta la siguiente macro:
Sub OrdenarColumnas()
'Por.Dante Amor
Application.ScreenUpdating = False
Set h1 = ActiveSheet
'
If Cells(2, "A") <> Cells(2, "B") Then
Cells(2, "B").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(2, "B") = Cells(2, "A")
inicial = True
End If
'
u1 = Range("A" & Rows.Count).End(xlUp).Row
u2 = Range("B" & Rows.Count).End(xlUp).Row
For i = u1 To 3 Step -1
num = Cells(i, "A") - 1
Do While num > Cells(i - 1, "A")
Cells(i, "A").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
For i = u2 To 3 Step -1
num = Cells(i, "B") - 1
Do While num > Cells(i - 1, "B")
Cells(i, "B").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
num = num - 1
Loop
Next
'
If inicial Then Cells(2, "B") = ""
u1 = Range("A" & Rows.Count).End(xlUp).Row
u2 = Range("B" & Rows.Count).End(xlUp).Row
u = Application.Max(u1, u2)
For i = u To 2 Step -1
If Cells(i, "A") = "" And Cells(i, "B") = "" Then
Range("A" & i & ":B" & i).Delete Shift:=xlUp
End If
Next
Application.ScreenUpdating = True
MsgBox "Proceso terminado", vbInformation, "ORDENAR COLUMNAS"
End SubAvísame cualquier detalle.
sal u dos
Buneas tardes dante,
funciona perfectamente, pero tengo un problemilla. tengo mas columnas que se tienen que comportar de la misma forma.
cambie la macro para que ande con las colunas f y g y como te digo perfecto. pero necesito que los datos de las columnas a, b, c, y d hagan lo mismo que f; que cuando en f salga una celda en blanco, se quede toda esa linea en blaco hasta f. y lo mismo cuando en g se quede una celda en blanco, que en h pase lo mismo.
no se si me he explicado muy bien.
gracias
Disculpa la pesadez Dante,
la colomnas que se tienen que comportar igual son
a,b,c,d,e,f esas por un lado
g,h por el otro
Dante,
Me he encontrado un problema, cuando en la hoja pongo números de 9 cifras, se queda bloqueado. Me sale el reloj de tiempo y no funciona.
Gracias
Vamos por partes, tu petición original eran de 2 columnas.
No entiendo bien cómo tienes tus datos y cómo quieres el resultado, porque simplemente no estoy viendo tu hoja de excel.
Me parece que tu ejemplo quedó muy corto:
"(1 al 100) faltando el 5,8 y 20. En la columna b tengo los números del (1 al 97) faltando el 6, 9 70"
Si quieres que la macro funcione con tus números reales, deberás poner ejemplos reales. Yo solamente realizo lo que tú me digas.
Suponiendo que tienes la siguiente secuencia:
2
123455
Lo que hace la macro es insertar las filas desde la 3 hasta la 123454, es decir, la macro inserta 123451 (ciento veinte tres mil líneas), yo sé que eso no fue lo que tú pediste, pero la macro tiene cierta lógica para poder ordenar los números.
Si pones el ejemplo:
"(1 al 100) faltando el 5,8 y 20. En la columna b tengo los números del (1 al 97) faltando el 6, 9 70"
En la macro, seguro te ordena correctamente las 2 columnas.
¿Entonces?
Si me dices qué datos son los que tienes, cómo los tienes y qué resultados quieres, a lo mejor es otra macro lo que necesitas.
¿Los números son consecutivos? Por el número que dices de nueve cifras, más bien parecería un número de pedido o de orden o de material. No lo sé, pero si no llevan un crecimiento uniforme; ¿A lo mejor necesitas que te diga qué números de la columna B no están en A y qué números de la columna A no están en B?
No lo sé, sin ejemplo reales, son puras especulaciones mías y no llegaría a nada realizando 20 macros.
Si no es posible que pongas los números reales, envíame tu archivo y me explicas con imágenes, colores y comentarios lo que necesitas.
Mi correo [email protected]
En el asunto del correo escribe tu nombre de usuario “maite duran aules” y el título de esta pregunta.
Buena noches Dante,
Ahora mismo te he mandado el correo tal como me has dicho.
como tengo que proceder, cierro la pregunta o espero a que me contestes?
H o l a:
Te anexo la macro
Sub OrdenarColumnas2()
'Por.Dante Amor
Application.ScreenUpdating = False
Set h1 = Sheets("Hoja1")
Set h2 = Sheets("Hoja2")
h2.Cells.Clear
h1.Columns("G:H").Copy h2.[A1]
h1.Columns("G:H").ClearContents
h2.Range("A1:B1").Copy h1.Range("G1")
j = Range("F" & Rows.Count).End(xlUp).Row
For i = 2 To h1.Range("F" & Rows.Count).End(xlUp).Row
Set b = h1.Columns("F").Find(h2.Cells(i, "A"))
If Not b Is Nothing Then
h1.Cells(b.Row, "G") = h2.Cells(i, "A")
h1.Cells(b.Row, "H") = h2.Cells(i, "B")
Else
j = j + 1
h1.Cells(j, "F") = h2.Cells(i, "A")
h1.Cells(j, "G") = h2.Cells(i, "A")
h1.Cells(j, "H") = h2.Cells(i, "B")
h1.Cells(j, "I") = "X"
End If
Next
'
h1.Range("A:I").Sort Key1:=h1.Range("F2"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
For i = 2 To h1.Range("F" & Rows.Count).End(xlUp).Row
If h1.Cells(i, "I") = "X" Then
h1.Cells(i, "F") = ""
End If
Next
h1.Columns("I").ClearContents
Application.ScreenUpdating = True
MsgBox "Termiando"
End Sub- Compartir respuesta