Ordenar Datos de Matriz

22/11/2006 - 11:47 por Lorenzo Zotano | Informe spam
Buenas a Tod@s.

Necesito ordenar de mayor a menor los datos contenidos en una matriz por uno
de sus campos me explico mejor con un ejemplo :
Matriz SaldoBono(n,m) donde n=string y m=integer

SaldoBono(1,1) = "Bono 1"
SaldoBono(1,2) = 10
SaldoBono(2,1) = "Bono 3"
SaldoBono(2,2) = 25
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

Necesito que me ordene los registros de mayor a menor segun el campo
integer, es decir, que quede asi ...

SaldoBono(1,1) = "Bono 3"
SaldoBono(1,2) = 30
SaldoBono(2,1) = "Bono 1"
SaldoBono(2,2) = 10
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

No me importe tener que usar alguna matriz adicional o temporal, pero
necesito que al final la matriz resultante quede ordenada para poder meterla
en un listbox y que los datos aparezcan ordenados de mayor a menor

¿Alguna idea?

Gracias.

Preguntas similare

Leer las respuestas

#1 Juan M
22/11/2006 - 14:38 | Informe spam
Hola Lorenzo

Buenas a

Necesito ordenar de mayor a menor los datos contenidos en una matriz por
uno de sus campos me explico mejor con un ejemplo :
Matriz SaldoBono(n,m) donde n=string y m=integer

SaldoBono(1,1) = "Bono 1"
SaldoBono(1,2) = 10
SaldoBono(2,1) = "Bono 3"
SaldoBono(2,2) = 25
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

Necesito que me ordene los registros de mayor a menor segun el campo
integer, es decir, que quede asi ...

SaldoBono(1,1) = "Bono 3"
SaldoBono(1,2) = 30
SaldoBono(2,1) = "Bono 1"
SaldoBono(2,2) = 10
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

No me importe tener que usar alguna matriz adicional o temporal, pero
necesito que al final la matriz resultante quede ordenada para poder
meterla en un listbox y que los datos aparezcan ordenados de mayor a menor


¿Alguna idea?

Gracias.



Una pregunta, ¿esos datos son fijos o vienen de alguna parte? es decir los
lees de algun rango en concreto?
Es porque puedes emplear los metodos de ordenacion que tiene excel. Sino
tendrias que ir a un objeto/control que tenga el metodo de ordenar o lo que
puede
ser mas 'complejo' programar un metodo de ordenacion adecuado a tus
necesidades. Ten encuenta que la ultima solucion aunque esta bastante
estudiada/resuelta adaptarla a tu matriz sera algo mas laborioso.

Para ordenar con los rangos de excel:

Sub Orden()
Range("A3:B6").Sort Key1:=Range("B3"), Order1:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
End Sub

Unos enlaces para que veas lo que se puede hacer...

Archivo de ejemplo con los metodos de ordenacion
(Ole P. Erlandsen)
http://www.erlandsendata.no/downloa...amples.zip

Articulos sobre ordenacion:
Son para VB con unos ligeros retoques se pueden aprovechar.
http://www.devx.com/vb2themax/article/19900
http://www.devx.com/vb2themax/Door/18897?cat59&type=1

Un saludo
Juan
Respuesta Responder a este mensaje
#2 Lorenzo Zotano
22/11/2006 - 16:09 | Informe spam
Juan, muchas gracias por tu respuesta.

Resulta que los datos los tengo que sacar de una hoja de excel, pero una vez
que los he filtrado. Habia pensado en recorrer con algun tipo de for x 1 to
tal y cual toda la tabla e introducir en la matriz solo los datos que me
interesen, ya que son solo determinadas celdas de las filas que cumplen una
condicion
Una vez llena la matriz habia pensado en ordenarla de mayor a menor para
que, como voy a usar esos datos para llenar un listbox estos me aparezcan
ordenados de mayor a menor ¿alguna otra idea?.
Gracias.

"Juan M" escribió en el mensaje
news:%
Hola Lorenzo

Buenas a

Necesito ordenar de mayor a menor los datos contenidos en una matriz por
uno de sus campos me explico mejor con un ejemplo :
Matriz SaldoBono(n,m) donde n=string y m=integer

SaldoBono(1,1) = "Bono 1"
SaldoBono(1,2) = 10
SaldoBono(2,1) = "Bono 3"
SaldoBono(2,2) = 25
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

Necesito que me ordene los registros de mayor a menor segun el campo
integer, es decir, que quede asi ...

SaldoBono(1,1) = "Bono 3"
SaldoBono(1,2) = 30
SaldoBono(2,1) = "Bono 1"
SaldoBono(2,2) = 10
SaldoBono(3,1) = "Bono 2"
SaldoBono(3,2) = 3

No me importe tener que usar alguna matriz adicional o temporal, pero
necesito que al final la matriz resultante quede ordenada para poder
meterla en un listbox y que los datos aparezcan ordenados de mayor a
menor

¿Alguna idea?

Gracias.



Una pregunta, ¿esos datos son fijos o vienen de alguna parte? es decir los
lees de algun rango en concreto?
Es porque puedes emplear los metodos de ordenacion que tiene excel. Sino
tendrias que ir a un objeto/control que tenga el metodo de ordenar o lo
que puede
ser mas 'complejo' programar un metodo de ordenacion adecuado a tus
necesidades. Ten encuenta que la ultima solucion aunque esta bastante
estudiada/resuelta adaptarla a tu matriz sera algo mas laborioso.

Para ordenar con los rangos de excel:

Sub Orden()
Range("A3:B6").Sort Key1:=Range("B3"), Order1:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
End Sub

Unos enlaces para que veas lo que se puede hacer...

Archivo de ejemplo con los metodos de ordenacion
(Ole P. Erlandsen)
http://www.erlandsendata.no/downloa...amples.zip

Articulos sobre ordenacion:
Son para VB con unos ligeros retoques se pueden aprovechar.
http://www.devx.com/vb2themax/article/19900
http://www.devx.com/vb2themax/Door/18897?cat59&type=1

Un saludo
Juan

Respuesta Responder a este mensaje
#3 Juan M
22/11/2006 - 18:46 | Informe spam
Hola Lorenzo


"Lorenzo Zotano" escribió en el mensaje
news:%23P$
Juan, muchas gracias por tu respuesta.

Resulta que los datos los tengo que sacar de una hoja de excel, pero una
vez que los he filtrado. Habia pensado en recorrer con algun tipo de for x
1 to tal y cual toda la tabla e introducir en la matriz solo los datos que
me interesen, ya que son solo determinadas celdas de las filas que cumplen
una condicion
Una vez llena la matriz habia pensado en ordenarla de mayor a menor para
que, como voy a usar esos datos para llenar un listbox estos me aparezcan
ordenados de mayor a menor ¿alguna otra idea?.
Gracias.




Sigo preguntando. ¿Como realizas ese filtrado de datos para elegir los datos
que quieres cargar?
Es importante puesto que por medio de autofiltros puedes filtrar y ordenar
los datos filtrados.
A partir de aqui depende de como tengas realizados los arreglos de tu hoja.
Si estan en forma de tabla (tipo access) es bastante facil emplear los
autofiltros.

Si comentas como estan organizados tus datos (rangos concretos...) podemos
ver como realizarlo.
Si no siempre puedes pegar esa lista en un rango y meter la instruccion que
te propuse antes.

Por cierto, si los bonos se dan siempre consecutivamente, es decir, para
tener el bono 4 es necesario tener el bono 3
podrias emplear un solo vector donde el indice del vector te indique el bono
y el numero almacenado el saldo.

Un saludo
Juan

Inicio codigo

Del archivo que te indique en el mensaje anterior he modificado el metodo
burbuja

Sub BubbleSort(InputArray As Variant)
' most useful for small random arrays
Dim i As Long, j As Long, X0 As Variant, X1 As Variant
Dim min As Long, max As Long
If Not IsArray(InputArray) Then Exit Sub
min = LBound(InputArray, 1)
max = UBound(InputArray, 1)
For i = min To max - 1
For j = i + 1 To max
If InputArray(i, 1) < InputArray(j, 1) Then
X0 = InputArray(i, 1)
X1 = InputArray(i, 0)
InputArray(i, 1) = InputArray(j, 1)
InputArray(i, 0) = InputArray(j, 0)
InputArray(j, 1) = X0
InputArray(j, 0) = X1
End If
Next j
Next i
End Sub

'Este es el proceso donde se carga el vector
'Debes modificarlo para cargar el list box
Sub test()
Dim SaldoBono(0 To 10, 0 To 1)
Dim i As Long
Dim j As Long
'Definicion de la matriz
SaldoBono(0, 0) = 1
SaldoBono(0, 1) = 10
SaldoBono(1, 0) = 3
SaldoBono(1, 1) = 25
SaldoBono(2, 0) = 2
SaldoBono(2, 1) = 3
'Llamada al metodo de ordenacion
BubbleSort SaldoBono
'Esto hay que modificarlo para cargar al listbox
For i = 0 To 10
Range("D" & i + 2) = SaldoBono(i, 0)
Range("E" & i + 2) = SaldoBono(i, 1)
Next i
End Sub

fin codigo
Respuesta Responder a este mensaje
#4 Lorenzo Zotano
22/11/2006 - 19:51 | Informe spam
Muchas gracias por tu sugerencia probare el codigo para ver que tal
. Mil gracias de nuevo ...

"Juan M" escribió en el mensaje
news:
Hola Lorenzo


"Lorenzo Zotano" escribió en el mensaje
news:%23P$
Juan, muchas gracias por tu respuesta.

Resulta que los datos los tengo que sacar de una hoja de excel, pero una
vez que los he filtrado. Habia pensado en recorrer con algun tipo de for
x 1 to tal y cual toda la tabla e introducir en la matriz solo los datos
que me interesen, ya que son solo determinadas celdas de las filas que
cumplen una condicion
Una vez llena la matriz habia pensado en ordenarla de mayor a menor para
que, como voy a usar esos datos para llenar un listbox estos me aparezcan
ordenados de mayor a menor ¿alguna otra idea?.
Gracias.




Sigo preguntando. ¿Como realizas ese filtrado de datos para elegir los
datos que quieres cargar?
Es importante puesto que por medio de autofiltros puedes filtrar y ordenar
los datos filtrados.
A partir de aqui depende de como tengas realizados los arreglos de tu
hoja. Si estan en forma de tabla (tipo access) es bastante facil emplear
los autofiltros.

Si comentas como estan organizados tus datos (rangos concretos...)
podemos ver como realizarlo.
Si no siempre puedes pegar esa lista en un rango y meter la instruccion
que te propuse antes.

Por cierto, si los bonos se dan siempre consecutivamente, es decir, para
tener el bono 4 es necesario tener el bono 3
podrias emplear un solo vector donde el indice del vector te indique el
bono y el numero almacenado el saldo.

Un saludo
Juan

Inicio codigo

Del archivo que te indique en el mensaje anterior he modificado el metodo
burbuja

Sub BubbleSort(InputArray As Variant)
' most useful for small random arrays
Dim i As Long, j As Long, X0 As Variant, X1 As Variant
Dim min As Long, max As Long
If Not IsArray(InputArray) Then Exit Sub
min = LBound(InputArray, 1)
max = UBound(InputArray, 1)
For i = min To max - 1
For j = i + 1 To max
If InputArray(i, 1) < InputArray(j, 1) Then
X0 = InputArray(i, 1)
X1 = InputArray(i, 0)
InputArray(i, 1) = InputArray(j, 1)
InputArray(i, 0) = InputArray(j, 0)
InputArray(j, 1) = X0
InputArray(j, 0) = X1
End If
Next j
Next i
End Sub

'Este es el proceso donde se carga el vector
'Debes modificarlo para cargar el list box
Sub test()
Dim SaldoBono(0 To 10, 0 To 1)
Dim i As Long
Dim j As Long
'Definicion de la matriz
SaldoBono(0, 0) = 1
SaldoBono(0, 1) = 10
SaldoBono(1, 0) = 3
SaldoBono(1, 1) = 25
SaldoBono(2, 0) = 2
SaldoBono(2, 1) = 3
'Llamada al metodo de ordenacion
BubbleSort SaldoBono
'Esto hay que modificarlo para cargar al listbox
For i = 0 To 10
Range("D" & i + 2) = SaldoBono(i, 0)
Range("E" & i + 2) = SaldoBono(i, 1)
Next i
End Sub

fin codigo


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida