Visual Basic - VBA - LISTVIEW COLUMNA NUMERICA

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

VBA - LISTVIEW COLUMNA NUMERICA

Publicado por Bryan (5 intervenciones) el 19/05/2023 02:13:44
Buenas tardes,

Estoy trabajando en un formulario de excel, y un resultado le cargo en un componente de listview, con el siguiente código:


Set Rst_Lista_Trabajo = New ADODB.Recordset
Rst_Lista_Trabajo.Source = sql
Rst_Lista_Trabajo.ActiveConnection = Conn
Rst_Lista_Trabajo.Open sql, Conn, adOpenDynamic, adLockOptimistic

myform.ltv_lista_trabajo.View = lvwReport
myform.ltv_lista_trabajo.ColumnHeaders.Clear
myform.ltv_lista_trabajo.ListItems.Clear
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Identificación", Width:=80
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Nombre", Width:=200
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Operación", Width:=80
'myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Entidad", Width:=100
'myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Usuario", Width:=80
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Campaña", Width:=150
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Sub Campaña", Width:=150
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Estado Gestión", Width:=100
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Fecha Próxima Acción", Width:=80
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Saldo", Width:=100
myform.ltv_lista_trabajo.ColumnHeaders.Add Text:="Id Entidad", Width:=0
myform.ltv_lista_trabajo.HideColumnHeaders = False
myform.ltv_lista_trabajo.Appearance = cc3D
myform.ltv_lista_trabajo.FullRowSelect = True

Dim Item As ListItem

If Rst_Lista_Trabajo.BOF = False Then
Rst_Lista_Trabajo.MoveFirst
End If

Do Until Rst_Lista_Trabajo.EOF

Set Item = myform.ltv_lista_trabajo.ListItems.Add(Text:=Rst_Lista_Trabajo.Fields!IDENTIFICACION_CLIENTE)

Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!NOMBRES_COMPLETO
Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!ID_OPERACION '2
'Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!Entidad
'Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!Usuario
Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!campana
Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!SUB_CAMPANA
Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!ESTADO_GESTION
Item.ListSubItems.Add Text:=IIf(IsNull(Rst_Lista_Trabajo.Fields!FECHA_PROXIMA_ACCION), "", Rst_Lista_Trabajo.Fields!FECHA_PROXIMA_ACCION)
Item.ListSubItems.Add Text:=FormatNumber(Rst_Lista_Trabajo.Fields!VALOR_DEUDA_EXIGIBLE)
Item.ListSubItems.Add Text:=Rst_Lista_Trabajo.Fields!Id_Entidad '9 ahora 8

num_registros = num_registros + 1
Rst_Lista_Trabajo.MoveNext
Loop


Cuando cargo el dato de VALOR_DEUDA_EXIGIBLE, se muestra como texto y no como número y al ordenarlo no funciona.
Como puedo hacer para que la columna tenga formato numerico?




Saludos,
Bryan Acosta P.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

VBA - LISTVIEW COLUMNA NUMERICA

Publicado por Bryan (5 intervenciones) el 19/05/2023 03:54:04
La función que uso para ordenar es la siguiente:

Private Sub ltv_lista_trabajo_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

With ltv_lista_trabajo
.SortKey = ColumnHeader.Index - 1
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else
.SortOrder = lvwAscending
End If
.Sorted = True

End With
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

VBA - LISTVIEW COLUMNA NUMERICA

Publicado por Antoni Masana (558 intervenciones) el 19/05/2023 14:58:09
El problema es la función FormatNumber() que convierte un número en texto.
Te explico, en una celda pones un número y puedes poner una máscara que hace que la presentación sea más agradable pero el valor interno no cambia. En el listview no puedes poner una máscara y para ver el número de forma más visual lo conviertes en texto.

El texto se alinea a la izquierda, el 1 es menor que el 2, al ser un texto no entiende de unidades, decenas, centenas, etc y al ordenar pasa esto:

1
2
3
100.000,00
20.000,45
9,67

Para arreglar esto primero tienes que saber el valor máxima que va a tener este campo y los decimales: supongamos que es menos de 10 millones y dos decimales.
El formato final es este: 9,999,999.99 y que tiene doce caracteres. Ahora alineamos los número anteriores a este formato:

1
2
3
4
9,999,999.99 <- Formato
  100.000,00
   20.000,45
        9,67

Y ahora ordenamos correctamente:

1
2
3
4
------------
        9,67
   20.000,45
  100.000,00

Bien, pero ¿Como se hace? Se añaden espacios por la izquierda:

1
Item.ListSubItems.Add Text:=Right(Space(12)+FormatNumber(Rst_Lista_Trabajo.Fields!VALOR_DEUDA_EXIGIBLE), 12)

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

VBA - LISTVIEW COLUMNA NUMERICA

Publicado por Bryan (5 intervenciones) el 19/05/2023 18:26:53
Muchas gracias, ha sido de gran ayuda.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar