Calcular la diferencia de días en un listbox

No logro realizar un código que me automáticamente busque la diferencia de día. Para que me calcule los días que hay de diferencia tengo que pulsar encima de la línea del listbox.

Me gustaría que por defecto siempre cogiera el valor de la primera fila y primera columna del listbox (es donde esta la fecha) y se restara y que el resultado se muerte en diferencia_dias. Caption.

Pulsado en en listbox de la derecha.

El listbox de la derecha se carga cuando se hace click en la opción elegida en el listbox de la izquierda.

El codigo que tengo actualmente es este:

Dim DiasUltimoPedido As Date
Dim dias
DiasUltimoPedido = Me.list_historial.List(0, 0)
dias = DateDiff("d", data.value, DiasUltimoPedido)
diferencia_dies.Caption = dias

lo hepuesto en el evento hacer click del texbox de la izquierda.
¿Cómo puedo conseguir que se seleccione la primera fila del listbox de la derecha automáticamente?

1 respuesta

Respuesta
1

Me parece que toda esta parte del proceso, pase al listbox de la derecha y el cálculo de días lo debes hacer en el mismo código, o sea en el evento hacer click del texbox de la izquierda.

Por ejemplo:

 'se coloca en el label la fecha del primer item del listbox2
    Label1.Caption = ListBox2.List(0, 0)
    ' O se guarda en una variable
    fecha = cdate(ListBox2. List(0, 0))

Si no lo logras deja aquí la macro del listbox1.

PD) Seguramente podrás omitir lo del Me. Si siempre estás mencionando al mismo UF activo (ver video 11 de mi canal)

Sdos.

Elsa

Gracias Elsa Matilde, lo he probado en todos los lados y no logro que funcione.
Adjunto el código

Dim j2 As Variant
Dim hojabase2 As Object
Dim filas2 As Variant
Dim i2 As Variant
On Error Resume Next
If Me.num_equipament_final.Caption = "" Then
Else
j2 = 1
Set hojabase2 = ThisWorkbook.Sheets("Dades")
filas2 = Range("num").CurrentRegion.Rows.Count
For i2 = 1 To filas2
If LCase(hojabase2.Cells(i2, j2).Offset(0, 0).value) = LCase(Me.num_equipament_final.Caption) Then
Me.list_historial.AddItem hojabase2.Cells(i2, j2)
Me.list_historial.List(Me.list_historial.ListCount - 1, 0) = Format(hojabase2.Cells(i2, j2).Offset(0, 10), "dd/mm/yyyy")
Me.list_historial.List(Me.list_historial.ListCount - 1, 1) = hojabase2.Cells(i2, j2).Offset(0, 6)
Me.list_historial.List(Me.list_historial.ListCount - 1, 2) = hojabase2.Cells(i2, j2).Offset(0, 7)
Me.list_historial.List(Me.list_historial.ListCount - 1, 3) = hojabase2.Cells(i2, j2).Offset(0, 8)
Me.list_historial.List(Me.list_historial.ListCount - 1, 4) = hojabase2.Cells(i2, j2).Offset(0, 9)
Else
End If
Next i2
End If
Exit Sub

Este codigo lo que hace es copiar los datos filtrados en un listbox.
El campo que busca en el formulario es el "num_equipament_final.caption".
En la hoja equipaments esta todos los numeros en el rago "num" (este numero es el número que identifica la empresa, es un numero único). El rango "num" estan todos los numeros unicos de las empresas.


Una vez encuentra los resultados los ordena en en listbox.
He logrado hacer que me seleccione 1 item del listbox pero no me deja cambiarlo. Me gustaria que por defecto se marcara la primera fila del listbox pero que me dejara cambiar la selección si fuera preciso. La idea que tengo es que por defecto me muestre la diferencia de dias con el envio mas proximo a la fecha de hoy pero tambien me gustaria tener la opcion de marcar otros envios y que me dijera la diferencia de dias.

Al terminar de llenar la segunda lista se puede dejar seleccionado el primer elemento con esta instrucción, luego de la línea del 'Next i2'

list_historial=0

No comprendo porqué no puedes cambiar la selección.... flecha abajo, flecha arriba....

Y una vez que tengas tu elemento seleccionado harás el cálculo mencionándolo como :

'colocar su valor en una variable
fecha = list_historial.List(list_historial.ListIndex, 0)

0 es la primer col de la lista.

Sdos!

Muchas gracias Elsa Matilde. He adaptado el código un poco para que me funcionara, pero no logro solventar 2 problemas.

Con esta línea :

fecha = list_historial.List(list_historial.ListIndex, 0)

Todo el rato me daba 43865, lo he solucionada con :

Me.list_historial.List(Me.list_historial.ListCount - 1, 0)

y ahora si que me da la diferencia de días pero pasan dos cosas. Adjunto capturas para que lo puedas ver.

Como puedes verlos cálculos me los hace correctamente (siempre y cuando el listbox tenga datos) pero no me mantiene el formato (el formato debería de ser colo el 3)
Además cuando el listbox esta vacío me sale otra vez este resultado: 43865

¿Cómo podría hacer que me respetase el formato?

¿Cómo podría evitar que hiciera estos cálculos erróneos?

He pensado una pero no se si serviría y si seria lo correcto. Seria buna opción poner un condicional antes de empezar hacer el calculo donde para realizar este calculo ha de haber en el listbox algún dato.
Muchas gracias matilde por tu ayuda

Perdona no te había adjuntado el código final. Te adjunto nuevamente todo el código para que veas donde y que he puesto. Tal y como me has dicho antes he puesto el código después del Next i2

Dim j2 As Variant
Dim hojabase2 As Object
Dim filas2 As Variant
Dim i2 As Variant
On Error Resume Next
If Me.num_equipament_final.Caption = "" Then
Else
j2 = 1
Set hojabase2 = ThisWorkbook.Sheets("Dades")
filas2 = Range("num").CurrentRegion.Rows.Count
For i2 = 1 To filas2
If LCase(hojabase2.Cells(i2, j2).Offset(0, 0).value) = LCase(Me.num_equipament_final.Caption) Then
Me.list_historial.AddItem hojabase2.Cells(i2, j2)
Me.list_historial.List(Me.list_historial.ListCount - 1, 0) = Format(hojabase2.Cells(i2, j2).Offset(0, 10), "dd/mm/yyyy")
Me.list_historial.List(Me.list_historial.ListCount - 1, 1) = hojabase2.Cells(i2, j2).Offset(0, 6)
Me.list_historial.List(Me.list_historial.ListCount - 1, 2) = hojabase2.Cells(i2, j2).Offset(0, 7)
Me.list_historial.List(Me.list_historial.ListCount - 1, 3) = hojabase2.Cells(i2, j2).Offset(0, 8)
Me.list_historial.List(Me.list_historial.ListCount - 1, 4) = hojabase2.Cells(i2, j2).Offset(0, 9)
Else
End If
Next i2
list_historial = 0
Dim DiasUltimoPedido As Date
Dim diferencia As Variant
DiasUltimoPedido = Me.list_historial.List(Me.list_historial.ListCount - 1, 0)
diferencia = DateDiff("d", DiasUltimoPedido, data.value)
Diferencia_dias = diferencia
End If
Exit Sub

El tema del formato ya lo he solucionado, lo que no me funciona es lo del calculo. Solo me calcula la primera fila, si pulso encima de otro otra línea no me realiza el calculo. Además si no en el listbox no hay datos sale el numero antes mencionado.
¿En qué estoy fallando?

Perdona por contestar por partes pero he visto que en vez de elegir la prifera fila elige la segunda fila.
En la prima imagen que te he mandado del día 24/01 a hoy hay 11 días no 14.

14 es la diferencia entre la fecha de abajo 21/01 

Para reconocer si el listbox no tiene datos antes del cálculo coloca esta instrucción (ajusta el nombre del control Lista - Si solo estás manipulando un userform por vez NO es necesario el uso de ME)

If ListBox2.List(ListBox2.ListIndex, 0) = "" Then Exit Sub

Ahora, con la siguiente instrucción siempre estás evaluando el último elemento de la lista....(ListCount -1) :

DiasUltimoPedido = Me.list_historial.List(Me.list_historial.ListCount - 1, 0)

Para evaluar el contenido del elemento seleccionado debes utilizar esta otra (reemplaza el nombre de la lista por el tuyo)

DiasUltimoPedido = ListBox2. List(ListBox2. ListIndex, 0)

Si todavía te queda algo por resolver por favor enviame el formulario a mi correo. No me es posible dedicarle tanto tiempo a recrear un Userform tal como muestras en la imagen.

Tampoco sé cómo estás formateando la fecha ... pero eso es tema de una nueva consulta. No olvides que las listas guardan sus campos como 'texto'. La función de conversión CDate la convertirá en fecha.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas