¿Te atreves a demostrar lo que sabes resolviendo alguno de estos
temas abiertos/no resueltos?

Dudas con Cálculo m...
 
Compartir:
Avisos
Vaciar todo

Dudas con Cálculo matemáticos en Formulario.

jopi
 jopi
(@jopi)
Miembro activo Registered

Hola Foristas. Espero se encuentren bien de salud al igual que su familia.

Amigos, estoy teniendo algunos problemas con un formulario que estoy haciendo para mi esposa. El sistema consiste en hacer las Pre-Nóminas de su Empresa. Voy a comentarles los problemas para ver si pueden ayudarme.

Primero que todo, el Proyecto aún no está terminado, me faltan algunas cosas, pero no tienen que ver con lo que les estoy pidiendo, son detalles de Información, configuración de los TextBox y ListBox y alguna que otra cosa más.

El Proyecto está conformado por FrmBDPersonal, donde doy alta a los trabajadores, FrmModificarP, para hacer las modificaciones por error que pueden haber ocurridos durante el Alta o por cambio del trabajador (Plaza, Salario, etc.), El FrmPreNomina que es donde quiero que se hagan los cálculos y donde tengo el mayor problema.

En el FrmPersonal se le da alta a los trabajadores con los datos mínimos indispensable.

Yo tengo en el FrmPreNomina configurado que al hacer DobleClick en el Listbox los datos de ese trabajador se muestren en los TextBox y a partir de ahí quiero hacer los cálculos necesarios.

 

    Me.CmbID.Text = Va el Número ÚNICO  del trabajador (No se puede repetir)

    Me.TxtNombre.Text =  Nombre y Apellidos del trabajador

    Me.TxtIdentidad.Text = Número de Carnet de Identificación (11 dígitos)

    Me.TxtCO.Text = Categoría Ocupacional (Si es Técnico, Obrero, Servicio, Administrativo)

    Me.TxtDepartamento.Text = Departamento al cual está vinculado el Trabajador

    Me.CmbPrenomina.Text = En este Combobox  se escogerá el TIPO DE PRENÓMINA a trabajar. (Lo define el Usuario)

    Me.TxtSexo.Text =   Se define el Sexo de trabajador

    Me.TxtSalarioB.Text = Se declara el Salario Básico de Trabajador según la Plaza a Desempeñar

    Me.TxtTiempo.Text = Es el Tiempo declarado en Régimen en el FrmBDPersonal. Depende de los días a trabajar en el Mes.

    Me.TxtHora.Text = Es la totalidad de Horas a trabajar en el mes, o sea, Me.TxtTiempo * 7.9416. Si son 24.0 horas debe tener 190.6 en Tiempo. (Debe calcularlo el sistema)

    Me.TxtF.Text = Esto es un Código de Ausencia F=Enfermedad o Subsidio. Acá se pone los días de ausencia y se multiplican (*) por 8 y el resultado de esta operación matemática se le resta a Me.TxtTiempo  y al variar o cambiar este, también cambia el Me.TxtHora (El Usuario define sin son 8, 16, 24, etc., pero el Sistema debe calcular el resto)

    Me.TxtD.Text = Igual al anterior, pero D = Vacaciones

    Me.TxtN.Text = Igual al Anterior, pero N = Licencia sin sueldo

    Me.TxtA.Text = Igual al anterior, pero A = Ausencia Injustificada. Se pueden afectar hasta los 4 en el mes con un trabajador (Los 4 anteriores lo define el usuario)

    Me.TxtSalarioR.Text = Esto es Salario Real.  Me.TxtSalarioR = Me.TxtSalarioB/190.69*7.94541*Me.TxtTiempo (Debe calcularlo el sistema)

    Me.TxtNot.Text = Esto es Nocturnidad, sólo válido para los de Ocupación Agente Seg. Y Protección. El cálculo es Me.TxtTiempo * 11.60 siempre que Me.TxtTiempo sea >0 (Debe calcularlo el sistema)

    Me.TxtBon.Text = Esto son las Bonificaciones. Las Bonificaciones se pagan de diferentes maneras:

                If Me.TxtOcupacion = “Mecánico B Automotor” or “Pnchero” or “Ayudante” Then

                     Me.TxtTiempo * 1.15

                                If Me.TxtOcupacion =  “Operario Agropecuario” or “Soldador B” or “Fregador de Piezas y Equipos” or     

                                 “Electricista B Automotor”  Then

                                      Me.TxtOcupacion * 0.60

                               End If

                End If

    Me.TxtSobreC.Text = Esto lo define el Usuario

    Me.TxtPagado.Text = Es el Salario Total a Cobrar por el Trabajador. Me.TxtPagado = Me.TxtSalarioR + Me.TxtNoc + Me.TxtBon + Me.TxtSobreC

    Me.TxtFecha.Text = Esta es la fecha en que se hace la Prenómina. Debe ser el Último día de cada mes. (La define el usuario, pero se le puede definir de manera automática)

    Me.LblOcupacion.Caption = Acá defino el Cargo que ocupa el trabajador en cuestión. La pre-Nómina no requiere de este dato, pero yo lo incluí.

    Me.TxtReg.Text = Es el Valor que se le definió en el FrmPersonal a cada trabajador y que no es más que el Régimen de Trabajo Mensual, o sea, 24 días, 26 días o 30 días.

Importante!!!!!!   Después que haga todo esto lo pase a la Hoja9 (Nomina)

Esto es lo que estoy necesitando. Llevo más de 9 noches y madrugadas trabajando en esto y no he podido definir un código. He probado con If-End If, con If-Then-Else, con Select Case y no sé cuántas cosas más, pero nada. A modo de explicación, no de Justificación, realmente tengo poco tiempo trabajando en VBA, sólo 7 meses, no tengo ordenador, utilizo el de un amigo y el tiempo no me alcanza. Al parecer mis conocimientos no llegan allá, pero seguro pueden estar que aprenderé.

Otro problema que tengo es que, en el FrmModificarP, cuando oprimo el Botón Modificar, me pasa los datos a la Hoja, pero creando un nuevo registro, no modificando el existente y no sé dónde está el problema. Otra cosa, cuando cargo el FrmModificarP tengo que dar un click en el ListBox para que se muestren los registros y no debe ser así.

Como dije, mis conocimientos son mínimos, pero paso mucho trabajo con los Bucles y los Eventos.

Creo que es bastante, verdaderamente le estaré agradecido al o a las personas que puedan ayudarme con este tema. Quiero ayudar a mi esposa a que pase menos trabajo. Actualmente lo hace en una plantilla de Excel que lo le hice, pero es mucho más eficiente y eficaz hacerlo a través de un Formulario.

Un GRACIAS anticipado y tengan una buena semana.

Desde acá un amigo.

Saludos

Pino.

 

Citar
Topic starter Respondido : 28/10/2021 5:21 am
Etiquetas del debate
RET
 RET
(@ret)
Miembro Admin

Hola @jopi,

 

Haces una descripción bastante buena de lo que es cada campo del formulario, pero cual es el problema concreto? Cual de los campos te da problemas para calcularlo?

Uno de los problemas que veo, así de forma rápida, es que usas los valores de los TextBox directamente para calcular: Me.TxtTiempo * 7.9416

El valor almacenado en un TextBox es un texto (aunque represente un número, para VBA es un texto). No es lo mismo 10.432,76 que "10.432,76". Tienes que hacer una conversión de tipo texto a número:

CSng(Me.TxtTiempo.Caption) * 7.9416

Deberías también hacer una comprobación de que el valor del TextBox puede ser convertido a número, si no, tendrás un error no controlado.

 

Saludos,

IMF_RET

https://InformaticaMuyFacil.com

ResponderCitar
Respondido : 28/10/2021 9:17 am
jopi
 jopi
(@jopi)
Miembro activo Registered

@ret Buenos días RET. Cuanto gusto saludarlo y espero que se encuentre bien de salud.
A ver, no quiero que se mal interprete mi tema, el problema en concreto está en que no sé hacer eso que expongo, como dije mis conocimientos son ínfimos pero si quiero y tengo la necesidad de aprender, porque me he enamorado de VBA y se pueden hacer cosas maravillosas y útiles. Por favor, les pido humildemente que me ayuden, que al menos me ejemplifiquen en el código del Proyecto algunos de estos cálculos y yo trataré de adecuar lo hacer los demás aunque pase el trabajo más grande del mundo. Es que no tengo idea de como hacerlo...
En cuanto a la descripción de los cálculos de los TextBox, lo escribí de esa manera para que se dieran cuenta de lo que quiero. Sé que los valores de un TextBox son numéricos, pero me cuenta dar formato a ellos porque no sé hacerlo.
Si es mucho trabajo, no hay problemas, sabré entenderlo, además, no soy el único que va con problemas y dudas al Foro y a esto súmenle los propios problemas de los miembros, su trabajo, sus familia, etc.

Son muchas las dudas que tengo, Muchísimas. Hace apenas 7 meses que escribí por primera vez un código en VBA. No tengo ordenador, estudio de manera autodidacta, no tengo quien me guía. Cuando tengo una duda empiezo a modificar el código hasta dar con la solución y esto a veces me toma días. NO me estoy justificando, sólo estoy exponiendo mi parte. Cuando subo algo al Foro es porque ya agoté todos mis "Recursos", porque realmente no me gusta Molestar.
En cuanto al Foro quiero comentarle que es muy BUENO, se atienden los problemas con mucha prontitud y son muy amables, además del conocimiento que tienen todos los miembros del mismo (menos yo). Casi siempre ofrecen más de una solución y esa versatilidad hace que aprendamos más, que ampliemos nuestros conocimientos. Mi opinión del Foro es EXCELENTE, no tengo la más mínima duda. Quería expresarle esto porque entiendo que usted es uno de los Administradores y segundo porque en ocasiones nos callamos las cosas y estos detalles pueden ser muy importante para personas que como ustedes hacen una trabajo tan altruista como este.

Gracias por responder.
Por acá un amigo.

Pino

ResponderCitar
Topic starter Respondido : 28/10/2021 4:41 pm
RET
 RET
(@ret)
Miembro Admin

@jopi,

Para, por ejemplo, calcular el salario real, que dices es:

Me.TxtSalarioR = Me.TxtSalarioB/190.69*7.94541*Me.TxtTiempo

cambia en la rutina Private Sub LstNomina_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Me.TxtSalarioR.Text = .List(x, 14)

por

Me.TxtSalarioR.Text = Format(CSng(.List(x, 7)) / 190.69 * 7.94541 * CSng(.List(x, 8)), "#,##0.00")

CSng(.List(x, 7)) / 190.69 * 7.94541 * CSng(.List(x, 8)) hace el cálculo, previa conversión de los tipos de los datos y con format consigues que te salga en formato de dos decimales el valor calculado.

Usa el mismo procedimiento para otros datos calculados.

 

Saludos,

IMF_RET

https://InformaticaMuyFacil.com

ResponderCitar
Respondido : 28/10/2021 5:42 pm
jopi
 jopi
(@jopi)
Miembro activo Registered

@ret

OK RET, voy a intentarlo en cuanto mi amigo me preste su Ordenador. Ahora bien, suponiendo que todo salga bien, como puedo pasar todos esos datos a la Hoja9 (Nomina)?

Un abrazo.

Pino

ResponderCitar
Topic starter Respondido : 28/10/2021 6:05 pm
jopi
 jopi
(@jopi)
Miembro activo Registered

Hola RET. He modificado el código de dos (2) TexdtBox (SalrioR y Pagado) y está funcionando, pero necesito me revises(si es que puede, claro) el código del Botón Modificar porque me da un error, además, cuando traigo con el evento DobleClick del a los TextBox ListBox un trabajador, no me está poniendo los valores en sus respectivas cajas de Texto y esto altera los resultados de los calculos. En otros casos no muestra nada como es el del TxtReg  y a su vez hay campos que no muestra el LixtBos como el SalarioR y Pagado, además de otros. Le muestro un ejemplo:

With Me.LstNomina
x = .ListIndex
Me.CmbID.Text = .List(x, 0) 'OK
Me.TxtNombre.Text = .List(x, 1) 'OK
Me.TxtIdentidad.Text = .List(x, 2) 'OK
Me.TxtCO.Text = .List(x, 3) 'OK
Me.TxtDepartamento.Text = .List(x, 4) 'OK
Me.CmbPrenomina.Text = .List(x, 5) 'OK Se define por el usuario
Me.TxtSexo.Text = .List(x, 6) 'OK
Me.TxtSalarioB.Text = .List(x, 7) 'OK
Me.TxtTiempo.Text = .List(x, 8) 'Está poniendo el valor de la Nocturnidad. Debe ser cálculo automático
Me.TxtHora.Text = .List(x, 9) 'Está poniendo el Valor de la Bonificación. Debe ser cálculo automático
Me.TxtF.Text = .List(x, 10) 'Está poniendo el Régimen de Trabajo. Se intruduce el vor por el Usuario
Me.TxtD.Text = .List(x, 11)
Me.TxtN.Text = .List(x, 12)
Me.TxtA.Text = .List(x, 13)
'Me.TxtSalarioR.Text = .List(x, 14)
Me.TxtSalarioR.Text = Format(CSng(.List(x, 7)) / 190.69 * 7.94541 * CSng(.List(x, 8)), "#,##0.00") 'OK

Me.TxtNot.Text = .List(x, 15)
Me.TxtBon.Text = .List(x, 16)
Me.TxtSobreC.Text = .List(x, 17)
'Me.TxtPagado.Text = .List(x, 18)
Me.TxtPagado.Text = Format(CSng(.List(x, 18)) + CSng(.List(x, 7)) + CSng(.List(x, 15)) + CSng(.List(x, 16)) + CSng(.List(x, 17)), "#,##0.00") 'OK
Me.TxtFecha.Text = .List(x, 19)
Me.LblOcupacion.Caption = .List(x, 5)
Me.TxtReg.Text = .List(x, 11)

End With

Por favor, si pudiera revisar y decirme dónde está el problema para poder seguir avanzando y por favor, podría ayudarme también con el Condicional If de los TextBox de Nocturnidad y Bonificacion, porque de ello dependen mucho tanto el SalarioR como el Pagado.

Gracias una vez más.

Pino

ResponderCitar
Topic starter Respondido : 28/10/2021 8:01 pm
RET
 RET
(@ret)
Miembro Admin

@jopi,

Me.TxtTiempo.Text = .List(x, 8) 'Está poniendo el valor de la Nocturnidad. Debe ser cálculo automático

Los encabezados de los datos de la hoja 6 que usas para cargar el listbox no coinciden con los encabezados que después pones al listbox. El dato de la columna I de la Hoja6 (BD Empleados) es Noct. pero en el list, pone Tiempo. Eso no es ningún error del programa. Donde está el dato de Tiempo?

A partir de ahí, se desconfigura toda la carga de datos.

 

Con respecto a los cálculos, no sería mas sencillo que en la hoja BD Empleados calculases ya todos los datos y luego, simplemente los cargases desde ahí, en vez de calcularlo con código? Si te estás liando con esa parte, hazlo sencillo.

 

El error del botón modificar es porque tienes una variable dimensionada como tipo LongLong. Cuando te sale el mensaje de error y te muestra la ventana de código, te esta marcando en azul esa línea. Sólo hay que mirar donde se está parando el código.

 

IMF_RET

https://InformaticaMuyFacil.com

ResponderCitar
Respondido : 31/10/2021 10:21 am
jopi
 jopi
(@jopi)
Miembro activo Registered

@ret 

Buenas noches RET. Espero que goces de excelente salud al igual que su familia.

Dejame ver si le he entendido Profesor y poder abreviar y terminar con esto que me tiene tantas noches y madrugadas despierto:

1.- Usted me sugiere que en la Hoja BD Empleados, en el momento de dar el Alta a cada uno de los Trabajadores incluya todos los datos que van a la Pre-Nómina? Si es esto, no lo había pensado antes, pero ahora que me lo comentas, creo que es mejor, incluso, ya definir a la hora del Alta del trabajador, por ejemplo, si es Agente de Seg. y Pretección mediante un CheckBox definirle que este tipo de trabajador tiene Nocturnidad (que es el tiempo que se le declare como trabajado, que se introduce Manual *11.60 que es la tarifa) y de la misma manera hacerlo con los demás Cargos que tienen otro tipo de pagos. Eso lo veo excelente y gracias por  sugerirme algo tan obvio como eso, que verdaderamente no lo había pensado, lo que sucede es que esto lo puedo hacer en el Formulario de Alta de Trabajadores o Empleados sin muchos problemas, o sea, el diseño, pero voy a estar igual al final, porque no sé cómo tratar los cálculos dentro del código, no sé como hacerlo...

Gracias mil a usted y comenzaré a revisar y rediseñar el formulario.

Un abrazo.

Pino

 

 

 

ResponderCitar
Topic starter Respondido : 01/11/2021 3:42 am

Dejar una respuesta

Nombre del autor

Correo electrónico del autor

Título *

 
Vista previa 0 revisiones Guardado