
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件程度で、二重ループは少ないです。有名なクイクック・ソートアルゴリズムのように、配列の添え字を全部使い切りで、二重ループするのは、この件とは別ですからね。
Wendy02さん
色々と詳しい解説どうもありがとうございます。
そうですか?今度、VSTAが出るのですか?初耳でした。
色々、学習してみます。よろしくお願いします。
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文 を代用するという手もあります。
s_huskyさん
早速のご回答ありがとうございます。
その前の、hana-hana3さんのご回答も拝見して、さすがテクニックですね。
色々、工夫して頭を使えば出来るわけですね。
参考にさせていただきます。ありがとうございました。
No.1
- 回答日時:
こんにちは。
>Goto関数を使うしかないでしょうか?
要するに、VB/VBAの暗黙の禁止ルールを破るか破らないかっていう話ですよね。(それとも、単なる質問かな?こういう質問は、正直、きついです。)
ドイツかどこかの偉い人が、禁止ルールを打ち立てて、構造化しろっていうわけですね。Goto(Goto ステートメントですが) を使うと、読みにくくなるというわけですよね。
あまり使うべきでないのは、私も知っています。でも、しょせん、VBAは、素人が書くものだと割り切っていればよいと思います。システム開発しているわけではありませんからね。
掲示板で、Gotoを使うと、めちゃくちゃな文句つける人がいますね。(「おまえに、VBAを使う資格などない!」とか)では、その人のコードを見せてもらうと、たいしたコードを書いていないのに、良く言えるなって思うことがあります。
それを使いたくないなら、サブルーチンにして、Exit Subにすればよいです。そうすれば、抜けられます。私は、どちらでもよいと思います。しかし、サブルーチンにすると、引数や引数の型を気にして作らなくてはならないので、面倒ですよね。
この後にも、別なことを書く人はいるだろうけれども。
Wendy02さん
早速のご回答どうもありがとうございます。
そうですね。Gotoは好ましくないと聞いていますが、
簡単だから使ってしまったりしています。
要は結果が良ければ、中身はどうでもいいですからね。プロではないし。
それで、気になることはGotoを使って一気に抜け出すと、DoLoopの戻り番地のスタック領域はそのまま残ってしまうのかなあ?と思うんです。気にしなくてもいいかも知れないけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSのVBAでPrivate Sub ~en...
-
Perlのスレッド?
-
グラフのX,Y座標を取得したい
-
Excel VBA 定義されたプロージ...
-
モジュールからフォームのボタ...
-
acwzlibとは?
-
教えて下さい。
-
EXECEL VBA コマンドボタンか...
-
「デバイスは PRN を初期化でき...
-
PerlでUNIXのコマンドとパスワ...
-
モジュールアップデートって何...
-
[ASP]条件によってインクルード...
-
VBでグローバル変数を宣言するには
-
COBOL85からCOBOL2002移行
-
CPANモジュールのアンインストール
-
エクセルVBAでシートモジュール...
-
現在アクティブなフォーム名を...
-
Wordで、分かち書きをするVBA ...
-
VHDLにおける「generic」について
-
linux mintで(EE )Failed to lo...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
オフコン(富士通Kシリーズ)...
-
COBOLで、Shellを起動するには?
-
初歩的な質問なのですが、サブ...
-
モジュールとサブルーチン
-
VBAで2重のDoLoop関数から抜け...
-
perlの構文でカンマの意味が分...
-
サブルーチンやif分以外での中括弧
-
サブルーチンを認識しません。
-
モジュール内でのサブルーチン...
-
Attempt to free unreferenced ...
-
Matlabのinline関数
-
ACCESSのVBAでPrivate Sub ~en...
-
【Windows10 コマンドプロンプ...
-
AUTOLOADサブルーチンが実行さ...
-
Perlのサブルーチンの引数引継ぎ?
-
配列と互換性のない型の要素に...
-
Excel VBAから利用できるフリー...
-
Fortran90,95で書かれたプログ...
おすすめ情報