Function Foo(thiscell As Range) As Boolean
Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function
この関数は、関数に渡されたセルが空であるときに私が悩みを抱えている(。VBAの "And"演算子は、最初の引数がfalseのときに2番目の引数を評価しますか?
場合がある前に、特定のサブストリング(この場合はバー)の存在について試験するために存在しますこのCel.hasFormulaはfalseですが、との後ろのステートメントは評価されています。これにより、実行時に下付き文字が範囲外エラーになります。
VBAは実際にAndの第2引数を評価し続けますか?最初は偽でしたか?
VBAの 'And'演算子は*論理演算子ではなくビット演算子*であるため、短絡しないことに注意してください。参照してください:http://stackoverflow.com/questions/8042744/excel-vba-instr-condition-doesnt-work-with-2-or-more-conditions/8047021#8047021 – jtolle
@jtolle not true - ブール値を返します引数がブール値の場合、ビット単位と論理単位の両方の操作がサポートされます。 (論理が1ビット整数を使用するビット単位の特別なケースだと主張することもできますが、興味があったらマイクロソフトでは短絡がサポートされている可能性があります) –
@Hugh、interesting。今度は、「真= -1」と「False = 0」なので、論理演算をシミュレートしたにもかかわらず、「And」はビット演算子だと仮定しています。しかし、あなたが正しいことは、両方の式がBoolean型であれば、 'And' *は論理演算子です。一方または両方のオペランドが数字の場合はビット単位でしかありません。しかし、どちらか一方または両方が数字ではなくブール値でないことを保証するために、両方の式を評価しなければならないので、短絡できないと思います。だから私は "敏感さ"はまだここで短絡につながっていないと思う。 – jtolle