ない場合、このエラーは発生しませんが、それが原因となります確認したいですあなたのプログラムに問題があるので、私はそれを説明します。
InStr
は、検索文字列の最初のオカレンスのインデックスではなくブール値を返します。文字列が見つからない場合は0を返します。 たとえばInStr("12345", "23")
は2を返します。
0以外はすべてTrue
としてキャストされるため、If Instr(....) Then
のようなものが期待どおりに機能します。
は、しかし、あなたがIf Not InStr(....) Then
を使用している場合、何か他のものは/
If Not InStr("12345", "23") Then
Debug.Print "test evaluated as True!"
End If
が起こるのだろうことができ、これは "23" が "12345" に含まれていてもtest evaluated as True!
を印刷します。これは、InStr
がFalse
を返したためではありません。私たちは、より良い理解に2とInStr
式を置き換えることができます。
Debug.Print 2 '2 (duh)
Debug.Print CBool(2) 'True (2 converted to Boolean)
Debug.Print Not 2 '-3
Debug.Print CBool(Not 2) 'True (-2 converted to Boolean)
ワイオミング州-3として評価Not 2
のですか?これは、Not
が適用される前に2
がブール型に変換されないためです。Not
は2
にビット単位で適用されるため、すべてのビットが反転されます。したがって、2(0010
)は1101
になります。これは、コンピュータが負の数を表現するためにtwo's complementを使用するためです。 (実際にはInteger
ではより多くのビットが使用されますが、同じ動作をします)。-3は0ではないため、True
に変換されます。 Not 0
はTrue
(0000
は2の補数で-1である1111
に変換されます)と評価されるため、式Not InStr(...)
は常にTrueと評価されます。
このビット単位の動作は、内部で0000
と1111
と表現されているため、ブーリアンの使用時には認識されません。また、これは、このように明らかになり:あなたがここに見ることができるように
Debug.Print 1 = True 'False
Debug.Print CBool(1) = True 'True
Debug.Print -1 = True 'True
Debug.Print CBool(-1) = True'True
Debug.Print CInt(True) '-1 (True converted to Integer)
は、True
は=
比較のために、ブールに変換される整数ではなく、整数に変換されます。
ロング説明、短い修正:使用If InStr(...) > 0 Then
の代わりに、If InStr(...) Then
とIf InStr(...) = 0 Then
の代わりIf Not InStr(...) Then
。
PS:And
が同様にビット単位に適用されますので、あなたがAnd
で2つのInStr
のテストを組み合わせた場合、これはまた紛らわしい行動を引き起こす可能性があります。
あなたのアプローチと同じ方法で本質的に問題を解決するために 'InStr'を使用するやや異なる質問の解決策については、[この回答](http://stackoverflow.com/a/11112615/4604845)を参照してください。 。 – Vegard
どのような種類のエラー?ループの一部だけを削除して、サンプルがコンパイルされないようにしました。 – arcadeprecinct
ここであなたの 'For x = ...'は? 薄暗い)は「サブチェックリスト( 薄暗い線種 に NUMROWS =細胞(Rows.Count、 "J")をxの終了(xlUp:あなたは私がこれを追加するのを忘れ、次は申し訳ありません –