2017-08-22 5 views
2

ネストされたforとネストされたifステートメントを一緒に実装しようとしています。私は以下の列を持っています。範囲が500-1000の間であれば列を見る必要があり、それが1000を超える場合には推奨列a(すなわち、推奨列を別の列に書く)が応答列に別の推奨を与えるはずである。ネストされ、ネストされている場合

Income Recommendation 
550  a 
1200  b 
750  a 
1400  b 
600  a 


Dim i As Integer 
Dim j As Integer 


    For i = 2 To Range(i, 1).End(xlDown).Row 

     If Cells(i, 1).Value > 1000 Then 

     Cells(i, 10).Value = "b" 

     i = i + 1 

     Else 
      If Cells(i, 1).Value < 1000 Then 
       If Cells(i, 1).Valie > 500 Then 
       Cells(i, 10).Value = "a" 
       End If 
       End If 
     i = i + 1 
     End If 
    Next i 
End Sub 
+0

点心iを整数として整数 薄暗いjと iに対して= 2レンジに(I、1).END(xlDown).Row 細胞(I、1).Valueの、> 1000続い 細胞(I、10).Valueの= "B" 場合(i、1).Value <1000 Then セルの場合(i、1).Valie> 500 Then セル(i、10)。値= "" END IF エンド 場合、私= I + 1 終わり、私はサブ – Yags

+0

謝罪はあなたのためにそれを行いますおおよその試合で自分のコード – Yags

+0

シンプルVLOOKUP()を投稿するのを忘れ終了 次の場合。または昇順でデータを保持することによってLookup()関数 – Sixthsense

答えて

3

あなたはSelect Caseと、このようにそれを行うことができます。

Public Sub TestMe()  

    Dim i As Long 
    Dim j As Long 

    With ActiveSheet 
     For i = 2 To .Cells(1, 1).End(xlDown).Row  
      Select Case True  
       Case .Cells(i, 1) > 1000 
        .Cells(i, 10) = "b"  
       Case .Cells(i, 1) < 1000 And .Cells(i, 1) > 500 
        .Cells(i, 10).value = "a"  
      End Select 
     Next i 
    End With 
End Sub 

それはより多くの目に見えるし、もう少し理解しやすいです。また、将来の参照問題を避けるために、ワークシート(この場合はwith ActiveSheet)を参照するようにしてください。

+0

iに2の初期値を割り当てても、それはi = 0で始まります。それはなぜでしょうか? – Yags

+0

@ YowE3K - 私は 'Case True'も嫌いですが、これはこの場合に' AND'条件を入れる唯一の方法だと思われます。 – Vityata

+0

私はちょうど 'Case> 1000'(最高バンドを拾うため)、そして' Case> 500'(次のバンドを拾うため)、そして 'Case Else'(残ったものを拾うため)を使いました。これは 'True'に評価される最初のものだけを処理するので、レイアウトは' If'/'ElseIf' /' Else'ステートメントと同じです。 – YowE3K

4

いくつかのエラー:

  1. はそれがForループの開始と終了値を設定している間の値を有するiに依存しないでください - Range(i, 1)を計算しながら、それは0であることを良いチャンスがあります。 (編集:テストして、最終値が計算されている時点でまだ0であることを確認しました)Range(0, 1)を使用すると、1004エラーが発生します。

  2. ループ内のループカウンタをインクリメントしないでください(つまり、i = i + 1を実行しないでください)。実際に2行おきに処理したい場合はStep 2Forステートメントで使用してください。

  3. .Valie.Value

  4. 行のIntegerデータ型は使用しないでくださいする必要があります - ExcelはIntegerが対処できる以上である1048576行を扱うことができ、これらの日を。

  5. Range(1, 1)は無効な構文です。 2つのパラメータをRangeプロパティに渡すときは、セル参照である必要があります。行と列を渡すことは、プロパティを使用するときに使用されるものです。 (だから、Range(1, 1)Cells(1, 1)、またはRange("A1")する必要があります。)

のリファクタリング、コードが与えるだろう:

Dim i As Long 

    For i = 2 To Cells(1, "A").End(xlDown).Row 

     If Cells(i, "A").Value > 1000 Then 
      Cells(i, "J").Value = "b" 
     ElseIf Cells(i, "A").Value > 500 Then 
      Cells(i, "J").Value = "a" 
     Else 
      Cells(i, "J").Value = "" 
     End If 
    Next i 
End Sub 
関連する問題