Function Foo(thiscell As Range) As Boolean
Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function
existe Esta función para probar la presencia de un cierto subcadena (bar, en este caso) antes de la (.¿El operador "Y" de VBA evalúa el segundo argumento cuando el primero es falso?
El caso tengo problemas con es cuando la célula pasado a la función está vacía , thisCell.hasFormula es falso, pero la instrucción después de y aún se está evaluando. Esto me da un subíndice de error fuera de rango en tiempo de ejecución
¿VBA en realidad continúa evaluando el segundo argumento para el Y, incluso cuando el primero fue falso?
Tenga en cuenta que el operador 'Y' de VBA no cortocircuita porque es un operador * bitwise * y no * uno *. Consulte: http://stackoverflow.com/questions/8042744/excel-vba-instr-condition-doesnt-work-with-2-or-more-conditions/8047021#8047021 – jtolle
@jtolle no es verdad - devolverá un booleano si sus argumentos son booleanos, entonces es compatible con la operación lógica y en modo bit. (seguro que podría argumentar que lógico es un caso especial de bit a bit utilizando enteros de 1 bit, pero el punto es que Microsoft podría haber sido soportado en cortocircuito si así lo desean) –
@Hugh, interesante. Todo este tiempo he estado asumiendo que 'Y' era solo un operador bit a bit, aunque uno que simulaba operaciones lógicas porque 'True = -1' y 'False = 0'. Pero tiene razón en que 'Y' * es * un operador lógico si las dos expresiones que se le pasan son booleanas. Solo es bit a bit si uno o ambos operandos son números. Pero supongo que no puede provocar un cortocircuito porque ambas expresiones deben evaluarse de todos modos, para garantizar que uno o ambos no sean números ni booleanos. Por lo tanto, creo que "bitwiseness" todavía no provoca ningún cortocircuito aquí. – jtolle