Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

iif Loco Sabran Por que?

Estas en el tema de iif Loco Sabran Por que? en el foro de Visual Basic clásico en Foros del Web. Buenas Tardes me ha surgido una duda sobre el iif, por un error que me da que no me debiera de dar segun yo... Ok ...
  #1 (permalink)  
Antiguo 12/10/2010, 10:24
Avatar de hugo180486  
Fecha de Ingreso: septiembre-2007
Mensajes: 199
Antigüedad: 17 años, 2 meses
Puntos: 3
iif Loco Sabran Por que?

Buenas Tardes me ha surgido una duda sobre el iif, por un error que me da que no me debiera de dar segun yo...

Ok aclaro esto me sucedion en VBA (En Excel 2003) no en VB no lo eh probado, pero como son muy similares pienso que pasaria igual de todos modos luego me sercioro...

Sintaxis de iif: iif(Expresion, TruePart, FalsePart)

Estamos deacuerdo que cuando hacemos esto dValor = 0/0 Nos tira un error de Overflow verdad?, bueno ahora explico lo que sucede

Código vb:
Ver original
  1. Dim dValor as double
  2.  
  3. dValor = 5
  4.  
  5. dValor = iif(dValor = 5, 0/0, 5/5)
  6. '// Si hicieramos esto es claro que nos tiraria el error de overflow...
  7.  
  8. dvalor = iif(Not dValor = 5, 0/0, 5/5)
  9. '// A esto es lo que  me refiero, que independientemente que la division 0/0 este
  10. '// en TruePart o FalsePart, de todos modos me tira el error de Overflow, como que
  11. '// el Visual Basic no deja hacer este tipo de operacion (0/0) dentro de un iif,
  12. '// Independientemente de que se haga o no se haga...

Espero no ser el unico que le pase, alguien sabe en realidad por que sucede esto?, no se alguna explicacion como por ejemplo que cuando se evaluan opercaiones dentro del iif las 2 se hacen, y solo se presenta el resultado final, el de la TruePart o FalsePart...

Espero que alguien sepa lo que sucede en realidad, Gracias de antemano....

Saludos....
  #2 (permalink)  
Antiguo 13/10/2010, 03:34
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: iif Loco Sabran Por que?

Solo tienes que asegurarte de que el divisor nunca va a ser <=0 antes de entrar al iif, ya que las operaciones internas se van a efectuar todas antes de tomar una decision.

if b>0 then
iif (not(dvalor=5), 5/5, a/b)
else
msgbox "valor no admitido"
end if

Es igual que si haces un if con varias comparaciones. Si una de ellas da overflow, no importa que sea la primera o la ultima, se genera el error:

if 5>0 or 3/0>=0 then ...

esto genera error, aunque en teoria la primera comparacion devuelve true y la segunda no deberia intentar calcularse por ser su resultado en este caso intrascendente.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 13/10/2010, 10:14
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 15 años, 1 mes
Puntos: 47
Respuesta: iif Loco Sabran Por que?

Yo tengo otra pregunta... por qué quieres dividir entre cero en primer lugar? si tienes cero manzanas y la vas a dividir entre cero personas.. ???? entonces??? cual es el objeto de realizar la division si no se tiene nada???

...Como dice pkj... asegúrate de no dividir entre cero y no tendrás problemas, no solo en programación
  #4 (permalink)  
Antiguo 13/10/2010, 11:02
Avatar de hugo180486  
Fecha de Ingreso: septiembre-2007
Mensajes: 199
Antigüedad: 17 años, 2 meses
Puntos: 3
Respuesta: iif Loco Sabran Por que?

--------------------------------------------------------------------------------
Solo tienes que asegurarte de que el divisor nunca va a ser <=0 antes de entrar al iif, ya que las operaciones internas se van a efectuar todas antes de tomar una decision.

Gracias pkg algo asi me imaginaba pero queri serciorarme con gente mas experimentada que yo Gracias...

Si se que no tiene caso dividir entre cero no tiene caso lo se, buscaba la respuesta del por que me tiraba error que aunque sospechaba no tenia la certeza de que era lo que sucedia, me refiero a "ya que las operaciones internas se van a efectuar todas antes de tomar una decision."

Código vb:
Ver original
  1. '// Yo solo queria sacar un porcentaje para que no me tire error hago esto
  2. '// Asi lo hago
  3.        If dCom = 0 Then
  4.             dPorc = 0
  5.         Else
  6.             dPorc = ((dMod - dCom) / dCom * dSalCom
  7.         End If
  8.  
  9. '// Buscaba reducirlo a una sola linea....
  10. '// Segun yo me debiera de funcioonar pero ahora se esto"ya que las
  11. '// operaciones internas se van a efectuar todas antes de tomar una  decision."
  12. '// Era mi duda curisosa.....
  13.        dPorc = iif(dCom = 0,0,((dMod - dCom) / dCom * dSalCom)

Gracias pkg por dedicarte a contestarme lo que preguntaba, y no responderme ocn respuestas para que haces eso, no tiene caso, etc...

Hasta pronto...
  #5 (permalink)  
Antiguo 13/10/2010, 11:33
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 15 años, 1 mes
Puntos: 47
Respuesta: iif Loco Sabran Por que?

...Mis disculpas públicamente por mis comentarios...
  #6 (permalink)  
Antiguo 13/10/2010, 12:20
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 18 años, 3 meses
Puntos: 29
Respuesta: iif Loco Sabran Por que?

No te aflijas, lokoman, a primera vista es lo que hemos pensado la mayoría ¿para que poner 5/5 o 0/0?

Y hugo, siempre es un placer ayudar con estas cosas, aunque tampoco quiero que nadie piense que mi palabra es ley. Soy auto-didacta, y muchas cosas como esta las he deducido por propia experiencia, de modo que tampoco debería haber parecido tan seguro en mi respuesta.
De hecho, el divisor puede ser un valor negativo sin que aparezcan errores y yo te he dicho que debias comprobar que no fuese <=0, con lo que ya he metido la pezuña

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Etiquetas: loco
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:55.