2016-09-16 5 views
0

GOTOを使用する以外に、ループ内のコードを放棄して次のものに進める方法はありますか? GOTOは以下のコードで効率的な方法ですか?途中でループを前進させる方法

Do While x < 10 

    a = Int(Rnd * 100) 
    b = Int(Rnd * 100) 
    c = Int(Rnd * 100) 

    For n = 1 To 4 
     aa(i) = i * 2 + 4 
     bb(i) = i * 2 + 5 
     cc(i) = i * 2 + 6 
    Next 

    If a = b Then GoTo lastline 
    If a = c Then GoTo lastline 
    If b = c Then GoTo lastline 

    For i = 1 To 4 

     testa = (a = aa(i) Or a = bb(i) Or a = cc(i)) 
     If testa Then GoTo lastline 

     testb = (b = aa(i) Or b = bb(i) Or b = cc(i)) 
     If testb Then GoTo lastline 

     testc = (c = aa(i) Or c = bb(i) Or c = cc(i)) 
     If testc Then GoTo lastline 
    Next 

    Debug.Print a & ","; b & ","; c 

lastline: 
    x = x + 1 

Loop 
+4

は 'Goto'を使用せずに、これを行うための方法がたくさんあります - 通常は、条件付きでブロックをスキップしたい場合'If​​ Then'を使用するコード –

+2

他の多くの言語で見られる' continue'文に相当するものはありません。単純な '' if''と同様に、 'GoTo'が動作します。 –

+2

あなたが持っているものは十分に読みやすいです。ラベルとして 'lastline'ではなく' Continue'や 'NextIteration'を使うと、あなたの意図をさらにはっきりさせることができます。 –

答えて

1

は完全を期すために、これは、それはあなたが仕事をするためにSubを抽出した場合にどのようになるかです。それはループに来ていたものは何でも

For n = 1 To 4 
    aa(i) = i * 2 + 4 '<--- 'i'? shouldn't these be 'n'? 
    bb(i) = i * 2 + 5 
    cc(i) = i * 2 + 6 
Next 

後でループカウンタとしてiを使用しているので、それは常に次のようになります。あなたは私ががあなたの元のコードのタイプミスであると仮定し何を持っていることに注意してください1回目、4回目、4回目。私の推測は、これはあなたが意図したものではないということです。

方法のうちその...抽出Sub:あなたは途方もなくこのコードを簡素化することができ

Do While x < 10 
    WhateverYoureDoing aa, bb, cc 
    x = x + 1 
Loop 

注:コードを呼び出す

Private Sub WhateverYoureDoing(aa As Variant, bb As Variant, cc As Variant) 
    Dim a As Long, b As Long, c As Long 

    a = Int(Rnd * 100) 
    b = Int(Rnd * 100) 
    c = Int(Rnd * 100) 

    'Assuming this should be 'i' instead of 'n' as the loop count. 
    For i = 1 To 4 
     aa(i) = i * 2 + 4 
     bb(i) = i * 2 + 5 
     cc(i) = i * 2 + 6 
    Next 

    If a = b Then Exit Sub 
    If a = c Then Exit Sub 
    If b = c Then Exit Sub 

    For i = 1 To 4 
     If a = aa(i) Or a = bb(i) Or a = cc(i) Then Exit Sub 
     If b = aa(i) Or b = bb(i) Or b = cc(i) Then Exit Sub 
     If c = aa(i) Or c = bb(i) Or c = cc(i) Then Exit Sub 
    Next 

    Debug.Print a & ","; b & ","; c 
End Sub 

。たとえば、この...

a = Int(Rnd * 100) 
b = Int(Rnd * 100) 
c = Int(Rnd * 100) 
'... 
If a = b Then GoTo lastline 
If a = c Then GoTo lastline 
If b = c Then GoTo lastline 

は...簡単に使用できます

Do 
    a = Int(Rnd * 100) 
    b = Int(Rnd * 100) 
    c = Int(Rnd * 100) 
Loop While a <> b And a <> c And b <> c 
+0

これは非常に有用で非常にきれいです。ありがとうございました。 – user110084

0

述べたように、あなたはとき偽スキップするのIFを使用する:あなたは、あなたのFor...Nextループから抜け出すためにExit Forを含むさまざまな方法の多くでExitを使用することができます

Do While x < 10 

    a = Int(Rnd * 100) 
    b = Int(Rnd * 100) 
    c = Int(Rnd * 100) 

    For n = 1 To 4 
     aa(i) = i * 2 + 4 
     bb(i) = i * 2 + 5 
     cc(i) = i * 2 + 6 
    Next 

    If Not a = b Or Not a = c Or Not b = c Then 

     For i = 1 To 4 

      testa = (a = aa(i) Or a = bb(i) Or a = cc(i)) 
      If Not testa Then 
       testb = (b = aa(i) Or b = bb(i) Or b = cc(i)) 
       If Not testb Then 
        testc = (c = aa(i) Or c = bb(i) Or c = cc(i)) 
        If Not testc Then 
         Debug.Print a & ","; b & ","; c 
        End If 
       End If 
      End If 
     Next 

    End If 

    x = x + 1 

Loop 
+0

ありがとう、スコット。私が最初の3つのIFを1にカットするためにORを使用しなかったのは間違いです - だから素人です!私は最初のテスト(a、b、c)を成功させることを望んでおり、TRUEであれば、配列変数を完全にテストするのは避けてください。そしてループ内で同じことをして、早期に終了し、TRを見るとすぐにループを移動し、残りのFORループの時間を無駄にすることを望みます。私はEXIT FORを使ってLOOPに向かうことを考えましたが、(a、b、c)の最初のテストにGOTOを使わないことは十分に分かりません。 – user110084

+0

@JohnColeman、チップのおかげで非常に役に立ちました、編集の面白さについて考えなかった! – user110084

+0

@Comintern、この種の状況にsubやfunctionを使用するのが最善の方法ですか?変数を渡すことに非常に怠惰でした。 – user110084

0

Here is the Exit MSDN

すぐにそれが表示されるループのために出て

のために終了します。実行は、次のステートメントに続くステートメントで継続されます。 Exit Forは、For ... NextまたはFor Each ... Nextループ内でのみ使用できます。ネストされたForループ内で使用される場合、Exit Forは最も内側のループを終了し、制御を次のより高いレベルの入れ子に移します。

2

if文でスキップされる可能性のある部分をラップするだけです。 2番目のForループは、Exit Forを使用して早期に終了することもできます。これにより、GoToの使用が回避されます。私は以下のコードをテストしていませんが、その概念を説明する必要があります。

Do While x < 10 
    a = Int(Rnd * 100) 
    b = Int(Rnd * 100) 
    c = Int(Rnd * 100) 
    For n = 1 To 4 
     aa(i) = i * 2 + 4 
     bb(i) = i * 2 + 5 
     cc(i) = i * 2 + 6 
    Next 
    If Not a = b Or Not a = c Or Not b = c Then 
     For i = 1 To 4 
      testa = (a = aa(i) Or a = bb(i) Or a = cc(i)) 
      testb = (b = aa(i) Or b = bb(i) Or b = cc(i)) 
      testc = (c = aa(i) Or c = bb(i) Or c = cc(i)) 
      If testa Or testb Or testC Then 
       Exit For 
      Else 
       If i = 4 Then 
        Debug.Print a & ","; b & ","; c 
       End If 
      End If 
     Next 
    End If 
    x = x + 1 
Loop 
+0

ありがとう@DGilledge。 – user110084

+1

これは、永遠のループを実行するリスクを実行します。それは最初のifのelseに対してのみ増加し、2番目の場合はtrueになります。それがdebug.printに行けば、インクリメントされず、x。数字は変わり、最終的には他の2つの可能性と増分のうちの1つを満たします。最初のIFの外側に増分を移動して、forループが終了するたびに起動することができます。その後、forループ内のものを削除することができます。 –

+0

はい、それを指摘してくれてありがとう。私はそれに応じてそれを編集しました。 – DGulledge

関連する問題