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

Respuesta
2

 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 Sub

Gracias por el interés

Los datos empiezan en la fila dos. Tengo encabezados en las columnas

Un saludo

Te 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 Sub

Aví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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas