Macro para ordenar listbox por fecha de menor a a mayor

-----

Hola a todos
Pueden ayudarme con esto
Necesito que en el listbox ( no en la hoja) me aparezcan los datos ordenados por fecha de menor a mayor
las fechas aparecen en la columna 8 del listbox

En esta parte me llena el listbox

Sub filtro1()

Sheets("fiven").Select
'hm.Cells.Clear
Range("A1:A1000").Select
Selection.EntireRow.Delete

Dim fec1 As Date, fec2 As Date

Sheets("fiven").Cells(1, 1) = "SUMINISTROS A VENCERSE ENTRE EL " & TextBox1 & " Y EL " & TextBox2

fec1 = Me.TextBox1
fec2 = Me.TextBox2
Me.ListBox1.Clear

contarfilas = 4

f = 1
'Mostrar ENTRADAS
items = Hoja20.Range("A" & Rows.Count).End(xlUp).Row
j = 8
k = 3
'items = Hoja3.Range("tbl_Entradas").CurrentRegion.Rows.Count
For i = 2 To items
If Hoja20.Cells(i, j) >= fec1 And Hoja20.Cells(i, j) <= fec2 _
And Hoja20.Cells(i, k) > 0 Then
Me.ListBox1.AddItem Hoja20.Cells(i, 1)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = f
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Hoja20.Cells(i, 3)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Hoja20.Cells(i, 4)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Hoja20.Cells(i, 5)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Hoja20.Cells(i, 6)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Hoja20.Cells(i, 7)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Hoja20.Cells(i, 8)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Hoja20.Cells(i, 9)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Hoja20.Cells(i, 10)
f = f + 1

End If
Next i

Call ordenar

'b = 3
'sumi = Hoja25.Range("A" & Rows.Count).End(xlUp).Row
'For a = 5 To sumi
'If Hoja25.Cells(a, b) = 0 Then
'Hoja25.Rows(a).Delete
'End If
'Next a

Dim valor As Integer

'Sheets("Medicamentos").Activate

vvv = 50000

valor = 1

For Bx = 5 To vvv
vc = Range("A" & Bx)
If IsNull(vc) Or vc = "" Then
Else
Range("B" & Bx).Value = valor
valor = valor + 1
End If
Next

Call ordenarfecha

TextBox1 = ""
TextBox2 = ""
TextBox1.SetFocus
End Sub

3 respuestas

Respuesta
3

Puedes emplear en tu programación una UDF que realice tu ordenación 8de manera interna) para luego recuperar el resultado ordenado y poder cargarlo en tu ListBox

Echa un vistazo a este ejemplo, donde verás cómo realizarlo

http://excelforo.blogspot.com.es/2017/09/vba-ordenar-una-array-multidimensional.html 

Respuesta
2

Puedes poner una rutina que vaya ordenando conforme vas agregando registros en el listbox:

Sub filtro1()
    Sheets("fiven").Select
    'hm.Cells.Clear
    Range("A1:A1000").Select
    Selection.EntireRow.Delete
    Dim fec1 As Date, fec2 As Date
    Sheets("fiven").Cells(1, 1) = "SUMINISTROS A VENCERSE ENTRE EL " & TextBox1 & " Y EL " & TextBox2
    fec1 = Me.TextBox1
    fec2 = Me.TextBox2
    Me.ListBox1.Clear
    contarfilas = 4
    f = 1
    'Mostrar ENTRADAS
    items = Hoja20.Range("A" & Rows.Count).End(xlUp).Row
    j = 8
    k = 3
    'items = Hoja3.Range("tbl_Entradas").CurrentRegion.Rows.Count
    For i = 2 To items
        If Hoja20.Cells(i, j) >= fec1 And Hoja20.Cells(i, j) <= fec2 _
           And Hoja20.Cells(i, k) > 0 Then
           Call Agregar(i, f)
            f = f + 1
        End If
    Next i
    'Call ordenar
    'b = 3
    'sumi = Hoja25.Range("A" & Rows.Count).End(xlUp).Row
    'For a = 5 To sumi
    'If Hoja25.Cells(a, b) = 0 Then
    'Hoja25.Rows(a).Delete
    'End If
    'Next a
    Dim valor As Integer
    'Sheets("Medicamentos").Activate
    vvv = 50000
    valor = 1
    For Bx = 5 To vvv
        vc = Range("A" & Bx)
        If IsNull(vc) Or vc = "" Then
        Else
        Range("B" & Bx).Value = valor
        valor = valor + 1
        End If
    Next
    Call ordenarfecha
    TextBox1 = ""
    TextBox2 = ""
    TextBox1.SetFocus
End Sub
'
Sub Agregar(i, f)
'Por. Dante Amor
    existe = False
    For k = 0 To Me.ListBox1.ListCount - 1
        If Hoja20.Cells(i, 8) <= CDate(Me.ListBox1.List(k, 7)) Then
            'Si ya existe una fecha mayor agrega antes el registro
            Me.ListBox1.AddItem Hoja20.Cells(i, 1), k
            existe = True
            Exit For
        End If
    Next
    If existe = False Then
        'si no existe una fecha mayor, entonces lo agrega al final
        Me.ListBox1.AddItem Hoja20.Cells(i, 1)
        k = Me.ListBox1.ListCount - 1
    End If
    Me.ListBox1.List(k, 1) = f
    Me.ListBox1.List(k, 2) = Hoja20.Cells(i, 3)
    Me.ListBox1.List(k, 3) = Hoja20.Cells(i, 4)
    Me.ListBox1.List(k, 4) = Hoja20.Cells(i, 5)
    Me.ListBox1.List(k, 5) = Hoja20.Cells(i, 6)
    Me.ListBox1.List(k, 6) = Hoja20.Cells(i, 7)
    Me.ListBox1.List(k, 7) = Hoja20.Cells(i, 8)
    Me.ListBox1.List(k, 8) = Hoja20.Cells(i, 9)
    Me.ListBox1.List(k, 9) = Hoja20.Cells(i, 10)
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Respuesta
2

Por lo que entiendo tienes un "ListBox" que tiene varias columnas y quieres que esas columnas se ordenen de menor a mayor basados en las fechas que tienes en la columna 8 del "ListBox" ¿cierto? De ser así lo que te recomiendo es que primero ordenes los datos en una hoja y una vez ordenados reciendo llenes el "ListBox" ya que dicho objeto de VBA no posee una propiedad que ordene su contenido.

Se puede ordenar un"ListBox" con código pero basado en cadenas de texto y al aplicarlo en números (que es como podríamos decir que VBA ve a las fechas) no surtiría el efecto que esperas.

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas