Como sumar varios Textbox en tiempo real sin errores

Comunidad de Expertos... Nuevamente estoy molestando...

Tengo un Textbox_Cant y lo multiplico con el Label_Und en el Txt_Neto, con una formula que me permite sumar en tiempo real hacia el Txt_TotalNeto.

Esto lo repito en 20 Textbox.

.- Así empiezo con mi formula;

Private Sub Txt_Neto_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Txt_Neto = Me.Txt_Cant * Me.Label_Und
Me.Txt_Neto.Text = Format(Txt_Neto, "$ ###,0")
Txt_TotalNeto = CDbl(Txt_Neto)
End Sub

.- Así termino mi formula;

Private Sub Txt_Neto20_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Txt_Neto20 = Me.Txt_Cant20 * Me.Label_Und20
Me.Txt_Neto20.Text = Format(Txt_Neto20, "$ ###,0")
Txt_TotalNeto.Value = CDbl(Txt_Neto) + CDbl(Txt_Neto2) + CDbl(Txt_Neto3) + CDbl(Txt_Neto4) + CDbl(Txt_Neto5) + CDbl(Txt_Neto6) + CDbl(Txt_Neto7) + CDbl(Txt_Neto8) + CDbl(Txt_Neto9) + CDbl(Txt_Neto10) + CDbl(Txt_Neto11) + CDbl(Txt_Neto12) + CDbl(Txt_Neto13) + CDbl(Txt_Neto14) + CDbl(Txt_Neto15) + CDbl(Txt_Neto16) + CDbl(Txt_Neto17) + CDbl(Txt_Neto18) + CDbl(Txt_Neto19) + CDbl(Txt_Neto20)
Txt_Dias.SetFocus
End Sub

Todo bien hasta este punto... Pero si quiero corregir un dato en cualquier Textbox Cantidad, la suma se pierde dejándome solo el resultado que cambie y debo recorrer todos mis Textbox para que realice la formula de sumar todos los Textbox en tiempo real. No logro encontrar una formula que me permita corregir un cambio y se refleje automáticamente en mi suma de tiempo real.

Respuesta
1

Me imagino que hay varias formas de hacerlo, pero respetando tu código, yo haría el siguiente procedimiento

Sub subTotalNeto()
    Txt_TotalNeto.Value = CDbl(0 & Txt_Neto) + CDbl(0 & Txt_Neto2) + _
                          CDbl(0 & Txt_Neto3) + CDbl(0 & Txt_Neto4) + _
                          CDbl(0 & Txt_Neto5) + CDbl(0 & Txt_Neto6) + _
                          CDbl(0 & Txt_Neto7) + CDbl(0 & Txt_Neto8) + _
                          CDbl(0 & Txt_Neto9) + CDbl(0 & Txt_Neto10) + _
                          CDbl(0 & Txt_Neto11) + CDbl(0 & Txt_Neto12) + _
                          CDbl(0 & Txt_Neto13) + CDbl(0 & Txt_Neto14) + _
                          CDbl(0 & Txt_Neto15) + CDbl(0 & Txt_Neto16) + _
                          CDbl(0 & Txt_Neto17) + CDbl(0 & Txt_Neto18) + _
                          CDbl(0 & Txt_Neto19) + CDbl(0 & Txt_Neto20)
End Sub

Entonces, en cada evento, en lugar de llamar a
Txt_TotalNeto = CDbl(Txt_Neto) + CDbl(Txt_Neto2) ... etc

Lo que haría seria llamar al procedimiento

subTotalNeto

También reemplazaría el evento Key_Up por el evento Exit, entonces, para el caso del evento Txt_Neto20, quedaría asi (esto se replica para cada Txt_Neto...

Private Sub Txt_Neto20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Txt_Neto20 = Me.Txt_Cant20 * Me.Label_Und20
    Me.Txt_Neto20.Text = Format(Txt_Neto20, "$ ###,0")
    subTotalNeto
    Txt_Dias.SetFocus
End Sub

S@lu2

Hola Isaac... gracias por tu respuesta... lo puse en practica pero me envía un error...

Lo prove con la función Exit y KeyUp y pasa lo mismo, arrojándome la formula:

No se que puede estar generando el error... estoy aprendiendo...

Gracias...

Hagamos lo siguiente:

Modifiquemos un poco subTotalNeto para poder ver lo que está pasando

Sub subTotalNeto()
'ESTA ES UNA LINEA DE CODIGO TEMPORAL'
On Error Resume Next          
    Txt_TotalNeto.Value = CDbl(0 & Txt_Neto) + CDbl(0 & Txt_Neto2) + _
                          CDbl(0 & Txt_Neto3) + CDbl(0 & Txt_Neto4) + _
                          CDbl(0 & Txt_Neto5) + CDbl(0 & Txt_Neto6) + _
                          CDbl(0 & Txt_Neto7) + CDbl(0 & Txt_Neto8) + _
                          CDbl(0 & Txt_Neto9) + CDbl(0 & Txt_Neto10) + _
                          CDbl(0 & Txt_Neto11) + CDbl(0 & Txt_Neto12) + _
                          CDbl(0 & Txt_Neto13) + CDbl(0 & Txt_Neto14) + _
                          CDbl(0 & Txt_Neto15) + CDbl(0 & Txt_Neto16) + _
                          CDbl(0 & Txt_Neto17) + CDbl(0 & Txt_Neto18) + _
                          CDbl(0 & Txt_Neto19) + CDbl(0 & Txt_Neto20)
'ESTAS LINEAS DE CODIGO SON TEMPORALES'
    If Err.Number <> 0 Then
        MsgBox "T:" & Txt_Neto & ", T2:" & Txt_Neto2 & _
           ", T3:" & Txt_Neto3 & ", T4:" & Txt_Neto4 & _
           ", T5:" & Txt_Neto5 & ", T6:" & Txt_Neto6 & _
           ", T7:" & Txt_Neto7 & ", T8:" & Txt_Neto8 & _
           ", T9:" & Txt_Neto9 & ", T10:" & Txt_Neto10 & _
           ", T11:" & Txt_Neto11 & ", T12:" & Txt_Neto12 & _
           ", T13:" & Txt_Neto13 & ", T14:" & Txt_Neto14 & _
           ", T15:" & Txt_Neto15 & ", T16:" & Txt_Neto16 & _
           ", T17:" & Txt_Neto17 & ", T18:" & Txt_Neto18 & _
           ", T19:" & Txt_Neto19 & ", T20:" & Txt_Neto20
    End If
End Sub

Esto te enviará un mensaje cuando ocurra el error.

Sube la imagen para ver el mensaje que te envía.

S@lu2

Hola Isaac... estuve fuera estos días y hoy pude retomar el proyecto..

Realice las pruebas y me arroja lo siguiente;

 Al dar aceptar me permite seguir

Y no muestra nada en la casilla Total Neto...

Saludos... y muchas gracias...

Perfecto!

Habrá que encontrar la forma de quitar el signo $ y el espacio que acompaña a cada número antes de hacer la suma ¿Te imaginas cómo?

Ahora, si es posible no poner el signo $ a los cuadros de texto para que conserven sólo el número, mejor todavía.

Me comentas.

S@lu2

Perfecto Isaac... funciona perfectamente, le quite el formato de Moneda y el espacio que tenia y corre sin problema... el único detalle es como dejo el valor multiplicado en el formato de moneda???

Así deje el formato: Me.Txt_Neto.Text = Format(Txt_Neto, "###,0")

Y el que tenia era: Me.Txt_Neto.Text = Format(Txt_Neto, "$ ###,0")

Gracias...

Podemos hacer algo, que puede ser raro, pero resulta.

Todos los objetos en VB tienen una variable del tipo Variant llamada Tag, es una varible que no tiene un uso definido, por lo que la podemos usar para nuestros fines, de la siguiente manera:

Al momento de realizar la asignación, dejamos tu campo de texto con el formato de moneda, pero antes de darle ese formato, guardamos una copia del número sin formato en la variabe Tag del objeto, entonces quedaría así:

Private Sub Txt_Neto20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Txt_Neto20 = Me.Txt_Cant20 * Me.Label_Und20
    'Esta es la líne en que realizamos la asignación'
    Txt_Neto20.Tag = Txt_Neto20.Text
    ''''''''''''
    Me.Txt_Neto20.Text = Format(Txt_Neto20, "$ ###,0")
    subTotalNeto
    Txt_Dias.SetFocus
End Sub

Entonces, el subTotalNeto quedaría así:

Sub subTotalNeto()        
    Txt_TotalNeto.Value = CDbl(0 & Txt_Neto.Tag) + CDbl(0 & Txt_Neto2.Tag) + _
                          CDbl(0 & Txt_Neto3.Tag) + CDbl(0 & Txt_Neto4.Tag) + _
                          CDbl(0 & Txt_Neto5.Tag) + CDbl(0 & Txt_Neto6.Tag) + _
                          CDbl(0 & Txt_Neto7.Tag) + CDbl(0 & Txt_Neto8.Tag) + _
                          CDbl(0 & Txt_Neto9.Tag) + CDbl(0 & Txt_Neto10.Tag) + _
                          CDbl(0 & Txt_Neto11.Tag) + CDbl(0 & Txt_Neto12.Tag) + _
                          CDbl(0 & Txt_Neto13.Tag) + CDbl(0 & Txt_Neto14.Tag) + _
                          CDbl(0 & Txt_Neto15.Tag) + CDbl(0 & Txt_Neto16.Tag) + _
                          CDbl(0 & Txt_Neto17.Tag) + CDbl(0 & Txt_Neto18.Tag) + _
                          CDbl(0 & Txt_Neto19.Tag) + CDbl(0 & Txt_Neto20.Tag)
End Sub

Esto debiera resultar sin problemas.

Aprovecho de explicarte la asignación de cada TextBox.

La asignación la hago de esta forma

CDbl(0 & Txt_Neto.Tag)

¿Por qué CDbl? CDbl convierte el valor, en este caso, de String a Double. Si VBA detecta String + String, lo que hará será concatenar en lugar de sumar y la propiedad Text es del tipo String por lo tanto Tag quedaría como String.

¿Por qué el 0 &? Lo que hacemos aquí es concatenar un 0 al contenido de cada textbox, de tal forma que si el contenido es vacío, entonces la concatenación nos dará un 0 y CDbl no nos retornará un error.

S@lu2

¡Gracias! Isaac... un genio... resulto a la perfección... muchas pero muchas gracias por tu tiempo y conocimientos...

Un abrazo y mis sinceros agradecimientos por tu ayuda...

Estimado Isaac... perdona que moleste... sigo con mi proyecto y me encontré con un detalle en el comando para guardar mis datos y limpiar mi formulario. Lo que programe funciona a la perfección para guardar, pero cuando se ejecuta debería mostrarme en el FORM un Folio correlativo pero no me muestra nada, pero si lo cierro y lo abro de nuevo si lo muestra.

Este es mi código que utilizo para Guardar;

Private Sub Guardar_Click()
Dim fila As Integer
Dim final As Integer
Dim Registro As Integer
Sheets("Cotizaciones").Visible = True
Sheets("Cotizaciones").Select
        For fila = 1 To 30000
            If Hoja6.Cells(fila, 1) = "" Then
                final = fila
                Exit For
            End If
        Next
        For Registro = 2 To final
            If Hoja6.Cells(Registro, 1) = Me.Label_Folio Then
                Exit Sub
                Exit For
            End If
        Next
            Hoja6.Cells(final, 1) = Me.Label_Folio
            Hoja6.Cells(final, 2) = Me.Cbo_RutCliente
            Hoja6.Cells(final, 3) = Me.Label_Fecha
            Hoja6.Cells(final, 4) = Me.Label_Codigo
            Hoja6.Cells(final, 5) = Me.Label_Und
            Hoja6.Cells(final, 6) = Me.Txt_Cant
            Hoja6.Cells(final, 7) = Me.Txt_Neto
            Hoja6.Cells(final, 8) = Me.Label_Codigo2
            Hoja6.Cells(final, 9) = Me.Label_Und2
            Hoja6.Cells(final, 10) = Me.Txt_Cant2
            Hoja6.Cells(final, 11) = Me.Txt_Neto2
            Hoja6.Cells(final, 12) = Me.Label_Codigo3
            Hoja6.Cells(final, 13) = Me.Label_Und3
            Hoja6.Cells(final, 14) = Me.Txt_Cant3
            Hoja6.Cells(final, 15) = Me.Txt_Neto3
            Hoja6.Cells(final, 16) = Me.Label_Codigo4
            Hoja6.Cells(final, 17) = Me.Label_Und4
            Hoja6.Cells(final, 18) = Me.Txt_Cant4
            Hoja6.Cells(final, 19) = Me.Txt_Neto4
            Hoja6.Cells(final, 20) = Me.Label_Codigo5
            Hoja6.Cells(final, 21) = Me.Label_Und5
            Hoja6.Cells(final, 22) = Me.Txt_Cant5
            Hoja6.Cells(final, 23) = Me.Txt_Neto5
            Hoja6.Cells(final, 24) = Me.Label_Codigo6
            Hoja6.Cells(final, 25) = Me.Label_Und6
            Hoja6.Cells(final, 26) = Me.Txt_Cant6
            Hoja6.Cells(final, 27) = Me.Txt_Neto6
            Hoja6.Cells(final, 28) = Me.Label_Codigo7
            Hoja6.Cells(final, 29) = Me.Label_Und7
            Hoja6.Cells(final, 30) = Me.Txt_Cant7
            Hoja6.Cells(final, 31) = Me.Txt_Neto7
            Hoja6.Cells(final, 32) = Me.Label_Codigo8
            Hoja6.Cells(final, 33) = Me.Label_Und8
            Hoja6.Cells(final, 34) = Me.Txt_Cant8
            Hoja6.Cells(final, 35) = Me.Txt_Neto8
            Hoja6.Cells(final, 36) = Me.Label_Codigo9
            Hoja6.Cells(final, 37) = Me.Label_Und9
            Hoja6.Cells(final, 38) = Me.Txt_Cant9
            Hoja6.Cells(final, 39) = Me.Txt_Neto9
            Hoja6.Cells(final, 40) = Me.Label_Codigo10
            Hoja6.Cells(final, 41) = Me.Label_Und10
            Hoja6.Cells(final, 42) = Me.Txt_Cant10
            Hoja6.Cells(final, 43) = Me.Txt_Neto10
            Hoja6.Cells(final, 44) = Me.Label_Codigo11
            Hoja6.Cells(final, 45) = Me.Label_Und11
            Hoja6.Cells(final, 46) = Me.Txt_Cant11
            Hoja6.Cells(final, 47) = Me.Txt_Neto11
            Hoja6.Cells(final, 48) = Me.Label_Codigo12
            Hoja6.Cells(final, 49) = Me.Label_Und12
            Hoja6.Cells(final, 50) = Me.Txt_Cant12
            Hoja6.Cells(final, 51) = Me.Txt_Neto12
            Hoja6.Cells(final, 52) = Me.Label_Codigo13
            Hoja6.Cells(final, 53) = Me.Label_Und13
            Hoja6.Cells(final, 54) = Me.Txt_Cant13
            Hoja6.Cells(final, 55) = Me.Txt_Neto13
            Hoja6.Cells(final, 56) = Me.Label_Codigo14
            Hoja6.Cells(final, 57) = Me.Label_Und14
            Hoja6.Cells(final, 58) = Me.Txt_Cant14
            Hoja6.Cells(final, 59) = Me.Txt_Neto14
            Hoja6.Cells(final, 60) = Me.Label_Codigo15
            Hoja6.Cells(final, 61) = Me.Label_Und15
            Hoja6.Cells(final, 62) = Me.Txt_Cant15
            Hoja6.Cells(final, 63) = Me.Txt_Neto15
            Hoja6.Cells(final, 64) = Me.Label_Codigo16
            Hoja6.Cells(final, 65) = Me.Label_Und16
            Hoja6.Cells(final, 66) = Me.Txt_Cant16
            Hoja6.Cells(final, 67) = Me.Txt_Neto16
            Hoja6.Cells(final, 68) = Me.Label_Codigo17
            Hoja6.Cells(final, 69) = Me.Label_Und17
            Hoja6.Cells(final, 70) = Me.Txt_Cant17
            Hoja6.Cells(final, 71) = Me.Txt_Neto17
            Hoja6.Cells(final, 72) = Me.Label_Codigo18
            Hoja6.Cells(final, 73) = Me.Label_Und18
            Hoja6.Cells(final, 74) = Me.Txt_Cant18
            Hoja6.Cells(final, 75) = Me.Txt_Neto18
            Hoja6.Cells(final, 76) = Me.Label_Codigo19
            Hoja6.Cells(final, 77) = Me.Label_Und19
            Hoja6.Cells(final, 78) = Me.Txt_Cant19
            Hoja6.Cells(final, 79) = Me.Txt_Neto19
            Hoja6.Cells(final, 80) = Me.Label_Codigo20
            Hoja6.Cells(final, 81) = Me.Label_Und20
            Hoja6.Cells(final, 82) = Me.Txt_Cant20
            Hoja6.Cells(final, 83) = Me.Txt_Neto20
            Hoja6.Cells(final, 84) = Me.Txt_Dias
            Hoja6.Cells(final, 85) = Me.Txt_Descuento
            Hoja6.Cells(final, 86) = Me.Txt_TotalNeto
            Hoja6.Cells(final, 87) = Me.Txt_IVA
            Hoja6.Cells(final, 88) = Me.Txt_Total
 'ESTO DATOS DE LIMPIEZA ESTA RESUMIDO, DESPUES AGREGO LO FALTANTE'
Me.EnableEvents = False
Label_Folio = ""
Cbo_RutCliente = ""
Cbo_Departamento = ""
Cbo_Producto = ""
Label_Codigo = ""
Label_Stock = ""
Label_Und = ""
Txt_Cant = ""
Txt_Neto = ""
Txt_Dias = ""
Txt_Descuento = ""
Txt_TotalNeto = ""
Txt_IVA = ""
Txt_Total = ""
Me.EnableEvents = True
'ESTE ES EL COMANDO QUE UTILIZO PARA GENERAR EL FOLIO CORRELATIVO, TAMBIEN LO TENGO EN EL FORM Initialize'
    Set h1 = Sheets("Cotizaciones")
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    Txt_Folio = h1.Range("A" & u) + 1
    Range("B42:E42,G42").Select
    Range("G42").Activate
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
Cbo_RutCliente.SetFocus
End Sub

Podrías ayudarme por favor... en que estoy errado...

Gracias...

H0la hacandiam.

Para un tema distinto, una pregunta distinta, así se ordenan los temas para que otros usuarios tengan la oportunidad de encontrar tu pregunta en caso de que les suceda algo parecido.

Respecto a tu pregunta, tengo sospechas de este evento ¿qué contiene?

Cbo_RutCliente.SetFocus

Dime si estoy equivocado, pero no encuentro txt_folio en tu código, más bien encuentro label_folio.

Dime si estoy en lo cierto, porque si es así, ahí está el error.

S@lu2

Hola Isaac... perdón a la demora en esta preguntas, no estabas equivocado, era yo quien cometió el error de tipeo y el cbo_rutclientes.setfocus lo asigne para que cuando guarde los datos el cursor se coloque automáticamente ahí para buscar otros datos...

Muchas gracias... por tu ayuda...

Me alegro que hayas resuelt tu problema.

S@lu2

1 respuesta más de otro experto

Respuesta
1

Tenias razón yo me equivoque en tipear, corregí el texto y funciono sin problemas...

Muchas gracias por su atención y tendré en cuenta lo mencionado para futuras consultas...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas