dポイントプレゼントキャンペーン実施中!

VBAで、Do...Loop関数の入れ子でDo...Loop関数を使って、
子のLoop関数の中にIf関数を入れています。
このIf関数の条件が満たせば、一気に親のLoop関数も抜け出したいです。

Exit Doでは、直近のLoop関数(つまり子の方のLoop関数)から抜け出せないと思います。つまりExitDo ExitDoと2回やって一気に抜け出す方法はないでしょうか?Goto関数を使うしかないでしょうか?

よろしくお願いします。

A 回答 (5件)

こんばんは。

#1のWendy02です。

>気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ?

それは、どうなんでしょうね。私にはわかりませんが、VBAでは、それを抜け出したところで、End Sub の後に、通常は問題が発生する話は聞いたことがありません。ExcelはExcel独自のスタック領域の中での割り当てのようですね。時々、初心者さんで、シートも詰め込みで、VBAも1000行以上を超えるようなであまり長いコードなどを書いている人がいますが、Excelはそれだけでハングしますが。

私自身、使うべきか迷うときがありますが、エラー・トラップでは使わざるをえませんしね。エラー・トラップで、Goto ステートメントをきちんと使いこなせなくてはなりません。今後、VBAの次のVSTAでは、どうなるかはわかりませんが、おそらくは、その問題は出てくるかもしれませんね。

それと、#3 s_husky さんのように組み合わせで書いても良いかもしれませんね。今、私の書いたものを調べてみると、Do~Loop と For~Next の組み合わせなどをしている例があるかと思えば、やはり、初期のころ、Goto を使って抜けている例などありますが、何百の中に1件程度で、二重ループは少ないです。有名なクイクック・ソートアルゴリズムのように、配列の添え字を全部使い切りで、二重ループするのは、この件とは別ですからね。
    • good
    • 0
この回答へのお礼

Wendy02さん

色々と詳しい解説どうもありがとうございます。
そうですか?今度、VSTAが出るのですか?初耳でした。

色々、学習してみます。よろしくお願いします。

お礼日時:2006/12/22 12:41

#4の訂正


×有名なクイクック・ソートアルゴリズム

有名なクイック・ソートアルゴリズム
    • good
    • 0

Private Sub CommandButton1_Click()


  Dim StopNow As Boolean
  Dim I    As Integer
  Dim J    As Integer
  
  For J = 0 To 1
    Do
      I = I + 1
      StopNow = (I = 20)
      If Not StopNow Then
        Debug.Print I
      Else
        Exit For
      End If
    Loop Until J <= 2
    J = J - 1
  Next J
End Sub

For-Next文で Do-Loop文 を代用するという手もあります。
    • good
    • 0
この回答へのお礼

s_huskyさん

早速のご回答ありがとうございます。
その前の、hana-hana3さんのご回答も拝見して、さすがテクニックですね。
色々、工夫して頭を使えば出来るわけですね。

参考にさせていただきます。ありがとうございました。

お礼日時:2006/12/21 16:18

フラグを立ててチェックすれば良いかと思います。



ExitFlg = Flase
Do
Do
If 条件 then
ExitFlg = True
Exit Do
Loop
if ExitFlg Then Exit Do
Loop
    • good
    • 0
この回答へのお礼

hana-hana3さん

早速のご回答ありがとうございます。
その後の、s_huskyさんのご回答も拝見して、さすがテクニックですね。
色々、工夫して頭を使えば出来るわけですね。

参考にさせていただきます。ありがとうございました。

お礼日時:2006/12/21 16:16

こんにちは。



>Goto関数を使うしかないでしょうか?

要するに、VB/VBAの暗黙の禁止ルールを破るか破らないかっていう話ですよね。(それとも、単なる質問かな?こういう質問は、正直、きついです。)

ドイツかどこかの偉い人が、禁止ルールを打ち立てて、構造化しろっていうわけですね。Goto(Goto ステートメントですが) を使うと、読みにくくなるというわけですよね。

あまり使うべきでないのは、私も知っています。でも、しょせん、VBAは、素人が書くものだと割り切っていればよいと思います。システム開発しているわけではありませんからね。

掲示板で、Gotoを使うと、めちゃくちゃな文句つける人がいますね。(「おまえに、VBAを使う資格などない!」とか)では、その人のコードを見せてもらうと、たいしたコードを書いていないのに、良く言えるなって思うことがあります。

それを使いたくないなら、サブルーチンにして、Exit Subにすればよいです。そうすれば、抜けられます。私は、どちらでもよいと思います。しかし、サブルーチンにすると、引数や引数の型を気にして作らなくてはならないので、面倒ですよね。

この後にも、別なことを書く人はいるだろうけれども。
    • good
    • 0
この回答へのお礼

Wendy02さん

早速のご回答どうもありがとうございます。
そうですね。Gotoは好ましくないと聞いていますが、
簡単だから使ってしまったりしています。
要は結果が良ければ、中身はどうでもいいですからね。プロではないし。

それで、気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ?と思うんです。気にしなくてもいいかも知れないけど。

お礼日時:2006/12/21 16:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A