
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Ruby VBA 2 2023/01/14 14:14
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
オフコン(富士通Kシリーズ)...
-
モジュールとサブルーチン
-
アセンブリプログラムのcallし...
-
初歩的な質問なのですが、サブ...
-
サブルーチンに引数を2つ以上...
-
”:”がいっぱいの文について。
-
VBAで2重のDoLoop関数から抜け...
-
サブルーチンやif分以外での中括弧
-
Perlです。サブルーチンに...
-
「デバイスは PRN を初期化でき...
-
VBでグローバル変数を宣言するには
-
モジュールの最大数はいくつな...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
VBSがコンパイルエラーになりま...
-
Excel VBAで、ユーザーフォーム...
-
モジュールからフォームのボタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
モジュールとサブルーチン
-
COBOLで、Shellを起動するには?
-
オフコン(富士通Kシリーズ)...
-
”:”がいっぱいの文について。
-
GOSUB命令とは
-
ACCESSのVBAでPrivate Sub ~en...
-
VBAで2重のDoLoop関数から抜け...
-
ExcelVBA AddinでOnAction
-
サブルーチンを認識しません。
-
perlの構文でカンマの意味が分...
-
サブルーチンやif分以外での中括弧
-
サブルーチンに引数を2つ以上...
-
配列と互換性のない型の要素に...
-
Perlのスレッド?
-
cobol サブルーチンのlink
-
初歩的な質問なのですが、サブ...
-
smallbasic について教えてくだ...
-
プログラムの「生産性」について
おすすめ情報