Saltar al contenido

Macro ordenar matriz


Recommended Posts

publicado

Buenos días,

Me estoy volviendo loco a la hora de ordenar los valores de 3 columnas con un orden determinado. Encontré una macro por la red que funciona, pero a la hora de la verdad, cuando hay más datos es muy lenta. Me explico:

En un excel tengo 3 columnas con datos: Modo, Frecuencia, Origen. Estos valores los paso a una matriz, y ahora quiero ordenar esta matriz de menor a mayor modo y frecuencia. Es decir, si tengo

Modo Frecuencia Origen

8 1560 Direct

7 1560 Direct

8 1560 Direct

8 1560 WEH

-2 1560 WEH

3 720 Direct

4 720 Direct

3 720 WEH

Que me los ordene:

Modo Frecuencia Origen

3 720 Direct

3 720 WEH

4 720 Direct

-2 1560 WEH

7 1560 Direct

8 1560 Direct

8 1560 Direct

8 1560 WEH

Es decir, que ordene las frecuencias de menor a mayor y dentro de cada frecuencia que ordene el modo de menor a mayor. Y lo que es importante, si dentro del mismo modo y frecuencia se repiten "direct" o "weh" que los ordene "ordenados" es decir,

8 1560 Direct

8 1560 Direct

8 1560 WEH

y que no haga por ejemplo

8 1560 Direct

8 1560 WEH

8 1560 DIRECT

Os adjunto la macro que utilizo yo para hacerlo, pero como ya os he dicho si hay muchos datos es muy lenta (lo que os mando es un ejemplo simplificado, pero realmente tengo 25 columnas)

Si me podeis ayudar os lo agradecería

Saludos

Macro_ordenar.xls

publicado

Hola:

Macro probada con 10.000 filas x 25 columnas.

Tiempo: menos de 1 segundo

Sub Ordenar() 
ActiveSheet.UsedRange.Select
ActiveSheet.Sort.SortFields.Clear

[COLOR=#0000ff]ActiveSheet.Sort.SortFields.Add Key:=Columns("B"), _
SortOn:=xlSortOnValues, Order:=xlAscending[/COLOR]

ActiveSheet.Sort.SortFields.Add Key:=Columns("A"), _
SortOn:=xlSortOnValues, Order:=xlAscending

ActiveSheet.Sort.SortFields.Add Key:=Columns("C"), _
SortOn:=xlSortOnValues, Order:=xlAscending

ActiveSheet.Sort.SetRange Selection
ActiveSheet.Sort.Header = xlYes
ActiveSheet.Sort.MatchCase = True
ActiveSheet.Sort.Apply
End Sub
[/CODE]

Puedes añadir tantas [color=#0000ff]claves de ordenación[/color] como quieras y en el orden que quieras.

publicado

El problema es que necesito que se me ordene dentro del vector, es decir, los datos los tendre metidos en un vector PresionRadial(2000,3) y se me tiene que ordenar aqui, mi idea es no tener que sacarlos por pantalla desordenados para luego ordenados. QUiero que se me ordenen en el vector

He leido que la función quicksort es más rápida. y yo tengo hecho:

Sub QuickSortmodo(arr, Lo As Integer, Hi As Integer)

Dim varPivot As Variant

Dim varTmp As Variant

Dim tmpLow As Integer

Dim tmpHi As Integer

tmpLow = Lo

tmpHi = Hi

varPivot = arr((Lo + Hi) \ 2, 1)

Do While tmpLow <= tmpHi

Do While arr(tmpLow, 1) < varPivot And tmpLow < Hi

tmpLow = tmpLow + 1

Loop

Do While varPivot < arr(tmpHi, 1) And tmpHi > Lo

tmpHi = tmpHi - 1

Loop

If tmpLow <= tmpHi Then

For K = 1 To 3

varTmp = arr(tmpLow, K)

arr(tmpLow, K) = arr(tmpHi, K)

arr(tmpHi, K) = varTmp

Next K

tmpLow = tmpLow + 1

tmpHi = tmpHi - 1

End If

Loop

If Lo < tmpHi Then QuickSortmodo arr, Lo, tmpHi

If tmpLow < Hi Then QuickSortmodo arr, tmpLow, Hi

End Sub

Sub quicksortfrecuencia(arr, Lo As Integer, Hi As Integer)

Dim varPivot As Variant

Dim varTmp As Variant

Dim tmpLow As Integer

Dim tmpHi As Integer

tmpLow = Lo

tmpHi = Hi

varPivot = arr((Lo + Hi) \ 2, 2)

Do While tmpLow <= tmpHi

Do While arr(tmpLow, 2) < varPivot And tmpLow < Hi

tmpLow = tmpLow + 1

Loop

Do While varPivot < arr(tmpHi, 2) And tmpHi > Lo

tmpHi = tmpHi - 1

Loop

If tmpLow <= tmpHi Then

For K = 1 To 3

varTmp = arr(tmpLow, K)

arr(tmpLow, K) = arr(tmpHi, K)

arr(tmpHi, K) = varTmp

Next K

tmpLow = tmpLow + 1

tmpHi = tmpHi - 1

End If

Loop

If Lo < tmpHi Then quicksortfrecuencia arr, Lo, tmpHi

If tmpLow < Hi Then quicksortfrecuencia arr, tmpLow, Hi

End Sub

Esto me ordena bien el modo y frecuencia, pero no me pone bien la columna origen, es decir me lo deja:

8 1560 Direct

8 1560 WEH

8 1560 DIRECT

y yo quiero que sea

8 1560 Direct

8 1560 Direct

8 1560 WEH

es decir, dentro de cada mismo modo y frecuencia que todos esten ordenados primero los direct y luego los weh (o viceversa)

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.