Hay algunas discrepancias...
Primero los valores de precio y suma total admiten decimales, luego declarar a 'TotalContado' y 'TotalCredito' de tipo integer, limita la precisión del cálculo, es decir legalmente no se admitiría y comercialmente despidirían al programador...
Luego, estás sumando en base a un registro que has leído para una determinada factura (reg2), pero en realidad cada factura tiene su propio indicador. Es decir estás aplicando a toda la facturación del fichero el criterio de pago de un único registro, luego si ese registro fue 'pagado' al contado todo el listbox, sumará sus valores como si fueran pagos al contado (y pagos con tarjeta no sumará nada, luego 0), y viceversa..., si ese registro fuera pagado con tarjeta de crédito, todo el listado se suma como si fuera pagado con tarjeta de crédito (luego el pago al contado será 0).
Puedes elegir entre leer e ir sumando del fichero o con lo que aparece en el listado.
Si tiras del listado, debes leer cada línea, hacer el split, pero no a un string, mejor volcarlo a un registro...
Nota que el orden de los campos, debe coincidir con el orden en que fueron serializados... para recordarlo, pongo aquí dicha función (si la modificaste, lógicamente debes equipararla (la función FromString) con los cambios que hiciste).
Private Function SerializarRegistro(ByRef Registro As RegCompra, ByVal Separador As String) As String
With Registro
SerializarRegistro = CStr(.NumTicket) & Separador & .Producto & Separador & CStr(.Cantidad) & _
Separador & CStr(.PrecioUnidad) & Separador & CStr(.SubTotal) & _
Separador & GetMetodoPago(.MetodoDePago) & Separador & CStr(.FechaCompra)
End With
End Function
Private function FromString(byRef Linea As String, optional ByRef Separador as String = vbTab) As RegCompra
dim campos() As string
campos = Split(Linea, Separador)
With FromString
.NumTicket = CInt(campos(0))
.Producto = campos(1)
.Cantidad = CInt(campos(2))
.PrecioUnidad = CSng(campos(3))
.SubTotal = CSng(campos(4))
.MetodoDePago = SetMetodoPago(campos(5)) ' función que se añade debajo... ' CByte(campos(5))
.FechaCompra = CDate(campos(6))
end with
end Function
Igual que teníamos la función 'getMetodoPago, que traducía '0' ó '1' a un texto más descriptivo, ahora necesitamos la función inversa:
Private Function GetMetodoPago(ByVal Metodo As MetodosDePago) As String
If (Metodo = PAGO_AL_CONTRADO) Then
GetMetodoPago = "Contado "
Else
GetMetodoPago = "T. Credito "
End If
End Function
Private Function SetMetodoPago(ByRef Metodo As String) As MetodosDePago
If (LCase$(Trim$(Metodo)) = "contado") Then
SetMetodoPago = PAGO_AL_CONTRADO
Else
SetMetodoPago = PAGO_CON_TCREDITO
End If
End Function
Lógicamente si dejaste como texto "0" ó "1", entonces bastaría una conversión:
.MetodoDePago = cbyte(campos(5))
en vez de la llamada a esta función
Ahora la suma debe modificar la lógica...
Reg2 es obtenido con cada línea, luego el valor 'metododepago' es actualizado justo con cada factura y por tanto se suma al total que procede...
Dim totalcontado As Single ' <-------- no olvides cambiarlo.
Dim totaltcredito As Single
' ...
' ...
' ...
For h = 0 To List1.ListCount - 1
reg2 = FromString(List1.List(h), vbTab)
If (reg2.MetodoDePago = PAGO_AL_CONTRADO) Then ' valor 0
totalcontado = totalcontado + reg2.SubTotal 'Val(Split(List1.List(h), vbTab)(6))
Else 'If reg2.MetodoDePago = "1" Then
totaltcredito = (totaltcredito + reg2.SubTotal) 'Val(Split(List1.List(h), vbTab)(6))
End If
Next
'...
Por último, nota que en función de la complejidad de cada línea puede ser preferible leer del fichero de nuevo cada registro, o del listado dando formato a cada campo... ...como operabas desde el listado he modificado desde ahí.
Si un fichero fuera enormemente grande, lo más probable es que un listado contuviera solo una cantidad predefinida máxima de facturas (no todas las que un fichero tuviere, imagina 100.000 ó 1 millón), por lo que uno debe decidir si lo que suma es el total del fichero o solo el total del contenido en el listado. Piensa además que un listado puede estar filtrado (no solo por la cantidad de líneas que deba contener), sino por cosas como un rango de fecha, por ejemplo 'todas las compras de diciembre de 2021'... en fin es una lógica que hay que tener presente, no siempre sumar todo lo que el fichero contiene, si no sujeto a determinados criterios de filtro.