Visual Basic para Aplicaciones - Problema en cálculo en UserForm.

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

Problema en cálculo en UserForm.

Publicado por Jose (4 intervenciones) el 09/12/2021 04:20:21
Hola colegas y miembros del Foro. Tengan buenas noches todos.
Soy nuevo por acá, recién estrenado y tengo un problema para hallar unos cálculos en un Formulario y me gustaría que me ayudaran.
El problema es el siguiente:
Esto es un Proyecto que le estoy haciendo a mi esposa para su trabajo, que no es más que la confección de las Pre-Nóminas de su empresa.
El problema radica en el UserForm (FrmTarjetaSalario). Es una copia del FrmSubsidios porque utilizo casi los mismos datos que este. En este proyecto, específicamente en el FrmSubsidio me ayudo un amigo y colega, pero él no está disponible en estos momentos (viajando fuera del país) y necesito terminarlo. El problema del FrmTarjetaSalario está en los cálculos, que sigue siendo una asignatura pendiente en mi aprendizaje, pues sólo llevo 9 meses en esto de VBA.
¿Cuáles son los cálculos?
En el Label TotalDContar, necesito que me multiplique (*) el Promedio Dias * el % y esto me da un resultado que quiero que se muestre de manera o en Tiempo Real (EN TODOS LOS LABEL). A este resultado lo llamaré X
(TotalDContar = CDbl(TotalPDias.Caption) * CDbl(Left(CmbAplicar.Value, 2))
Después en el Label TotalDPagar debe multiplicar (*) ese resultado anterior (X) por Días Carencia y me da un resultado que llamaré Z
TotalDPagar = CDbl(TotalDContar.Caption) * CDbl(Carencia.Value)
Seguido, ese resultado (Z) lo resto (-) al Promedio Mes y el resultado de este lo imprimo en el Label Neto.
TotalPDias = CDbl(TotalDPagar.Caption) - CDbl(TxtPromedioMes.Value)
Algo así debe ser. Yo traté de hacerlo, pero nada, mis conocimientos no llegan a tanto.
Yo llamó al trabajador mediante el Evento DobleClick del ListBox, pero no sé si es ahí donde puede estar el problema, porque me trae los valores que tiene ese trabajador.
Este cálculo se hace, cuando un Trabajador por prescripción médica presenta un Certificado de invalidez parcial por determinados días y se le hace el cálculo de lo que va a cobrar por salario (FrmSubsidio), pero a la hora de plasmar en su tarjeta Salarial el salario de ese mes en cuestión se debe hacer este cálculo que les estoy comentando.
El Botón Calcular, sólo lo tengo para pasar los datos a la hoja.
Adjunto el archivo Integro.
Usuario: Pino
Password: 123
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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Problema en cálculo en UserForm.

Publicado por Antoni Masana (498 intervenciones) el 09/12/2021 20:05:21
Intento entender que hace el formulario que tienes el problema.

Veo varias cosas:

-- Si selecciono un nombre con el ComboBox no rellena los campos ¿Para que sirve el ComboBox?
-- Si selecciono un nombre desde el ListBox si se rellenan los datos.
-- Una vez los datos puedo cambiar el nombre con el ComboBox ¿Que sentido tiene?
-- Cuando se selecciona el % a Aplicar hace cosas muy raras

Tomo como ejemplo Manuel R Rivero.Cuando selecciono el % a Aplicar multiplica

TotalDContar = CDbl(TotalPDias.Caption) * CDbl(Left(CmbAplicar.Value, 2))

Que es 54,63 * 60 y da como resultado 3277,80 y lo pone el el campo TotalDContar (Esto esta mal y le falta dividir por 100)

2º cálculo

TotalDPagar = CDbl(TotalDContar.Caption) * CDbl(Carencia.Value)

Que es 3277,80 * 3 y da como resultado 9833,40 y lo pone el el campo TotalDpagar

3º cálculo

TotalPDias = CDbl(TotalDPagar.Caption) - CDbl(TxtPromedioMes.Value)

Que es 9833,40 - 145,60 y da como resultado 9687,80 y lo pone el el campo TotalPDias

Y a partir de aquí entra en bucle porque pierde el valor del primer campo TotalPDias.Caption y cada vez que modifica el porcentaje se enredan los números.


Creo que laa solucion es esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub LstRegistroS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim x, uFila As Long
    On Error GoTo err:
 
    With Me.LstRegistroS
        x = .ListIndex
 
        Me.tNombre.Text = .List(x, 0)
    '    Me.DiasCertificado.Text = .List(x, 5)
        Me.Carencia.Text = .List(x, 4)
        Me.TxtPromedioDia.Text = .List(x, 3)
        Me.TotalDContar = ""
        Me.TotalDPagar.Caption = .List(x, 9) * Carencia
        Me.TotalPDias.Caption = .List(x, 10) - .List(x, 2)
        Me.Neto.Caption = .List(x, 12)
        Me.TxtTotalS.Text = .List(x, 1)
        Me.TxtPromedioMes.Text = .List(x, 2)
 
    End With
 
    Exit Sub
err:
    MsgBox ("No de ha definido ningún Dato"), vbInformation, "COLOSSUS - Pre-Nómina"
End Sub

Y aqui esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Hasta_Change()
'     TotalDContar = Application.WorksheetFunction.NetworkDays_Intl(CDate(Desde), CDate(Hasta), 11, 17) - contador
     If Carencia = "" Then Carencia = 0
 
     TotalDContar = CDbl(TotalPDias.Caption) * CDbl(Left(CmbAplicar.Value, 2)) / 100
  '   TotalDPagar = CDbl(TotalDContar.Caption) * CDbl(Carencia.Value)
  '   TotalPDias = CDbl(TotalDPagar.Caption) - CDbl(TxtPromedioMes.Value)
     If CmbAplicar = "" Then
        MsgBox "Debe marcar el porcentaje a aplicar"
        CmbAplicar.SetFocus
        CmbAplicar.BackColor = RGB(0, 255, 0)
        Exit Sub
     End If
'     TotalPDias = CDbl(TotalDPagar.Caption) - CDbl(TxtPromedioMes.Value)
'     Neto = CDbl(TotalPDias) * CDbl(Left(CmbAplicar.Value, 2)) / 100
'     Neto = FormatNumber(Neto, 2)
End Sub

Y seguro que hay cosas que se pueden mejorar. Adjunto libro con los cambios.

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

Problema en cálculo en UserForm.

Publicado por José Pino (3 intervenciones) el 09/12/2021 22:57:41
Buenas tardes Antoni. Un placer que usted haya atendido y respondido mi inquietud. Soy nuevo en el Foro, pero por lo que veo es usted uno de los más activos. Como expliqué apenas comienzo en este Prestigioso Foro y también apenas comienzo con esto de VBA, sólo 9 meses desde que escribí mi primer código y por supuesto tengo muchas "Lagunas" y mucho por aprender.
Me llamo José Ignacio Pino Mondeja, tengo 56 años, tres hijos varones, soy Licenciado en Economía y Licenciado en Periodismo y vivo en Cuna. Acá las cosas están muy difíciles (a no ser que seas Turista) y esto de mantener Internet con los precios que tiene y las restricciones son un verdadero reto, además, no existe bibliografía al alcance de las personas y para estudiarlo debes ingresar en la Universidad, que además es reducido y ya a mi edad no tengo derecho alguno, así que me propuse hacerlo de manera autodidacta y largo es el camino que me falta, pero donde yo entiendo que tengo más problemas son en los cálculos matemáticos y los Eventos.
En su acertada respuesta me plantea varias interrogante;
Los dos ComboBox son para el Nombre del trabajador y para seleccionar el % a aplicar.
Ahora tengo una duda y Voy con el mismo trabajador de su ejemplo Manuel R. Rivero.
En el Label TotalDContar debe ir Promedio días * %, eso sería 6.07 * 60% = 3.65
En el Label TotalDPagar de ir el resultado anterior * dias Carencia, o sea, 3.65 * 3 = 10.95
En el Label TotalPDias sería el resultado anterior - Promedio Mes o lo que es igual 10.95 - 145.60 = -134.65 Esto queda negativo, por lo que debía ser 145.60 - 10.95 = 134.65. y ese valor debe mostrarlo en el Label Neto (Neto a Cobrar)
No sé si me ha entendido, pero no es lo que vi en su propuesta, que es muy interesante, pero no me da el resultado esperado.
Un abrazo sincero y bendiciones.
Saludos
Pino
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.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Problema en cálculo en UserForm.

Publicado por Antoni Masana (498 intervenciones) el 10/12/2021 19:42:32
Cambios realizados.

1
2
3
4
5
6
7
8
9
Private Sub Hasta_Change()
    If CmbAplicar.Value = "" Then Exit Sub
 
    If Carencia = "" Then Carencia = 0
 
    TotalDContar = Round(CDbl(TxtPromedioDia.Text) * CDbl(Left(CmbAplicar.Value, 2)) / 100, 2)
    TotalDPagar = CDbl(TotalDContar.Caption) * CDbl(Carencia.Value)
    TotalPDias = CDbl(TxtPromedioMes.Value) - CDbl(TotalDPagar.Caption)
End Sub


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub LstRegistroS_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim x, uFila As Long
    On Error GoTo err:
 
    With Me.LstRegistroS
        x = .ListIndex
 
        Me.tNombre.Text = .List(x, 0)
    '    Me.DiasCertificado.Text = .List(x, 5)
        Me.Carencia.Text = .List(x, 4)
        Me.TxtPromedioDia.Text = .List(x, 3)
        Me.TotalDContar = ""
        Me.TotalDPagar.Caption = ""
        Me.TotalPDias.Caption = ""
        Me.Neto.Caption = .List(x, 12)
        Me.TxtTotalS.Text = .List(x, 1)
        Me.TxtPromedioMes.Text = .List(x, 2)
 
    End With
    CmbAplicar.ListIndex = -1
    Exit Sub
err:
    MsgBox ("No de ha definido ningún Dato"), vbInformation, "COLOSSUS - Pre-Nómina"
End Sub

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

Problema en cálculo en UserForm.

Publicado por José Pino (3 intervenciones) el 10/12/2021 23:28:37
Buenas tardes Foristas.
Buenas tardes Profesor Antoni.
Excelente, ese era el resultado que estaba buscando. Perfecto su código, solo me queda revisar, que aunque no sé, buscaré información, porque en los cálculos me está dando una diferencia de 0.03 centavos (de menos), imagino que sea por redondeo, pero bien desde el punto de vista operacional.
Gracias a todos los miembros del Foro.
Gracias mil a usted por dedicar su tiempo a mi duda o problema. Estoy muy agradecido.
Tema resuelto.
Saludos
José Pino.

PD
Profesor, a los problemas que le comenté anteriormente, súmele que no tengo Ordenador, me sirvo de un amigo que me da algún tiempo semanal para poder hacer "mis cosas", esto hace mucho más difícil y lento mi aprendizaje, pero tengo interés y no voy a rendirme.
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