2017-01-05 10 views
0

私はこれに必要な答えを見つけるのに苦労しています。私が書いたコードは、私が達成したいことを達成するために別々にアプローチする必要があると感じている。Excel VBA:文字列範囲で遡及行にIF文を繰り返してください

セル上にIF文を生成し、その隣の別のセルに対応する記述を表示するコードをいくつか生成しました。この値が変更された場合に自動的に更新するコードも追加しました。これは機能します。

これでコードを拡張して、セルをループして同じ機能を繰り返すようにする必要があります。 IF文をチェックし、その隣にあるそれぞれのセルに対応する記述を表示する。

シートVBA:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Me.Range("A2:A10")) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
    On Error GoTo Finalise 
    Call Material_String 
    Finalize: 
    Application.EnableEvents = True 
End Sub 

モジュール:

Sub Material_String() 
    Dim MaterialOption As String 
    Dim MaterialDetail As String 
    MaterialOption = Range("A2").Value 
    If MaterialOption = "a" Then MaterialDetail = "a is bloody good" 
    If MaterialOption = "b" Then MaterialDetail = "b is excellent" 
    If MaterialOption = "c" Then MaterialDetail = "c is most good" 
    If MaterialOption = "d" Then MaterialDetail = "d is simply the best" 
    If MaterialOption = "e" Then MaterialDetail = "e's are just amazing" 
    Range("C2").Value = MaterialDetail 
End Sub 

任意のポインタをいただければ幸いです。

+1

チェックアウト[どの範囲をループする(http://www.excel-easy.com/vba/examples/loop -through-defined-range.html)を参照してください。また、 'If'文の代わりに[Select Case](http://www.excel-easy.com/vba/examples/select-case.html)も役に立つかもしれません。 –

+1

セルを変更してコードをアクティブにした場合、そのセルのほとんどが変更されていない場合、なぜ範囲全体をループする必要がありますか?私はそれが正しいと思っていただろう。 – SJR

答えて

0

おそらくすべての行をループしたくないでしょう。おそらく、変更されたセルで作業したいだけです。

「作業」サブルーチン(つまりMaterial_String)を変更して、セルをパラメータとして受け入れ、変更されたセルを渡すようにWorksheet_Changeイベントを変更します。

シートVBA:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Me.Range("A2:A10")) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
    On Error GoTo Finalise 
    Dim c As Range 
    'Loop through each changed cell, just in case there is more than one 
    For Each c In Intersect(Target, Me.Range("A2:A10")).Cells 
     Call Material_String(c) 
    Next 
    Finalize: 
    Application.EnableEvents = True 
End Sub 

モジュール:

Sub Material_String(c As Range) 
    Dim MaterialOption As String 
    Dim MaterialDetail As String 
    MaterialOption = c.Value 
    If MaterialOption = "a" Then MaterialDetail = "a is bloody good" 
    If MaterialOption = "b" Then MaterialDetail = "b is excellent" 
    If MaterialOption = "c" Then MaterialDetail = "c is most good" 
    If MaterialOption = "d" Then MaterialDetail = "d is simply the best" 
    If MaterialOption = "e" Then MaterialDetail = "e's are just amazing" 
    c.Offset(0, 2).Value = MaterialDetail 
End Sub 
+0

ありがとうYowE3K。それは細胞を見ているという意味ですか?おそらく(私が見つけているように見える)別のIF Intersectステートメントでもう一度Cを参照して別の列を見て、別のモジュールを同じシートに呼び出すことはできません。 –

+0

@MattCass変数 'c'には何も特別なものはありません。それは 'Range'オブジェクト(すなわち範囲への参照)として定義され、' Change'イベントでそれを使用して列Aで変更された各セルを個別に参照します(行2と10の間)。あなたが 'Change'イベントコードに' For Each In Intersect(Target、Me.Range( "D:D"))のような別のループを含めることができない理由はありません:Cells'' Call Another_Sub(c) 「次へ」 – YowE3K

関連する問題