Ordenar datos en un combo

24/10/2005 - 17:45 por cuejorge2003 | Informe spam
Buen día,

Tengo un combo al cual se le agregan los datos de una columna y
funciona perfectamente.

Ahora, me gustaría que los datos aparecieran ordenados... se puede ?
Anexo código que utilizo.


Dim Celda As Range, Listado As New Collection, Sig As Integer
Dim Origen As Object
Set Origen = Worksheets("INTERF").Cells(1, 7).Resize _
(Worksheets("INTERF").Cells(1, 7).CurrentRegion.Rows.Count -
1).Offset(1, 0)
For Each Celda In Origen.SpecialCells(xlCellTypeVisible)
On Error Resume Next
Listado.Add Celda, CStr(Celda)
Next
UserForm2.ComboBox1.Clear
For Sig = 1 To Listado.Count
Listado.Item (Sig)
UserForm2.ComboBox1.AddItem Listado.Item(Sig)
Next


De antemano, gracias.
Un saludo.
Jorge

Preguntas similare

Leer las respuestas

#16 Juan
26/10/2005 - 16:47 | Informe spam
hola jorge

coloca el codigo en un modulo estandar,

para que veas como funciona te recomiendo primero ponerlo en un libro en
blanco.
lo que hace es generar un vector aleatorio datos(), y luego lo ordena
"destruyendo" el inicial.
tambien te dice lo que tarda en realizar la ordenacion (a mi me tardo 9
segundos en una lista de 65000 elementos)

el control del numero de veces esta en la variable n (valor 1000)

la forma de utilizarlo con tu codigo no es tan sencilla/practica ya que
'solo' ordena
pero mas o menos lo que podrias habria que hacer es segun vas leyendo tus
datos los cargas al vector, por medio de un bucle, (asignas esos valores
como los aleatorios).

mas o menos asi

i=1
For Each Celda In Origen.SpecialCells(xlCellTypeVisible)
On Error Resume Next
datos(i)=celda
'Listado.Add Celda, CStr(Celda)
i=i+1
Next

el codigo va a ser un poco mas lento que el de Hector ya que este ultimo
emplea procedimientos integrados en excel,
el metodo es util si en un futuro piensas trasladar tu aplicacion a visual
basic (para generar un ejecutable), ya que perderias las ventajas de excel.

un saludo
juan



escribió en el mensaje
news:
Juan,

No se donde coloco este código.
Te pido de la manera mas atenta me indiques la forma de hacerlo.
Muchas gracias.
Un saludo.
Jorge


ha escrito:

Juan,

Muchas gracias por tu apoyo !!!
Un saludo.
Jorge.


Juan ha escrito:

> Hola Jorge
>
> ya he visto que al final Hector te ha ayudado con el problema, pero de
> todas
> formas te paso el listado del metodo de ordenacion quicksort por si
> alguna
> vez necesitas tirar de el para ordenar series de datos.
>
> un sauldo
> juan
>
> creo que te he mandado una copia a tu correo.
>
> = codigo
>
> Dim datos(1 To 1000) As Long
>
> Sub NumAl3()
> Dim i As Long
> Dim n As Long
> Dim inicio As Single, final As Single
>
> Application.ScreenUpdating = False
> inicio = Timer
> Randomize
> n = 1000
>
> For i = 1 To n
> datos(i) = Int((10000 * Rnd) + 1)
> Next i
> For i = 1 To n
> Cells(2 + i, 2) = datos(i)
> Next i
> Call OrdRapida(1, n)
>
> For i = 1 To n
> Cells(2 + i, 3) = datos(i)
> Next i
>
> final = Timer
> Application.ScreenUpdating = True
> MsgBox "tiempo transcurrido " & final - inicio
>
> End Sub
>
> Sub Intercambiar(X As Long, Y As Long)
> Dim aux As Long
> aux = X
> X = Y
> Y = aux
> End Sub
>
> Sub Dividir(Primero As Long, _
> Ultimo As Long, PuntoDivision As Long)
>
> Dim Derecha As Long, Izquierda As Long
> Dim V As Long
>
> V = datos(Primero)
> Derecha = Primero + 1
> Izquierda = Ultimo
> Do
> Do While (Derecha < Izquierda) _
> And (datos(Derecha) <= V)
> Derecha = Derecha + 1
> Loop
> If (Derecha = Izquierda) _
> And (datos(Derecha)) <= V Then
> Derecha = Derecha + 1
> End If
> Do While (Derecha <= Izquierda) _
> And (datos(Izquierda) >= V)
> Izquierda = Izquierda - 1
> Loop
> If Derecha < Izquierda Then
> Call Intercambiar(datos(Derecha), datos(Izquierda))
> Derecha = Derecha + 1
> Izquierda = Izquierda - 1
> End If
> Loop Until Derecha > Izquierda
> Call Intercambiar(datos(Primero), datos(Izquierda))
> PuntoDivision = Izquierda
> End Sub
>
> Sub OrdRapida(Primero As Long, _
> Ultimo As Long)
>
> Dim PuntoDivision As Long
>
> If Primero < Ultimo Then
> Call Dividir(Primero, Ultimo, PuntoDivision)
> Call OrdRapida(Primero, PuntoDivision - 1)
> Call OrdRapida(PuntoDivision + 1, Ultimo)
> End If
> End Sub
Respuesta Responder a este mensaje
#17 cuejorge2003
26/10/2005 - 17:31 | Informe spam
Juan,

Muchísimas gracias por tu apoyo !!!
Un afectuoso saludo.
Jorge.

Juan ha escrito:

hola jorge

coloca el codigo en un modulo estandar,

para que veas como funciona te recomiendo primero ponerlo en un libro en
blanco.
lo que hace es generar un vector aleatorio datos(), y luego lo ordena
"destruyendo" el inicial.
tambien te dice lo que tarda en realizar la ordenacion (a mi me tardo 9
segundos en una lista de 65000 elementos)

el control del numero de veces esta en la variable n (valor 1000)

la forma de utilizarlo con tu codigo no es tan sencilla/practica ya que
'solo' ordena
pero mas o menos lo que podrias habria que hacer es segun vas leyendo tus
datos los cargas al vector, por medio de un bucle, (asignas esos valores
como los aleatorios).

mas o menos asi

i=1
For Each Celda In Origen.SpecialCells(xlCellTypeVisible)
On Error Resume Next
datos(i)=celda
'Listado.Add Celda, CStr(Celda)
i=i+1
Next

el codigo va a ser un poco mas lento que el de Hector ya que este ultimo
emplea procedimientos integrados en excel,
el metodo es util si en un futuro piensas trasladar tu aplicacion a visual
basic (para generar un ejecutable), ya que perderias las ventajas de excel.

un saludo
juan



escribió en el mensaje
news:
Juan,

No se donde coloco este código.
Te pido de la manera mas atenta me indiques la forma de hacerlo.
Muchas gracias.
Un saludo.
Jorge


ha escrito:

> Juan,
>
> Muchas gracias por tu apoyo !!!
> Un saludo.
> Jorge.
>
>
> Juan ha escrito:
>
> > Hola Jorge
> >
> > ya he visto que al final Hector te ha ayudado con el problema, pero de
> > todas
> > formas te paso el listado del metodo de ordenacion quicksort por si
> > alguna
> > vez necesitas tirar de el para ordenar series de datos.
> >
> > un sauldo
> > juan
> >
> > creo que te he mandado una copia a tu correo.
> >
> > = codigo
> >
> > Dim datos(1 To 1000) As Long
> >
> > Sub NumAl3()
> > Dim i As Long
> > Dim n As Long
> > Dim inicio As Single, final As Single
> >
> > Application.ScreenUpdating = False
> > inicio = Timer
> > Randomize
> > n = 1000
> >
> > For i = 1 To n
> > datos(i) = Int((10000 * Rnd) + 1)
> > Next i
> > For i = 1 To n
> > Cells(2 + i, 2) = datos(i)
> > Next i
> > Call OrdRapida(1, n)
> >
> > For i = 1 To n
> > Cells(2 + i, 3) = datos(i)
> > Next i
> >
> > final = Timer
> > Application.ScreenUpdating = True
> > MsgBox "tiempo transcurrido " & final - inicio
> >
> > End Sub
> >
> > Sub Intercambiar(X As Long, Y As Long)
> > Dim aux As Long
> > aux = X
> > X = Y
> > Y = aux
> > End Sub
> >
> > Sub Dividir(Primero As Long, _
> > Ultimo As Long, PuntoDivision As Long)
> >
> > Dim Derecha As Long, Izquierda As Long
> > Dim V As Long
> >
> > V = datos(Primero)
> > Derecha = Primero + 1
> > Izquierda = Ultimo
> > Do
> > Do While (Derecha < Izquierda) _
> > And (datos(Derecha) <= V)
> > Derecha = Derecha + 1
> > Loop
> > If (Derecha = Izquierda) _
> > And (datos(Derecha)) <= V Then
> > Derecha = Derecha + 1
> > End If
> > Do While (Derecha <= Izquierda) _
> > And (datos(Izquierda) >= V)
> > Izquierda = Izquierda - 1
> > Loop
> > If Derecha < Izquierda Then
> > Call Intercambiar(datos(Derecha), datos(Izquierda))
> > Derecha = Derecha + 1
> > Izquierda = Izquierda - 1
> > End If
> > Loop Until Derecha > Izquierda
> > Call Intercambiar(datos(Primero), datos(Izquierda))
> > PuntoDivision = Izquierda
> > End Sub
> >
> > Sub OrdRapida(Primero As Long, _
> > Ultimo As Long)
> >
> > Dim PuntoDivision As Long
> >
> > If Primero < Ultimo Then
> > Call Dividir(Primero, Ultimo, PuntoDivision)
> > Call OrdRapida(Primero, PuntoDivision - 1)
> > Call OrdRapida(PuntoDivision + 1, Ultimo)
> > End If
> > End Sub
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida