Cannot use an If-statement with multiple conditions (AND/OR) when looping through variant array?

后端 未结 1 592
余生分开走
余生分开走 2020-12-17 01:57

Background:

In working with some variant arrays to sort data to multiple locations based on criteria, I noticed that using an if-statement with mult

相关标签:
1条回答
  • 2020-12-17 02:21

    InStr returns an index. As a logical operator, And wants to have Boolean operands. Given Integer operands, the And operator is a bitwise operator - truth be told, these operators are always bitwise; we just dub them "logical" operators when the operands are Boolean.

    If InStr(ex_arr(i, ex_lc), "CriteriaA") Then
    

    This condition is implicitly coercing the returned index into a Boolean expression, leveraging the fact that any non-zero value will convert to True.

    Problems start when you bring logical/bitwise operators into the equation.

    If InStr(ex_arr(i, ex_lc), "CriteriaA") And InStr(ex_arr(i, 4), "CriteriaB") Then dc(ex_arr(i, 2)) = ex_arr(i, 3)
    

    Say the first InStr returns 2, and the second returns 1. The If expression becomes If 2 And 1 Then, so 0. That's zero, so the condition is false.

    Wait, what?

    Think of the binary representation of 2 vs that of 1:

      2:  0010
      1:  0001
    AND:  0000
    

    Bitwise-AND yields 0, since none of the bits line up.


    Stop abusing implicit type conversions, and be explicit about what you really mean. What you mean to be doing, is this:

    If (InStr(ex_arr(i, ex_lc), "CriteriaA") > 0) And (InStr(ex_arr(i, 4), "CriteriaB") > 0) Then dc(ex_arr(i, 2)) = ex_arr(i, 3)
    

    (redundant parentheses for illustrative purposes only)

    Now this evaluates two Boolean expressions, applies bitwise-AND to the two values, and correctly works as intended.

    True: 1111
    True: 1111
     AND: 1111
    
    0 讨论(0)
提交回复
热议问题