Como ordenar registros en excel por bloques con macros

Quiero hacer una macro que me ordene registros en forma descendente, el punto aquí es que mi archivo tiene una división entre cada registro. Para empezar solo necesito que me ordene los datos de las columnas A a la F. Te muestro estas imágenes para que veas como están mis datos en excel.
>
Como podrás ver en el registro 22 tengo la letra N (acompañada de otra cadena de caracteres), esa N es una división, básicamente yo necesito que la macro ordene en este caso del registro A23 al F25 en forma descendente, y una vez que encuentre otra N, seleccione los registros (en bloque) hasta que encuentre otra N y corte ahí la selección y ordene los datos. Básicamente seria crear una macro donde seleccione después de la letra N y antes de una N los registros y los ordene, y que este proceso lo realice con todos los registros posteriores que tengo en el archivo en base a esa división de caracteres de la letra N. El punto aquí es que este archivo se actualiza día a día, y nunca caen las separaciones de N en la misma posición, siempre varían, es ese el detalle y quisiera ver si es posible que me apoyaras en como definir esto en un código de visual. He estado haciendo códigos pero ninguno me funciona en base a la condición que necesito de la selección por bloques de los registros.

1 respuesta

Respuesta
1
Pues bien quedarí algo así:
Sub ordenar()
Dim celdaINI,celdaFIN,valor As String
Range("A1").Select
Do While ActiveCell.Value<>""
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaINI=ActiveCell.Address
valor=ActiveCell.Offset(0,1).Address
End If
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaFIN=ActiveCell.Offset(-1,5).Address
celda=ActiveCell.Offset(-1,0).Address
Range(celdaINI,celdaFIN).Select
    Selection.Sort Key1:=Range(valor), Order1:=xlDescending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End If
Range(celda).Select
Loop
End Sub
Es ta macro comienza en la celda A1 y va bajando hasta que encuentra un N (siempre que no haya celdas vacías por medio, si no se parará) la marca, sigue bajando hasta que vuelve a encontrar otra N y marca la fila anterior 5 columnas a la derecha (Col F) selecciona el rango y como no sé por que columna del rango quieres ordenar he supuesto que es la B si no es así cambia el numero de la instrucción en negrita.
Se repite el ciclo hasta que encuentra una celda en blanco en la Col A.
Pruebalá y me comentas, si te ha servido puntúa y finaliza la consulta. Gracias.
>Un saludo
>Julio
Hola, agradezco el código que me has enviado, parece que me servirá y me ayudara mucho, el punto es que mi archivo tiene en la columna A registros vacíos, debido a que hago un proceso previo que elimina ciertos registros en base a unas condiciones que he diseñado, no se si se pueda que el código no considere espacios vacíos y siga buscando y seleccionando hasta que encuentre la siguiente N en la columna A. por que una vez que ordena los registros, los vacíos lógicamente tendrán que estar hasta abajo y así consecutivamente.
Te agradezco nuevamente.
Un saludo
Toño
Vale pues truquito al canto que haga doble ciclo para buscar la letra N:
Sub ordenar()
Dim celdaINI,celdaFIN,valor As String
Range("A1").Select
Do While ActiveCell.Value<>"$A$65536"
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaINI=ActiveCell.Address
valor=ActiveCell.Offset(0,1).Address 'Ya sabes que debes elegir la Col a ordenar
End If
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaFIN=ActiveCell.Offset(-1,5).Address
celda=ActiveCell.Offset(-1,0).Address
Range(celdaINI,celdaFIN).Select
    Selection.Sort Key1:=Range(valor), Order1:=xlDescending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End If
Range(celda).Select
Loop
ActiveCell.End(xlUp).Select
End Sub
Prueba esta he cambiado pequeñas cosas debido a tus celda vacías, bajará hasta el final de la hoja, y después subirá a la ultima celda con datos para que no tengas que subir con la barra de desplazamiento.
>Un saludo
>Julio
Gracias por la modificación, fíjate que la he probado y se traba, empieza a hacer el proceso pero se traba y se queda pasmado el archivo de excel y no responde, por el momento la estoy probando en vista y en office 2007, ¿no se si sea esa alguna causa que se trabe y en XP funcione normal? De echo la macro original la correré en XP. Espero me puedas dar tu opinión respecto a esto.
Gracias.
Toño
Hola experto, fíjate que he estado probando los dos códigos que me enviaste y sucede el mismo error con ambos, he modificado ciertas cosas del código pero genera el mismo error, has de cuenta que selecciona del registro A21 AL F22 y como que esta esta seleccionando pero después se traba excel y hay que cerrarlo con el administrador.
Espero no estarte quitándote mucho tiempo, y ojala me puedas ayudar o decir que le modifico al código para hacerlo funcionar apropiadamente.
De nuevo muchas gracias
Saludos
Toño
Vale ya me di cuenta lógico esta en una celda en la linea 12 que dice Repite esto mientras que la celda activa se distinto de N y ya esta en N hay que modificar la posición para que continué con el código:
Sub ordenar()
Dim celdaINI,celdaFIN,valor As String
Range("A1").Select
Do While ActiveCell.Value<>"$A$65536"
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaINI=ActiveCell.Address
valor=ActiveCell.Offset(0,1).Address 'Ya sabes que debes elegir la Col a ordenar
ActiveCell.Offset(1,0).Select
End If
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaFIN=ActiveCell.Offset(-1,5).Address
celda=ActiveCell.Offset(-1,0).Address
Range(celdaINI,celdaFIN).Select
    Selection.Sort Key1:=Range(valor), Order1:=xlDescending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End If
Range(celda).Select
Loop
ActiveCell.End(xlUp).Select
End Sub
Vale ya la hemos dado paso para que pueda seguir con el bucle.
Pruebalá ahora.
>Un saludo
>Julio
Muchas muchas gracias! Funciona muy bien! Gracias! Una ultima pregunta, ¿cómo puedo hacer que me acomode en base a la columna A y a los datos de la columna B? Le modifique para que me acomode en base a la columna A, así por letras, pero quisiera que acomodara los datos de la columna B igual en orden descendente y asim em base al orden previo de la columna A, ¿no se si me de a entender?
De lo demás te agradezco muchísimo!
Saludos!
Toño
Pues dándole dos instrucciones de fila:
Sub ordenar()
Dim celdaINI,celdaFIN,valor, valor1 As String
Range("A1").Select
Do While ActiveCell.Value<>"$A$65536"
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaINI=ActiveCell.Address
valor=ActiveCell.Address 'Ya sabes que debes elegir la Col a ordenar
valor1=activeCell.Offset(0,1).Address
ActiveCell.Offset(1,0).Select
End If
Do While ActiveCell.Value<>"N"
ActiveCell.Offset(1,0).Select
Loop
If ActiveCell.Value="N" Then
celdaFIN=ActiveCell.Offset(-1,5).Address
celda=ActiveCell.Offset(-1,0).Address
Range(celdaINI,celdaFIN).Select
Selection.Sort Key1:=valor, Order1:=xlDescending, Key2:=valor1 _
        , Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortNormal
End If
Range(celda).Select
Loop
ActiveCell.End(xlUp).Select
End Sub
Espero que ya sea el final y te sirva.
>Un saludo
>Julio
Puntúa y finaliza por favor si te ha servido.
Gracias! Pero me marca un error en la función de donde ordena, me aparece un cuadro cuando ejecuto la macro, error 1004, y dice que la fórmula puede tener un error, ¿no se si me puedas decir en donde le cambio y así?
Mil gracias de nuevo!
Toño
Julio, ya lo resolví, faltaban unos paréntesis en los keys! Gracias! Tengo otra duda pero pues no se si puedas, como le hago para que cuando llegue a la ultima N, ¿corte y no se siga de lleno hasta el registro 65000?
Seria la ultima lata que te doy!
Nuevamente mil gracias!
Saludos!
Toño
¿Pues piensa tu un poco como hacemos para que excel sepa que es la última? Si ni siquiera tu lo sabes porque el archivo se modifica constantemente y encima hay celdas vacías por medio. Imagina tu alguna condición para que sepamos que es la ultima N si quieres corta antes la macro si piensas que nunca van a llegar tus datos por ejemplo a la fila 200 pues pones Do While ActiveCell. Address<>"$A$200" pero ya sabes que si alguna vez tus datos pasan de esa fila nunca los buscará, date un margen suficiente y corta a tu conveniencia.
>Un saludo
>Julio
Pd: perdón fíjate en la linea que he puesto que en la macro puse value y fallará es address lo correcto.
Experto, muchas gracias por tu atención! Ha sido de gran ayuda este código! Para finalizar, ya había modificado el rango así como me lo ejemplificas, pero se sigue de lleno hasta el final! Pero no tengo problema por eso! Funciona muy bien y nuevamente te agradezco tu ayuda!
Saludos!
Toño

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas