Saltar al contenido

Cálculos en TextBox y Label.


pinoji

Recommended Posts

Buenos días Foristas. Una vez más por acá. Quizás más rápido de lo que yo hubiera querido, pero sigo teniendo problemas con los cálculos en VBA. Es algo que no acabo de aprender y necesito aprenderlo.

Acá en mi país cuando un trabajador se enferma y el Médico le da Reposo, emite un Certificado Médico, donde entre otros datos consigna los días a Descansar y la fecha Inicial cuando comienza ese Reposo. Imagino que en todos lados sea parecido, quizás difiera en el cálculo.

Yo quise automatizarle esto a mi esposa para que hiciera los cálculos de manera automática con sólo introducir los datos imprescindibles.

Primero: Declara el Salario devengado por cada uno de los últimos 12 meses y esto crea un Total de Salario. Esto lo logré hacer y funciona perfecto, porque lo que necesito es que se vaya mostrando en los TextBox o Label los resultados en Tiempo Real, pero hay otros cálculos que no he podido lograr, por ejemplo:

Promedio Mes que utilizo la función =SI.ERROR(PROMEDIO(D8:D19),"0.00")

Promedio Día que utilizo la función =SI.ERROR(D21/24,"0.00")

Días a Contar que utilizo =DIAS.LAB.INTL(H8,I8,11,I13) (en el cuarto argumento requiere del rango I13:I20)

Total Días a Pagar =F11-D23

Días x Promedio Días =SI.ERROR(F14*D22,"0.00")

Neto a Cobrar =SI.ERROR(F17*K9/100,"0.00")

El importe de los Meses se introduce manual, al igual que Fecha Inicio (Desde) y Fecha Final (Hasta), al igual que en No Considerar que son fechas de días Feriados, Festivos o simplemente No laborables (no incluye los domingos)

En el Combobox % a Aplicar defino el porciento que requiere el certificado según el Tipo.

En Días de Carencia se introduce manual. Esto son los 3 primeros días de cada certificado que no se les paga, a no ser que el certificado sea continuación de otro.

En la Hoja me funciona PERFECTAMENTE y obtengo lo que necesito, pero quiero hacerlo a través de VBA, pero no logro concretar los cálculos en los TextBox o Label. Esto es una asignatura que sigo teniendo pendiente pero que superaré.

Resumiendo, necesito me ayuden a que los TextBox TxtPromedioDia y TxtPromedioMes me vaya mostrando en Tiempo Real el resultado de las operaciones, así como en los 4 Label.

Aun no lo he terminado, pero con esto me estarían ayudando muchísimo.

Les agradecería su apoyo.

Gracias y que tengan un excelente día.

JIPM

Subsidio Foro .xlsm

Enlace a comentario
Compartir con otras webs

@pinoji , como veo que andas intentando aprender, antes de mirar tu fichero te doy la guía para hacer cálculos en VBA

Ten en cuenta que todos los datos que metas en TextBox o  Labels, siempre son Strings (texto), por lo que de alguna manera debes poder convertilos a números para poder operar con ellos.

La forma es declarar variables como números, y después asignárles los valores de los textbox o labels conviertiéndolos en numero. Con un eemplo lo verás más claro

Los tipos de números en que convertir depende de los que necesites. Si necesitas números con decimales, debes declararlos como Double, si no es así como Long.
 

Dim dias as Long, salario as Double

dias=Clng(TextBox1)
salario=Cdbl(TextBox2)

Aquí "Clng" es la función de VBA que convierte texto a Long (número sin decimales) y "Cdbl" la que convierte a Double.

Por cierto, cuando dimensionas a CADA variable le debes asignar su tipo. Si haces lo siguiente:

Dim salario as Double, diario, division

NO estas definiendo TODAS como Duble, las que no tienen valor SE DIMENSIONAN como "Variant" (por defecto VBA si no pones qué tipo de variable va a ser, y solo lo dimensionas como, por ejemplo "diario", lo hace como Variant.

Para trabajar con fechas, lo mejor es primero convertilars a "Long" (valor interno de las fechas en Excel), trabajar con ellas, y después devolver su valor con "Cdate" para devolver el valor de la fecha
 

Dim fecha1 as Long, fecha2 as Long

fecha1=Clng(TextBox1)
fecha2=Clng(TextBox)
.
.
operaciones con ellas (sumas, restas, etc)
.
.
TextBox3=Cdate(resultado de las operaciones)

A ver cómo se te da con esta pequeña ayuda ;)

Enlace a comentario
Compartir con otras webs

Buenos días Haplox. Espero que se encuentre bien de salud.

Muy interesante su comentario y por supuesto que es una tremenda ayuda, sobre todo para mi que apenas estoy comenzando con esto de VBA. Comenzaré a interiorizar y poner en practica estos elementos.

Pero sigo teniendo una duda; Como puedo en el Formulario que envié por ejemplo mientras voy declarando los salarios por meses, de manera automática y en tiempo real se vaya mostrando el el TextBox  correspondiente al Promedio Mes el resultado y así con el Promedio Días y los demás TextBox y Label como sucede con el Total de Salario.  En qué Evento lo declaro, cómo podría ser la sintaxis (...) porque para el Total de Salario con un poco de trabajo lo hice, pero he intentado con los demás y no puedo lograrlo.

Podrías ayudarme con un ejemplo para yo tener una referencia?

Gracias por atender mi duda y excelente fin de semana para ti y tu familia.

Saludos

Pino

Enlace a comentario
Compartir con otras webs

Hola Juanlui, buenas noches.

No entiendo a ciencias ciertas su pregunta. Creo entender que si conozco el Calendario EcoCalendario. Pues sí,  lo uso en mis proyectos y es muy fácil de usar. Consta de un Modulo, un Modulo Clase y un UserForm, los cuales los incluyes en tu proyecto y listo. Si esa es tu pregunta creo que está contestada, si es otra, por favor, dime y responderé con mucho placer. Usted me ayudó en su momento con una duda y creo estar en deuda con usted. Gracias por todo.

Saludos y excelente fin de semana.

JIPM

Enlace a comentario
Compartir con otras webs

Hace 4 horas, Janlui dijo:

Enigma, me permites conoce el calendario que mencionas EcoCalendario?

Gracias

Está en el mismo archivo publicado por @pinoji y es un aporte que hice hace tiempo en mi canal EcoExcel. De hecho hay una versión mejorada y me gustó mucho el desarrollo del mismo. Es fácil de usar y no ocupa tanto espacio.

Saludos.

Enlace a comentario
Compartir con otras webs

Enigma25, buenas noches. No conocía que usted estuviera al tanto de este Calendario y que además como dice "es un aporte que hice en mi canal EcoExcel..." Tenia entendido que era del Profesor David, pero no es la cuestión de mi comentario quien es o no el autor, lo que si quería comentar es que no se por qué razón me gustó este más que otros que me he encontrado, como el de Andrés Rojas Moncada, que por cierto es muy bueno, pero decidí usar este y me va bien, ahora me gustaría obtener esa versión mejorada. Podrías darme el link?

Gracias entonces por su aporte y acá tiene un seguidor y servidor.

Saludos.

Pino

Enlace a comentario
Compartir con otras webs

Hace 3 minutos , pinoji dijo:

Enigma25, buenas noches. No conocía que usted estuviera al tanto de este Calendario y que además como dice "es un aporte que hice en mi canal EcoExcel..." Tenia entendido que era del Profesor David, pero no es la cuestión de mi comentario quien es o no el autor, lo que si quería comentar es que no se por qué razón me gustó este más que otros que me he encontrado, como el de Andrés Rojas Moncada, que por cierto es muy bueno, pero decidí usar este y me va bien, ahora me gustaría obtener esa versión mejorada. Podrías darme el link?

Gracias entonces por su aporte y acá tiene un seguidor y servidor.

Un placer. Mi nombre es David Garcia y quien tiene el canal EcoExcel en Youtube y que tengo ese calendario para quienes lo deseen. Me doy a conocer como Enigma25 en el foro desde hace tiempo pero por temas de trabajo y demás, he dejado de participar pero le tengo un gran cariño a este foro porque me ha ayudado mucho y le debo tanto.

Aun no tengo los privilegios para aportar archivos pero espero que con el tiempo pueda dar mas aportes para que así, con el tiempo ya puedo adjuntar archivos.

De todos modos, el que usas, es básicamente el mismo. La mejora en si es de apariencia.

 

Enlace a comentario
Compartir con otras webs

Profesor, el placer es mío. Soy seguidor de su canal desde hace algún tiempo y he aprendido muchas cosas en él. No sabes a cuantas personas has ayudado al igual que este Foro que es excepcional, con miembros muy capaces, amables y sobre todo, tanto en usted como en este Foro el ALTRUISMO es una premisa. Yo verdaderamente admiro a aquellas personas que lo dan todo por ayudar a los demás. Por acá hay un grupo de personas (me incluyo, de hecho lo digo por mí) que desgraciadamente tenemos muchos problemas para acceder a Cursos On Line o tener una bibliografía acorde o una persona experta que lo guía y estos "espacios" vienen, de alguna manera, a "llenar" esos vacíos. Soy empírico, no se nada de Arquitectura, Algoritmo,  Programación estructurada, Pseudocódigos,  y  todos esos conceptos que se manejan en una Carrera Universitaria o quizás en Cursos, pero sí tengo el interés de aprender. Ya no tengo 20 años (tengo 56) y las capacidades de aprendizajes disminuyen mucho, las neuronas no son las mismas y hace apenas 9 meses que escribí mi primer código VBA y lo debo a los canales de YouTube y personas como ustedes. No son capaces de imaginas el trabajo que paso para poder hacer algo en Excel y VBA. No tengo Ordenador, poco tiempo, los apagones,  (...) pero aún así QUIERO aprender y me encuentro con personas como usted, Víctor Hernández (TOR-Code),  Carolina de Andrade, Andrés Rojas, Sergio Alejandro Campos, Antoni, JSD JSD, Haplox, Alexander, Jalui, Sergio Reigosa, Sergio el administrador de este Foro y muchos más presto a ayudar, a sacrificar su tiempo libre para atender nuestras dudas. En una ocasión lo dije y ahora lo repito, yo los considero Seres Superiores.

Pero bueno, basta charlas que este medio no es para eso. Agradecerle por sus aportes y que tenga una Excelente salud usted y su familia. Mi nombre es José Ignacio Pino Mondeja, vivo en Cuba, 56 años y me puede contactar por:     pinomondejajoseignacio@gmail.com.

Gracias a usted y todos los miembros del Foro

Enlace a comentario
Compartir con otras webs

Hace 17 horas, Enigma25 dijo:

Un placer. Mi nombre es David Garcia y quien tiene el canal EcoExcel en Youtube y que tengo ese calendario para quienes lo deseen. Me doy a conocer como Enigma25 en el foro desde hace tiempo pero por temas de trabajo y demás, he dejado de participar pero le tengo un gran cariño a este foro porque me ha ayudado mucho y le debo tanto.

Aun no tengo los privilegios para aportar archivos pero espero que con el tiempo pueda dar mas aportes para que así, con el tiempo ya puedo adjuntar archivos.

De todos modos, el que usas, es básicamente el mismo. La mejora en si es de apariencia.

 

@Enigma25Bueno saberlo que eres EcoExcel! Ahí me he tomado unos aportes que he encontrado en San Google, bueno y por el foro ya eres bastante bien conocido.

 

Los mejores éxitos en su vida.

Saludos

Enlace a comentario
Compartir con otras webs

A ver si entendí más o menos lo que necesitas. Para parte de la solución uso Función  de Otto Javier con alguna modificación.

'//////////////////////////////////////////////////////////////////
'// Función creada por Otto Javier González Diciembre de 2015
'// email: ottogonzalez@outlook.com
'// Canal de YouTube: https://www.youtube.com/ottojaviergonzalez
'//////////////////////////////////////////////////////////////////

Public Function Promediar(xForm As UserForm, xTextBoxName As String, xPromedio As Control)
Dim i As Control
Dim x As Double
Dim y As Double
    
On Error GoTo Errores
    
    For Each i In xForm.Controls
        If i.Name Like xTextBoxName & "*" Then
            If i <> Empty Then
                x = x + i
                y = y + 1
            End If
        End If
    Next
    
    xPromedio = 0
    xPromedio = FormatNumber(x / y, 1)
    FrmSubsidio.TxtTotalS = FormatNumber(x, 1)
Errores:
   Exit Function
   
End Function

 

Prueba.gif

Subsidio Foro .xlsm

Enlace a comentario
Compartir con otras webs

Buenas noches Foristas.

Buenas Noches JSD. Que bueno saber que estás ahí. Te has convertido en mi S.O.S y que privilegio para mí, aun sabiendo que  existe dentro de este Foro expertos con mucha experiencia y deseos de ayudar.

Voy a revisar con datos reales su propuesta, que de antemano creo es perfecta (no podía ser de otra manera), pero a priori vi algo que quizás no aclaré, o mejor dicho que no aclaré.  Acá se trabaja de Lunes a Sábado y se descansa los domingos y en la función Dias.Lab.Intl en el tercer argumento se define esto, que para mi caso es 11, pero tengo un rango de fechas que se llama No Considerar en el que agrego aquellas fechas como Feriados, Festivos, etc y que la función me va a descontar del total de los días. En la propuesta suya está:

Private Sub Hasta_Change()
     TotalDContar = Application.WorksheetFunction.NetworkDays_Intl(CDate(Desde), CDate(Hasta), 12, 17)
     If Carencia = "" Then Carencia = 0
     TotalDPagar = CDbl(TotalDContar) - CDbl(Carencia)
     TotalPDias = CDbl(TotalDPagar) * CDbl(TxtPromedioDia)
     If CmbAplicar = "" Then
        MsgBox "Debe marcar el porcentaje a aplicar"
        CmbAplicar.SetFocus
        CmbAplicar.BackColor = RGB(0, 255, 0)
        Exit Sub
     End If
     
     Neto = CDbl(TotalPDias) * CDbl(Left(CmbAplicar.Value, 2)) / 100
     Neto = FormatNumber(Neto)
End Sub

(...12, 17) y realmente no entiendo. Es que debo cambiar el 12 por 11?

y con el 17 qué hago? porque eso debe abarcar el rango I13:I20

Por favor, no lo tome a mal, pero más que resolver mi problema que ya se lo estoy agradeciendo, es más importante aprender, porque si no aprendo quedo en las mismas y yo necesito aprender.

Gracias mil. Mañana le escribo cuando haga una prueba con números reales, pero desde ahora mi agradecimiento.

Un abrazo.

JIPM

Enlace a comentario
Compartir con otras webs

Buenos días Foristas.

Buenos días JSD. Después de revisar con datos reales todo funciona perfecto excepto que me está dejando de contar un día. o sea,  todo parece indicar que el día que declaro en No Considerar no lo está tomando.

Saludos

JIPM 

Enlace a comentario
Compartir con otras webs

Buenas noches Foristas. Espero que se encuentren bien

Buenas noches JSD, igual para usted

Muchas Gracias JSD. Ese es el resultado que buscaba. Excelente su trabajo. No encuentro palabras para agradecer toda la ayuda que me ha brindado desde que inicié al Foro hasta hoy. Realmente lo aprecio y respeto mucho, al igual que el resto de los miembros de este Foro.

Doy el Tema por Cerrado.

Gracias a todos, en especial a usted y que tengan una excelente noche.

JIPM

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 96 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
    • Hola a ambos, @MarianoCruz, si con la respuesta de @Israel Cassales ya tienes resuelto el problema, perfecto. Punto final y a otra cosa. Pero piensa que tu archivo lleva vínculos externos, así que se hace difícil (prácticamente imposible) comprobar si las propuestas dadas ofrecen el resultado esperado. A tal efecto, te sugiero que vuelvas a subir otro archivo, esta vez insertando nuevas hojas que contengan los datos existentes en esos archivos externos.  Tal vez así se vea claro qué es lo que buscas conseguir, y se puedan hacer pruebas que verifiquen la bondad de el/los resultado/s. Tampoco iría mal que insertaras a mano qué resultado debe aparecer en la celda C3 en cada uno de los 3 casos: cuando se inserte 'XI', 'XL' o unos u otros números en los lugares apropiados. Así iremos totalmente sobre seguro acerca del método a emplear. Saludos,
    • Hi Trate de ver que hacían las fórmulas en cuestión pero a su libro le falta o le faltan hojas, por lo que solo podría participar con un par de ideas en general. Lo que entiendo es que según el valor de B3 en C3 debe poner una fórmula u otra, así que es posible que si combina DIRECCION() con INDIRECTO() pueda intercambiar de una fórmula a otra. =SI(B3="Xl",INDIRECTO(DIRECCION(3,5)),SI(O(B3=1,B3=2,B3=3),INDIRECTO(DIRECCION(4,5)),"")) Otra forma sería poner nombre a esas fórmulas en el cuadro de nombres para que las pueda mandar llamar a una o a la otra según el resultado de B3. Por favor tome en cuenta, es solo una idea.
    • Buenas tardes! Tengo el siguiente código: Private Sub btnCargaBancos_Click() Dim TasaCompra, TasaVenta As Double Dim InvBanesco, InvVzla, MontoBanesco, MontoVzla As Double Dim TasaDiaBan, TasaDiaVzla, TasaActual As Double 'Inversion = Val(txtInversion.Text) InvBanesco = Val(CDbl(txtInverBanesco.Text)) InvVzla = Val(CDbl(txtInverVzla.Text)) TasaCompra = Val(CDbl(txtTasaCompra.Text)) TasaVenta = Val(CDbl(txtTasaVenta.Text)) MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055)      TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then     TasaActual = TasaDiaBan Else     TasaActual = TasaDiaVzla End If MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco.Value = MontoBanesco txtBcoVenezuela.Value = MontoVzla txtTasaDiaria.Value = TasaActual End Sub   Como se puede apreciar InvBanesco ,  InvVzla , TasaCompra y TasaVenta, son valores que introduce el usuario a través de los respectivos cuadros de texto. Tengo los siguientes problemas: a. Las fórmulas no se ejecutan correctamente (pareciese que no reconociese los números entrados vía cuadros de texto). b. Al darle valor cero (0) a cualquiera de los valores de InvBanesco o  InvVzla, me genera un error en TasaDiaBan o TasaDiaVzla (según sea el caso), aunque, como se puede apreciar, debería generar un valor cero (0). Como dije en mi presentación estoy empezando en esto de la codificación...y quiero aprender de Uds! Agradezco su ayuda! Nota: lamentablemente el fichero es mas grande de lo permitido y no pude anexarlo.  
    • Hola buenas tardes. En una hoja plantilla donde realizo diferentes consultas de datos. tengo ya establecido dos formulas diferentes con función SI y buscar. estos buscan diferentes rangos de datos y recibendiferentes resultados. Cada formula varia según una palabra o numero  ejemplo si pongo Xl pone la formula 1 y si pongo cualquier numero entre 1 y 3 pone la segunda formula. Lo que necesito hacer es que si en una celda de la columna B3 pongo XL debería de considerar la formula 1 y si pusiera el numero 1 me pondría la segunda formula, dentro de la misma formula. Ya agregue la función SI($C3="Xl",Formula1.. Pero no me funciona, espero me puedan ayudar.   Muchas gracias Mariano   Formula doble si en celda existe.xlsx
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.