• ベストアンサー

VBAで2重のDoLoop関数から抜け出すには?

VBAで、Do...Loop関数の入れ子でDo...Loop関数を使って、 子のLoop関数の中にIf関数を入れています。 このIf関数の条件が満たせば、一気に親のLoop関数も抜け出したいです。 Exit Doでは、直近のLoop関数(つまり子の方のLoop関数)から抜け出せないと思います。つまりExitDo ExitDoと2回やって一気に抜け出す方法はないでしょうか?Goto関数を使うしかないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。#1のWendy02です。 >気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ? それは、どうなんでしょうね。私にはわかりませんが、VBAでは、それを抜け出したところで、End Sub の後に、通常は問題が発生する話は聞いたことがありません。ExcelはExcel独自のスタック領域の中での割り当てのようですね。時々、初心者さんで、シートも詰め込みで、VBAも1000行以上を超えるようなであまり長いコードなどを書いている人がいますが、Excelはそれだけでハングしますが。 私自身、使うべきか迷うときがありますが、エラー・トラップでは使わざるをえませんしね。エラー・トラップで、Goto ステートメントをきちんと使いこなせなくてはなりません。今後、VBAの次のVSTAでは、どうなるかはわかりませんが、おそらくは、その問題は出てくるかもしれませんね。 それと、#3 s_husky さんのように組み合わせで書いても良いかもしれませんね。今、私の書いたものを調べてみると、Do~Loop と For~Next の組み合わせなどをしている例があるかと思えば、やはり、初期のころ、Goto を使って抜けている例などありますが、何百の中に1件程度で、二重ループは少ないです。有名なクイクック・ソートアルゴリズムのように、配列の添え字を全部使い切りで、二重ループするのは、この件とは別ですからね。

hiroi
質問者

お礼

Wendy02さん 色々と詳しい解説どうもありがとうございます。 そうですか?今度、VSTAが出るのですか?初耳でした。 色々、学習してみます。よろしくお願いします。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#4の訂正 ×有名なクイクック・ソートアルゴリズム 有名なクイック・ソートアルゴリズム

noname#22222
noname#22222
回答No.3

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文 を代用するという手もあります。

hiroi
質問者

お礼

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

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

フラグを立ててチェックすれば良いかと思います。 ExitFlg = Flase Do Do If 条件 then ExitFlg = True Exit Do Loop if ExitFlg Then Exit Do Loop

hiroi
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >Goto関数を使うしかないでしょうか? 要するに、VB/VBAの暗黙の禁止ルールを破るか破らないかっていう話ですよね。(それとも、単なる質問かな?こういう質問は、正直、きついです。) ドイツかどこかの偉い人が、禁止ルールを打ち立てて、構造化しろっていうわけですね。Goto(Goto ステートメントですが) を使うと、読みにくくなるというわけですよね。 あまり使うべきでないのは、私も知っています。でも、しょせん、VBAは、素人が書くものだと割り切っていればよいと思います。システム開発しているわけではありませんからね。 掲示板で、Gotoを使うと、めちゃくちゃな文句つける人がいますね。(「おまえに、VBAを使う資格などない!」とか)では、その人のコードを見せてもらうと、たいしたコードを書いていないのに、良く言えるなって思うことがあります。 それを使いたくないなら、サブルーチンにして、Exit Subにすればよいです。そうすれば、抜けられます。私は、どちらでもよいと思います。しかし、サブルーチンにすると、引数や引数の型を気にして作らなくてはならないので、面倒ですよね。 この後にも、別なことを書く人はいるだろうけれども。

hiroi
質問者

お礼

Wendy02さん 早速のご回答どうもありがとうございます。 そうですね。Gotoは好ましくないと聞いていますが、 簡単だから使ってしまったりしています。 要は結果が良ければ、中身はどうでもいいですからね。プロではないし。 それで、気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ?と思うんです。気にしなくてもいいかも知れないけど。

関連するQ&A