2016-10-06 10 views
-3

エラーが発生した場合、VBAコードを書き込もうとしています。VBA with InStr

私はコードが値(「S925、S936、S926、G」)の1セルに10

Sub checklist() 

Dim x 
Dim LineType 

NumRows = Cells(Rows.Count, "j").End(xlUp).Row 

For x = 2 To NumRows 

    If LineType = "G" Then 
     If Not InStr("S925,S936,S926,G", cellsCells(x, 10).Value) Then 
     cells  Cells(x, 52).Interior.Color = rgbCrimson 
     cells  Cells(x, 52).Value = "G" 


End If 
     End If 


    End If 

Next x 


End Sub 
+0

あなたのアプローチと同じ方法で本質的に問題を解決するために 'InStr'を使用するやや異なる質問の解決策については、[この回答](http://stackoverflow.com/a/11112615/4604845)を参照してください。 。 – Vegard

+1

どのような種類のエラー?ループの一部だけを削除して、サンプルがコンパイルされないようにしました。 – arcadeprecinct

+0

ここであなたの 'For x = ...'は? 薄暗い)は「サブチェックリスト( 薄暗い線種 に NUMROWS =細胞(Rows.Count、 "J")をxの終了(xlUp:あなたは私がこれを追加するのを忘れ、次は申し訳ありません –

答えて

4

ない場合、このエラーは発生しませんが、それが原因となります確認したいですあなたのプログラムに問題があるので、私はそれを説明します。

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!を印刷します。これは、InStrFalseを返したためではありません。私たちは、より良い理解に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がブール型に変換されないためです。Not2にビット単位で適用されるため、すべてのビットが反転されます。したがって、2(0010)は1101になります。これは、コンピュータが負の数を表現するためにtwo's complementを使用するためです。 (実際にはIntegerではより多くのビットが使用されますが、同じ動作をします)。-3は0ではないため、Trueに変換されます。 Not 0True0000は2の補数で-1である1111に変換されます)と評価されるため、式Not InStr(...)は常にTrueと評価されます。

このビット単位の動作は、内部で00001111と表現されているため、ブーリアンの使用時には認識されません。また、これは、このように明らかになり:あなたがここに見ることができるように

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(...) ThenIf InStr(...) = 0 Thenの代わりIf Not InStr(...) Then


PS:Andが同様にビット単位に適用されますので、あなたがAndで2つのInStrのテストを組み合わせた場合、これはまた紛らわしい行動を引き起こす可能性があります。