Saludos! tengo varios Text en donde el usuario puede o no ingresar un monto para la suma, pero como hago para que no error de que no coincidan los tipos cuando este no ingrese nada en los text
Muchas Gracias de antemano!!!
Saludos! tengo varios Text en donde el usuario puede o no ingresar un monto para la suma, pero como hago para que no error de que no coincidan los tipos cuando este no ingrese nada en los text
Muchas Gracias de antemano!!!
Lo que tienes que hacer es declarar tu variable donde vas a acumular la suma como un DOUBLE y hacer la suma normal. pero tienes que verificar que el TEXT.TEXT tenga valor
Ej:
if (Text1.Text <> "") Then
Total_Suma = Total_Suma + Text1.Text
endif
Nota: Yo te aconsejo que restrinjas el ingreso de datos en el textbox a solo mumericos esot lo haces asi:
Private Sub txtValor_KeyPress(KeyAscii As Integer)
If (((KeyAscii >= 48) And (KeyAscii <= 57)) Or (KeyAscii = 8) Or (KeyAscii = 46)) Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
End If
End Sub
Edited by: aegodoy
Hice lo que me recomendaste
Dim total_suma As Double
total_suma = CSng(Text12) + CSng(Text13(0).Text) + CSng(Text13(1).Text) + CSng(Text13(2).Text) + CSng(Text13(3).Text) + CSng(Text13(4).Text) + (Text13(5).Text) + CSng(Text13(6).Text) + CSng(Text13(7).Text) + CSng(Text21.Text)
Text11.Text = total_suma
Pero dejo un text en blanco y sigue saliendo el Error de '13' en tiempo de ejecucion no coinciden los tipos! por lo mismo que dejo el espacio vacio en el text ! alguna solucion para q esto no ocurra?
Gracias...
Edited by: Germany
No se si será un poco chapucero...
Por que no inicializas los text con un cero y k temeta solo los que va a cambiar, los demas tendran un 0.
O sino kuando le des al click pones:
if text1="" then
text1.text=0
end if
if textx.text="" thne
textx=0
end if
etc
****||/
******<#""#>
Prova con esto, que restringir el ingreso de los valores
Nota: Yo te aconsejo que restrinjas el ingreso de datos en el textbox a solo mumericos esot lo haces asi:
Private Sub txtValor_KeyPress(KeyAscii As Integer)
If (((KeyAscii >= 48) And (KeyAscii <= 57)) Or (KeyAscii = 8) Or (KeyAscii = 46)) Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
End If
End Sub
viendo tu codigo
total_suma = CSng(Text12) + CSng(Text13(0).Text)
encontre esto
al Text12 le hace falta el Text12.text
y la funcion Csng te convierte un valor a un sigle, que significa que si el usuario ingresa decimales no los tomará en cuenta. yo te revises la primera respuesta que te envie, pues le hice unas modificaciones y despues revisa la segunda respuesta...
===================
alvaro.godoy@cofal.com.gt
Guatemala, Guatemala
===================
Para hacer lo que dices se hace así:Iniciado por mahoni
Private Sub txtValor_KeyPress(KeyAscii As Integer)
If (((KeyAscii >= 48) And (KeyAscii <= 57)) Or (KeyAscii = 8) Or (KeyAscii = 46)) Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
End If
End Sub
Iniciado por mahoni
eso fue lo que hize al principio! pero cuando voy a imprimir va salir reflejado un 0 (en el campo de monto), si el concepto de la factura es muy largo y lo divido en dos text (cada uno tiene su text aparte para indicar dicho monto)
Mi humilde opinión:
La solución mas factible es la que te pone mahoni y si no quieres que salga un 0 al imprimir lo conviertes a cadena nula:
If Text1 = 0 Then Text1 = ""
En cuanto a lo que dice aegodoy: No es necesario poner la propiedad .Text :
a = Text1.Text dá el mismo valor que a = Text1
En cuanto a la conversión de tipos, sí estoy de acuerdo con él, deberías sustituir "CSng" por "CDbl".
Saludos
Aumentandole un poquito mas a esto, yo tenia el mismo problema, y curiosamente, si no ponia el .TEXT a los TextBox me saltaba un error, y solo se arreglaba poniendoles el .TEXT, por lo que tome como norma ponerselos invariablemente si el resultado sea el mismo si se ponen o no, ya que he notado que en algunas ocasiones se puede accesar al valor del TextBox sin poner el .TEXT y en otras ocasiones no.Iniciado por Anibal
Y asi aunque se ingresen valores nulos (es decir nada), la suma sale correcta, o al menos a mi me salio sin problemasEdited by: saiet
Veni, Vidi, Vici
Curioso (cosas del VB, supongo) yo nunca le pongo la propiedad .Text a los TextBox (al igual que .Caption a los Labels) y hasta el momento nohe tenido problemas.
Como digo, cosas del VB.
Saludos
Si, a mi tambien se me hace bastante raro, pero nada ni nadie esta exento de errores o problemas
Veni, Vidi, Vici
Dim total_suma As Double
total_suma = CSng(Text12) + CSng(Text13(0).Text) + CSng(Text13(1).Text) + CSng(Text13(2).Text) + CSng(Text13(3).Text) + CSng(Text13(4).Text) + (Text13(5).Text) + CSng(Text13(6).Text) + CSng(Text13(7).Text) + CSng(Text21.Text)
Text11.Text = total_suma
''''''''''''''''
Dos cosas con tu codigo...
1) Lo que esta restaltado en verde, no se si sea error al teclear...
2) Te extiendo "un poco" lo relativo a Doubles vs Singles que ya te comentaron (ojo: un Single si te maneja decimales) ...
Estas definiendo la variable total_suma como DOUBLE y estas obteniendo su resultado usando conversion de texto a SINGLE... Esto puededarte resultados indeseablessi se usan decimales en los TextBox.. Lo aconsejable es que mantengas uniformidad en las conversiones respecto al destino final (la variable que recibe el valor convertido). Si declaras total_suma como DOUBLE entonces deberias usar CDBL(TEXTzzz) en lugar de CSNG. Si vas a usar CSNG entonces declara total_suma como SINGLE.
Un ejemplo ... Se supone que el resultado obtenido en cada caso deberia ser 2.54, pero esto no siempre es asi... (en un proyecto nuevo, pega el codigo en Form_Load, ejecuta el proceso (F5)y observa la ventana de "ejecucion inmediata" (Ctrl-G) con los resultados de cada Debug.Print)
'''''''''''
Dim Valor1 As Single, Valor2 As Double
Valor1 = CSng("1.54") + CSng("1") ' 2.54
Debug.Print Valor1
Valor1 = CSng("1.54") + CDbl("1") ' 2.54
Debug.Print Valor1
Valor1 = CDbl("1.54") + CSng("1") ' 2.54
Debug.Print Valor1
Valor1 = CDbl("1.54") + CDbl("1") ' 2.54
Debug.Print Valor1
Valor2 = CSng("1.54") + CSng("1") ' 2.53999996185303
Debug.Print Valor2
Valor2 = CSng("1.54") + CDbl("1") ' 2.53999996185303
Debug.Print Valor2
Valor2 = CDbl("1.54") + CSng("1") ' 2.54
Debug.Print Valor2
Valor2 = CDbl("1.54") + CDbl("1") ' 2.54
Debug.Print Valor2
Valor1 = CSng("1.54")
Valor2 = Valor1 + CDbl("1") ' 2.53999996185303
Debug.Print Valor2
Valor2 = CDbl("1")
Valor2 = Valor1 + Valor2 ' 2.53999996185303
Debug.Print Valor2
Valor1 = 1.54
Valor2 = 1
Debug.Print Valor1
Debug.Print Valor2
Valor1 = Valor1 + Valor2 ' 2.54
Debug.Print Valor1
Valor1 = 1.54
Valor2 = 1
Valor2 = Valor1 + Valor2 ' 2.53999996185303
Debug.Print Valor2
Valor1 = 1.54
Valor2 = Valor1 ' 1.53999996185303
Debug.Print Valor2
''''''''''''
Cuando un DOUBLE recibe el valor de un SINGLE y este trae decimales, el resultado puede no ser el que esperas...
''''''''''''
Respecto a las soluciones que te brindan, todas aplican segun lo que requieras hacer...
El evento KeyPress para validar que solo introduzcan numeros y punto decimal deberias ponerlo en cada TextBox que uses... El codigo se extiende repetitivamente. Si usaras todos los TextBox como Matriz de controles, solo tendrias que usar un evento, pero no tienes tus TextBox de esta manera...
Si no usas este evento y solo validas posteriormente si el TextBox esta vacio o no para imprimir o hacer la suma, que pasa si el usuario introduce Letras en lugar de numeros? El TextBox no estaria vacio, pero igual te causaria errores ...
Y dado que tienes que hacer una instruccion bastante larga para obtener la suma, por que no modificar dicha instruccion usando, en lugar de CDbl o CSng, una funcion propia que te valide cada TextBox y te retorne el valor correcto, y de paso te corrija el valordel TextBox encaso de error?
Con estoteolvidarias de tenerque validar cada TextBox involucrado de forma repetitiva con sus eventos KeyPress, Validate, etc, a menos que debas validar alguna otra cosa, tal como que el valor este dentro de un rango determinado...
La funcion podria quedar asi (ponla en un modulo estandar para quepuedas usarla en cualquier parte de tu proyecto) ..
'''''''
Public Function CDoble( ByRef elTextBox As TextBox ) As Double
Dim cValor As String, nPos As Integer
Dim bNegativo As Boolean, bDecimal As Boolean
cValor = ""
For nPos = 1 To Len(elTextBox.Text)
If Mid(elTextBox.Text, nPos, 1) = "-" Then
bNegativo = True
ElseIf Mid(elTextBox.Text, nPos, 1) = "." Then
If Not bDecimal Then
cValor = cValor &"."
bDecimal = True
End If
ElseIf InStr(1, "0123456789", Mid(elTextBox.Text, nPos, 1)) > 0 Then
cValor = cValor & Mid(elTextBox.Text, nPos, 1)
End If
Next
If bNegativo Then cValor = "-"& cValor
elTextBox.Text = cValor
If IsNumeric(cValor) Then CDoble = CDbl( cValor )
End Function
''''''''''
Luego, tu codigo podria quedar asi ...
Dim total_suma As Double
total_suma = CDoble(Text12) + CDoble(Text13(0)) + CDoble(Text13(1)) + CDoble(Text13(2)) + CDoble(Text13(3)) + CDoble(Text13(4)) + CDoble(Text13(5)) + CDoble(Text13(6)) + CDoble(Text13(7)) + CDoble(Text21)
''''''''''
Saludos !
Amigo semper
Hice lo que me recomendastes! coloque el código en un modulo hice las modificaciones de mi CSng a CDoble y funciono a la hora de que no se produjera el error 13 , pero si yo ingreso 1.111,00 y le doy al botón calcular (teniendo los demás text vacios) arroja 1.11100 y si le sigo dando calcular sigue moviendo el punto!
Yo me atreveria a decir que que ese problemita que tienes con los valores tiene que ver con la configuración regional de tú máquina, especialmente en el area de la moneda...
Yo tuve un probelma similar por el tema de la configuracion, cuando el
numero decimal ingresado tiene tanto el separador decimal como el de
miles. Para verificar que es correcto, al momento de calcular, podes
fijarte que, de haber tanto un punto como una coma, el caracter que
corresponde a los decimales se encuentra a la derecha del que
corresponde a los miles y que aparezca una sola vez.
Hola Germany
Para evitar estos problemas con los textbox lo que debes sumar es el valor, de esa manera si tienes un text en 0 o alguien puso un caracter no lo tiene en cuenta:
ej:
Dim mi_suma As Double
mi_suma = val(text1(1)) + val(text1(2) + val(text1(3) + etc
Saludicimos
(te ayudo) * (me ayudas) =
mejor para todos
Aqui queda la versión corregida de la función CDoble() que les propuse anteriormente.
Corregida en cuanto a la autodetección del caracter que se esté usando como Punto Decimal, segun lo tengandefinido en su Configuración Regional.
Con esto se evita el problema comentado por Germany, derivado de que las cantidades que están alimentando en su proyecto usan la coma como punto decimal ...
Espero les sirva ...
Germany: Simplemente reemplaza el codigo en tu módulo con esta versión. Nos cuentas como funcionó ...
Saludos !
''''
Public Function CDoble(ByRef elTextBox As TextBox) As Double
Dim cValor As String, nPos As Integer
Dim bNegativo As Boolean, bDecimal As Boolean
Dim cSignoDec As String
cSignoDec = Mid(CStr(1000.01), 5, 1)
cValor = ""
For nPos = 1 To Len(elTextBox.Text)
If Mid(elTextBox.Text, nPos, 1) = "-" Then
bNegativo = True
ElseIf Mid(elTextBox.Text, nPos, 1) = cSignoDec Then
If Not bDecimal Then
cValor = cValor & cSignoDec
bDecimal = True
End If
ElseIf InStr(1, "0123456789", Mid(elTextBox.Text, nPos, 1)) > 0 Then
cValor = cValor & Mid(elTextBox.Text, nPos, 1)
End If
Next
If bNegativo Then cValor = "-" & cValor
elTextBox.Text = cValor
If IsNumeric(cValor) Then CDoble = CDbl(cValor)
End Function
''''''''
Pefecto amigo Semper!
ahora ya no rueda el punto !
Muchas gracias a todos por su ayuda ! se lo agradesco con todo el corazón !
besos, abrazos y cuidence mucho!