Jump to content

Duda sobre condicion booleana


Recommended Posts

Posted

Hola,

Tengo una duda a la hora de evaluar una expresión booleana, siempre para saber si es verdadero o falso, directamente pongo (if Variable) a secas, sin =, pero sin querer le puse = True y no entraba en la condición, tras quitarle el true ya entraba. Sé que el valor verdadero de un boolean es -1, pero entonces, ¿por que cuando pones (if NumeroInteger) sin =, cuando NumeroInteger<>-1 & <>0, lo toma como -1? ¿Sabéis qué tipo de conversión ha realizado por sí sola la función IF? y en caso de "Si", ¿Podríais indicarme cual es esta función de conversión booleana?

Sub PruebasBoolean()
Dim VarInteger As Integer
VarInteger = 100
If VarInteger Then MsgBox "La expresión es evaluada como true"
If VarInteger = True Then MsgBox "Nunca se cumple la condición"
VarInteger = -1
If VarInteger = True Then MsgBox "Se cumple la condición"
End Sub[/CODE]

Saludos.

Posted

Hola verzulsan

A ver si esto te ayuda:.

Sub a()
Dim Valor As Integer

'Sin el operador =
Valor = -1
If Valor Then MsgBox Valor & " es true"
Valor = 0
If Not Valor Then MsgBox Valor & " es false"
'Si la variable es integer los numeros diferentes a 0 son interpretados como true y como false
Valor = 100
If Valor Then MsgBox Valor & " es true"
If Not Valor Then MsgBox Valor & " es false"

'Con el operador =
Valor = -1
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"

Valor = 0
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"

'Si la variable es integer los numeros diferentes a 0 no son interpretados como true ni como false
Valor = 100
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"


End Sub
Sub b()
Dim Valor As Boolean

'Sin el operador =
Valor = -1
If Valor Then MsgBox Valor & " es true"
Valor = 0
If Not Valor Then MsgBox Valor & " es false"
'Si la variable es boolean los numeros diferentes a 0 son interpretados como true
Valor = 100
If Valor Then MsgBox Valor & " es true"
If Not Valor Then MsgBox Valor & " es false"


'Con el operador =
Valor = -1
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"

Valor = 0
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"

'Si la variable es boolean los numeros diferentes a 0 son interpretados como true
Valor = 100
If Valor = True Then MsgBox Valor & " es true"
If Valor = False Then MsgBox Valor & " es false"
End Sub

[/CODE]

Posted

Hola Ama,

Agradezco tu ayuda, pero el código que has expuesto (he leído cada línea) son los hechos que expongo en el mensaje, ya había hecho todas esas pruebas y se cómo se comporta (perdón por haberme explicado mal), pero la pregunta no era esa; Cuando invocas un IF, ¿Cuál es el nombre de la función que usa este condicional para determinar si (un Integer, Cadena, etc) es True o False? Me gustaría poder llamar yo mismo a esa función y no dejarlo todo en manos del IF.

Espero haberme explicado mejor.

Un saludo.

Posted

hola santi, ama.

mis dos centavos sobre el tema:

Los valores true y false son, correspondientemente, integers con valores -1 y 0 (eso esta claro en la documentación de Microsoft. Por lo tanto 100 <> -1 (100 <> True). Prueba debug.print cint(True).

?-1 = True

True

?100 = True

False

Por otro lado, cualquier valor distinto de 0 es interpretado como verdadero, por lo tanto 100 ó 101 ó 436 es evaluado como True

?cbool(-1)

True

?cbool(100)

True

pero no como la palabra clave True de VBA que es evaluada como -1

?cint(cbool(100))

-1

Así que aunque 100 es evaluado como verdadero cbool(100), 100 no es igual al valor de True cint(true), que es -1.

Ya que no puedes comparar un integer ?typename(100) con un boolean ?typename(true), lo que debe hacer VBA internamente es convertir true a su valor correspondiete -1 para luego compararlos, algo como if 100 <> cint(true).

Lo recomendamble, digo yo :), sería usar simplemente if 100 then, ya que como lo documenta microsoft cualquier valor distinto de 0 será evaluado como verdadero y no habrá que hacer más comprobaciones. Quizás se pueda ser más explicito y usar if cbool(100) then, pero creo que esto no hace sino adicionar trabajo adicional al interprete convirtiendo el valor 100 a True (ó -1). Finalmente, y lo menos recomendable, sería usar if cbool(100) = True then, pero al fin de cuentas son dos pasos adicionales innecesarios: convertir el integer 100 a boolean (True ó -1) para luego compararlo con el valor True (ó -1) de VBA.

Ten en cuenta que una cosa es que if 100 then sea evaluado como verdadero y otra cosa es la palabra clave True de VBA que corresponde al valor -1, que al ser distinto de 0 es evaluado como true (jaja, un poco confuso, lo que hay que tener en cuenta es que True no es más que una palabra clave que usa sólo uno (el -1) de todos los valores que pueden ser evaluados como verdaderos (todos los valores distintos a 0) para representar el valor de verdadero.

Posted

.

.

Hola Santi, Mauricio, Ama,...:

Por las pruebas que he hecho, aunque no lo he visto escrito en ningún sitio.

If Variable Then equivale a If Not Variable = Empty Then

El valor de Empty viene determinado por el tipo de variable.

Cero(0) para variables numéricas (Integer, Long, ...)

Vacio("") para variables de cadena (String, Variant, ...)

False para variables boleanas (Boolean)

O sea, el valor que tiene por defecto la variable al iniciar el procedimiento, objeto, formulario,....

.

.

Sed buenos

Posted

?cbool(-1)

True

?cbool(100)

True

cbool ¡¡Gracias!!! Creí que nunca la encontraría, era justo la función que buscaba jajaja, ahora me siento tonto por la pregunta ya que a menudo uso CStr, CInt, CChar y CLng, y no caí en que era lo mismo para bool.

lo menos recomendable, sería usar if cbool(100) = True then, pero al fin de cuentas son dos pasos adicionales innecesarios

Un consejo útil que todo programador debería seguir.

If Not Variable = Empty Then

El valor de Empty viene determinado por el tipo de variable.

Rebuscao pero molón xD, esta la he usado mucho pero solo con objetos, no me había percatado que Empty hacia un CAST al tipo de variable.

Saludos a los 3 y Tema zanjado por mi parte.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy