jueves, 13 de julio de 2023

74 - TEXTBOX (Parte 2) - Realizar cálculos y asignar formatos a otro tipo de controles.

 En el tema anterior aprendimos a controlar el tipo de caracteres que ingresamos en un control TextBox, con el fin de asignarle formatos moneda, números con decimales, y formatos especiales.

En este tema, veremos cómo realizar cálculos a medida que rellenamos una cierta cantidad de TextBox. Programaremos los eventos KEYPRESS y EXIT, guardando el acumulado en otro tipo de control, en este caso un LABEL.

También veremos cómo 'descontar' el valor que tiene un control a la hora de modificar su contenido. Y que esos cambios se reflejen en el total acumulado. Para esto trabajaremos con el evento ENTER de los TextBox.

En este ejemplo tenemos un formulario (Userform2) con 3 controles TextBox y un control Label donde guardaremos el acumulado.


En este ejemplo, incompleto, cada uno de los controles tendrá programados 2 eventos: 

- KEYPRESS para controlar que solo se ingresen valores numéricos, coma decimal y signo menos. También se puede optar por permitir el punto en caso de que ese sea el separador de decimales.

Desde Google encontramos gran cantidad de páginas que nos ofrecen la lista completa de caracteres Ascii necesarios para evaluar los caracteres que vamos tipeando en cada TextBox.

-EXIT para acumular el contenido de este control a un total que se va mostrando en un Label. Y a ese total, como así también al control de texto, se le asigna un formato moneda.

Por lo tanto cada control tendrá las siguientes 2 subrutinas, ajustando en cada grupo el nombre del TextBox.

Previamente declaramos una variable para ir guardando el acumulado.

Dim importe As Double     'guarda el acumulado como decimal.

 

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If (KeyAscii < 48 And KeyAscii <> 44 And KeyAscii <> 45) Or KeyAscii > 57 Then

    KeyAscii = 0

    MsgBox "Solo ingresa números, signo menos y coma decimal"

End If

End Sub


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If TextBox1 <> "" Then importe = importe + CDbl(TextBox1.Value)

    Label2.Caption = Format(importe, "$ #,###,##0.00")

    TextBox1 = Format(TextBox1.Value, "$ #,###,##0.00")

End Sub

NOTA: para que se reconozca como un valor doble, es decir decimal, debemos convertir el contenido del TextBox con la función CDBL.

Pero este ejemplo no nos dará resultados correctos en caso de que modifiquemos alguna cifra, porque estaría sumando nuevamente el valor del control al momento de salir de él.

Por lo tanto necesitamos controlar, además, el evento ENTER. Allí guardaremos en una nueva variable el contenido del TextBox al momento de ingresar a él. Y al salir, en el evento Exit restaremos ese valor y acumularemos el nuevo importe.

Dim valorx As Double

 

Private Sub TextBox1_Enter()   'al ingresar al control se guarda el contenido para luego descontarlo

If TextBox1 <> "" Then valorx = CDbl(TextBox1.Value)

End Sub

Ahora sí ya tendremos todo el código necesario: las 2 variables 'double' y los 3 eventos para cada uno de los TextBox.

Como al salir de cada TextBox debemos realizar varias tareas, y serán las mismas para cada control, podemos agruparlas en una subrutina auxiliar. A esa subrutina solo necesitaremos pasarle como argumento el nombre del TextBox utilizado.

Por lo tanto vamos a reemplazar el evento Exit anterior por este otro. Y será igual en todos los controles.

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)  'al salir se acumula y se aplica formato

    Call calcular("TextBox1")

End Sub


Solo nos resta agregar la subrutina llamada 'calcular', en el mismo Userform.

Sub calcular(miCtrl)

'evaluamos entre todos los controles del Userform, el que se llame como el argumento miCtrl.

If Me.Controls(miCtrl).Value <> "" Then

   'si el textbox tiene un importe se acumula al total y se resta el valor que tenía al momento de ingresar en él

  importe = importe + CDbl(Me.Controls(miCtrl).Value) - valorx

Else

  'si el textbox quedó vacío solo se resta el valor que tenía al momento de entrar en él.

  importe = importe - valorx

End If

'se coloca el acumulado en el Label y se asigna formato moneda

Label2.Caption = Format(importe, "$ #,###,##0.00")

'también se coloca formato al textbox que llamó a esta subrutina.

Me.Controls(miCtrl) = Format(Me.Controls(miCtrl), "$ #,###,##0.00")

'se limpia la variable auxiliar

valorx = 0

End Sub



Ver video Nº 74 desde aquí.


El libro con los ejemplos presentados en videos 73 y 74 se puede descargar desde este enlace. O solicitarlo a mi correo: cibersoft.arg@gmail.com