- ベストアンサー
VBAで2重のDoLoop関数から抜け出すには?
VBAで、Do...Loop関数の入れ子でDo...Loop関数を使って、 子のLoop関数の中にIf関数を入れています。 このIf関数の条件が満たせば、一気に親のLoop関数も抜け出したいです。 Exit Doでは、直近のLoop関数(つまり子の方のLoop関数)から抜け出せないと思います。つまりExitDo ExitDoと2回やって一気に抜け出す方法はないでしょうか?Goto関数を使うしかないでしょうか? よろしくお願いします。
- みんなの回答 (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件程度で、二重ループは少ないです。有名なクイクック・ソートアルゴリズムのように、配列の添え字を全部使い切りで、二重ループするのは、この件とは別ですからね。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
#4の訂正 ×有名なクイクック・ソートアルゴリズム 有名なクイック・ソートアルゴリズム
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文 を代用するという手もあります。
お礼
s_huskyさん 早速のご回答ありがとうございます。 その前の、hana-hana3さんのご回答も拝見して、さすがテクニックですね。 色々、工夫して頭を使えば出来るわけですね。 参考にさせていただきます。ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
フラグを立ててチェックすれば良いかと思います。 ExitFlg = Flase Do Do If 条件 then ExitFlg = True Exit Do Loop if ExitFlg Then Exit Do Loop
お礼
hana-hana3さん 早速のご回答ありがとうございます。 その後の、s_huskyさんのご回答も拝見して、さすがテクニックですね。 色々、工夫して頭を使えば出来るわけですね。 参考にさせていただきます。ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >Goto関数を使うしかないでしょうか? 要するに、VB/VBAの暗黙の禁止ルールを破るか破らないかっていう話ですよね。(それとも、単なる質問かな?こういう質問は、正直、きついです。) ドイツかどこかの偉い人が、禁止ルールを打ち立てて、構造化しろっていうわけですね。Goto(Goto ステートメントですが) を使うと、読みにくくなるというわけですよね。 あまり使うべきでないのは、私も知っています。でも、しょせん、VBAは、素人が書くものだと割り切っていればよいと思います。システム開発しているわけではありませんからね。 掲示板で、Gotoを使うと、めちゃくちゃな文句つける人がいますね。(「おまえに、VBAを使う資格などない!」とか)では、その人のコードを見せてもらうと、たいしたコードを書いていないのに、良く言えるなって思うことがあります。 それを使いたくないなら、サブルーチンにして、Exit Subにすればよいです。そうすれば、抜けられます。私は、どちらでもよいと思います。しかし、サブルーチンにすると、引数や引数の型を気にして作らなくてはならないので、面倒ですよね。 この後にも、別なことを書く人はいるだろうけれども。
お礼
Wendy02さん 早速のご回答どうもありがとうございます。 そうですね。Gotoは好ましくないと聞いていますが、 簡単だから使ってしまったりしています。 要は結果が良ければ、中身はどうでもいいですからね。プロではないし。 それで、気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ?と思うんです。気にしなくてもいいかも知れないけど。
お礼
Wendy02さん 色々と詳しい解説どうもありがとうございます。 そうですか?今度、VSTAが出るのですか?初耳でした。 色々、学習してみます。よろしくお願いします。