If statement not catching on conditions

  • Thread starter Thread starter cmdolcet69
  • Start date Start date
C

cmdolcet69

I have the below if statement, that should catch if any of the
conditions are met.....however for some reasons if my
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =1 it will not exit the program??? Why is that can
anyone help me

Urgent!!!!!!



If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2 And
Not muxClass.COM1Active = 1 Then
Exit Sub
End If
 
cmdolcet69 said:
I have the below if statement, that should catch if any of the
conditions are met.....however for some reasons if my
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =1 it will not exit the program??? Why is that can
anyone help me

Urgent!!!!!!



If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2 And
Not muxClass.COM1Active = 1 Then
Exit Sub
End If

Any = Or
All = And

your statement wants all the conditions to be met before the exit will
occur.

LS
 
Did you want an OR connector instead of AND?
You said: should catch if ANY of the conditions are met

Would
If (not boolDSIFlushGapReading) OR (muxClass.DSIValues.Count < 2) OR
(muxClass.COM1Active <> 1) Then

do it?
 
I have the below if statement, that should catch if any of the
conditions are met.....however for some reasons if my
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =1 it will not exit the program??? Why is that can
anyone help me

Urgent!!!!!!



If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2 And
Not muxClass.COM1Active = 1 Then
Exit Sub
End If

Your statement says to execut the Exit Sub only if all three
conditions are met. In your example the first one is not met and the
other two are.

Apparently you want Or instead of And. An Or test is true if either
item is true, and And test is true of both items are true.

Also, you should use AndAlso and OrElse instead of And and Or for
tests like this.
 
Your statement says to execut the Exit Sub only if all three
conditions are met.  In your example the first one is not met and the
other two are.

Apparently you want Or instead of And.  An Or test is true if either
item is true, and And test is true of both items are true.

Also, you should use AndAlso and OrElse instead of And and Or for
tests like this.


Ok a step further lets say:
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =2 it will not exit the program???

How can I fix that.......
 
Any = Or
All = And

your statement wants all the conditions to be met before the exit will
occur.

LS

No what happends is that DSIValues.Count can =1 but then the
muxclass.COM1Active = 0
The only wat it doesn;t exist is that DSIValues.Count can =2 but then
the muxclass.COM1Active = 1 or

DSIValues.Count can =1 but then the muxclass.COM2Active = 2
 
cmdolcet69 said:
I have the below if statement, that should catch if any of the
conditions are met.....however for some reasons if my
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =1 it will not exit the program??? Why is that
can anyone help me

Urgent!!!!!!



If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2
And Not muxClass.COM1Active = 1 Then
Exit Sub
End If


First I thought it could be a matter of operator precedence
(http://msdn.microsoft.com/en-us/library/fw84t893.aspx), but it's correct.

You expect the program to exit. Have you tested if the "Exit sub" statement
is reached (Debug.Print)? Or maybe it is reached but it doesn't cause the
expected behavior? Exit Sub exits the sub, not the program.


Armin
 
First I thought it could be a matter of operator precedence
(http://msdn.microsoft.com/en-us/library/fw84t893.aspx), but it's correct..

You expect the program to exit. Have you tested if the "Exit sub" statement
is reached (Debug.Print)? Or maybe it is reached but it doesn't cause the
expected behavior? Exit Sub exits the sub, not the program.

Armin

Armin it never exit the Sub and that all I want it to do is exit the
sub
 
cmdolcet69 said:
Armin it never exit the Sub and that all I want it to do is exit the
sub


It's possible that debugging has an influence on the result, in particular
as you are handling COM ports here (I guess) where the state can change
while debugging. For example, if you set a breakpoint and examine the
values, they can be different from those if you had not interrupted the
execution. Therefore, try this:

debug.write(boolDSIFlushGapReading & " ")
debug.write(muxClass.DSIValues.Count & " ")
debug.writeline(muxClass.COM1Active)

If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2 _
And Not muxClass.COM1Active = 1 Then
debug.writeline("exit sub")
Exit Sub
End If


I can not debug it here, so maybe exit sub is reached but the function is
called again and you think it is never left? I don't know. Is "exit sub"
ever shown in the debug/output window? Do you ever get the value combination
that you think should make the sub exit?



Armin
 
Ok a step further lets say:
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =2 it will not exit the program???

How can I fix that.......

I don't understand what behavior you want.

In the example above, it would not exit because only one of the
conditions is true, and when you use And all must be true.

If you use Or, then if any condition is true it will exit, so in your
example above if you changed the Ands to Ors (or preferrably OrElse)
it would exit since muxClass.DSIValues.Count is < 2.
 
Why are you not reading what everybody writes, but does not want to give you
the fish but tries to teach you how to catch the fish.

Here is the fish

\\\
If boolDSIFlushGapReading = False OrElse muxClass.DSIValues.Count < 2 OrElse
muxClass.COM1Active <> 1 Then
Exit Sub
End If
///

This means that if any of this tests is true, then it will Exit Sub

Do they all have to be true then it is

\\\
If boolDSIFlushGapReading = False AndAlso muxClass.DSIValues.Count < 2
AndAlso
muxClass.COM1Active <> 1 Then
Exit Sub
End If
///


Cor
 
cmdolcet69 said:
I have the below if statement, that should catch if any of the
conditions are met.....however for some reasons if my
boolDSIFlushGapReading = true and MuxClass.DSIValues.count =1 and my
muxclass.COM1Active =1 it will not exit the program??? Why is that can
anyone help me


If boolDSIFlushGapReading = False And muxClass.DSIValues.Count < 2 And
Not muxClass.COM1Active = 1 Then
Exit Sub
End If

This is why everyone is saying to use "or" rather than "and": you're not
translating English into computer the right way round.

English: let's have all the apples and bananas->let's have all the apples
and let's have all the bananas

Computer: (all the items where x is an apple) + (all the items where x is a
banana)

Logically, the + translates to "or", not "and".


If in doubt, write it as three separate conditions to make it obvious:

if not(boolDSIFlushGapReading) then
exit sub
end if

if MuxClass.DSIValues.count < 2 then
exit sub
end if

if muxClass.COM1Active <> 1 then
exit sub
end if

Remember the syntax is "if <boolean> then...", so you shouldn't test boolean
values: you should treat it directly as a boolean, which is why I changed
your "If boolDSIFlushGapReading = False" to "if
not(boolDSIFlushGapReading)".

Also, I think that "if muxClass.COM1Active <> 1" is easier to read than "if
Not muxClass.COM1Active = 1".

HTH

Andrew
 
"easier to read" is open to debate (although I don't disagree), but
if Not muxClass.COM1Active = 1
relies on precedence, whereas
if muxClass.COM1Active <> 1
does not. Barely significant in this example, but it can save a lot of
headscratching in more complex cases.
 
I thought my threads were weird.

James, do you mean:
Not muxClass.COM1Active = 1
is interpreted as:
(Not muxClass.COM1Active) = 1
which would never be true, because true equates to -1, false to 0, and is
different from:
Not (muxClass.COM1Active = 1)

parens can be your friends...

maybe the whole problem is he should be testing for -1 instead of 1,
I don't know.
 
No. The two expressions are equivalent. I was simply commenting that the
form
Not muxClass.COM1Active = 1
relies on
muxClass.COM1Active = 1
having a higher precedence than the Not. My preference is for having an
expression that doesn't rely on the default precedence rules, therefore I
would use either
Not (muxClass.COM1Active = 1)
which makes it explicit or (much simpler)
if muxClass.COM1Active <> 1

So not only does it _look_ more sensible but there's some programming sense
behind the choice - just a tiny bit in this case, but possibly relevant in
more complex cases. The original code was complicated enough without the
possibility of misunderstanding the implied precedence rules.
 
so you're saying you don't like the left-to-right thing being overridden by
the precedence rules, because who remembers the precedence rules anyways (I
don't, obviously. I use parens.)

I don't know why this guy's confused, then.
 
I don't think anyone knows why OP is confused because he never comes back to
indicate whether or not he worked it out. He just asks another question
from somewhere else in the project.
 
Back
Top