Ordenar una matriz al interior de un rango de Excel

  • En una hoja de la planilla Excel coloco una matriz (3×3) partiendo desde la celda A7 hasta la celda C9, ahora bien me doy un amplio rango para ordenar los números de esta matriz, entre la celda A1 hasta celda C15 (en las restantes celdas no hay datos) y requiero que se ordene de mayor a menor pero en la misma ubicación.

    Al hacer una macro utilizando todo el rango (desde A1 hasta C15) las coloca siempre ordenadas a partir de la celda A1 y obviamente si lo efectúo manualmente y reduzco el rango a las que las contiene datos me las deja como quiero.

    Alguna macro o instrucción me permite realizar este procedimiento.

1 respuesta

Respuesta
1

¿Me puedes explicar por qué quieres seleccionar el rango desde A1 hasta C15?

Entiendo que tienes esto:

Pero para qué quieres seleccionar desde A1 hasta C15, ¿si no hay datos en varias celdas?

¿Puedes poner imágenes de lo que tienes y de lo que esperas de resultado?

Procedo a detallar mejor mi consulta:

Elaboro una planilla que busca datos entre unas 4000 filas, al procesarla me arroja como resultado sectores ordenados de esta planilla en donde algunos tienen valores numéricos y otros van en blanco; finalmente conservando las mismas posiciones debo trabajar estas "mini" matrices (solo aquellas con todas las columnas en negro) dejando las respectivas filas ordenadas de mayor a menor, para en un tercer paso poder nuevamente procesarla.

Ahora bien, este proceso lo realizo manualmente y quiero automatizarlo.

Al efectuar la macro de ordenamiento me las deja al inicio del rango aprovechando las celdas vacías, debido a que elimina las filas sin datos.

Por ésta razón en el ejemplo indico que siempre me doy un rango entre A1 y C15 en parte de este rango ubico mi matriz de 3x3

Esperando ser más preciso en mi consulta.

Saludos

En tu ejemplo, en la columna "D" tienes este valor 199,85, además de ordenarlo y ponerlo al principio, también lo cambiaste de columna, ¿fue un error al momento de copiar el dato o también quieres que la macro pase los datos a la otra columna?

¿Lo qué tu quieres es que se ordenen los datos en el mismo lugar?

En la fila 143 veo que tienes otra matriz, ¿también quieres que se ordene en su lugar?

Hola :

Efectivamente .... el dato señalado como valor original se transforma finalmente a lo indicado como valores ordenados ... para lo cual previamente se intercambian solamente las columnas O y P (manteniéndose las columnas Q y R) este proceso inicial lo realizo por mi cuenta con una macro; y después, el proceso que no he podido realizar es que deben ordenarse entre las filas de la mini matriz, que para el recuadro rojo es entre la 29 y 32.

Ahora bien, el problema radica que con otros datos estas "mini" matrices no están siempre en esta posición y entre las casi 4000 filas varían en cuanto a la ubicación y el tamaño de dichas mini matrices, es decir pueden variar desde 1x4 hasta nx4 (con n < rango de barrido) y ubicarse en cualquier parte pero acotado entre las columnas O y R.

En la fila 143 que se aprecia en la foto anterior ... como en varias que se han ocultado se inician matrices que deben procesarse de la misma manera ... por ello mi problema radica en ordenar cada fila de cada mini matriz individualmente y respetando su posición original independiente que se vean separadas estas  mini matrices por sectores con celdas vacías.

La única forma que se me ocurre, para indicarle a la macro el rango de trabajo (o cantidad de filas) es efectuando un barrido del sector de trabajo mediante el "mouse".   

Saludos

Te anexo la macro para las minimatrices, solamente de las que tienen valores positivos, cambia las columnas y las ordena.

Tus datos deben estar en la columna "C".


Sub OrdenarMiniMatriz()
'Por.Dante Amor
    Application.ScreenUpdating = False
    For i = 2 To Range("C" & Rows.Count).End(xlUp).Row
        If Cells(i, "C") <> "" Then
            Set rango = Cells(i, "C").CurrentRegion
            If Application.Min(rango) >= 0 Then
                r = rango.Cells(1, 1).Row
                f = rango.Rows.Count + r - 1
                '
                Range("D" & r & ":D" & f).Cut
                Range("C" & r & ":C" & f).Insert Shift:=xlToRight
                '
                With ActiveSheet.Sort
                    .SortFields.Clear
                    .SortFields.Add Key:=Range("C" & r & ":C" & f), Order:=xlDescending
                    .SetRange Range("C" & r & ":F" & f): .Header = xlGuess: .Apply
                End With
                i = i + rango.Rows.Count
            End If
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "Proceso terminado"
End Sub

Saludos.Dante Amor

Al final de mi respuesta dice: “Es una buena respuesta” y puedes seleccionar una de 3 opciones:

  • Excelente
  • Si
  • No

Si ya no tienes dudas, podrías valorar la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas