- ベストアンサー
こういう使い方はありですか?
VBA初心者です。 Sub test() Dim i As Long If i <> 0 Then Call test End If End Sub のように、サブプロシージャーを実行している時に、 その実行してるプロシージャーを呼び出すのは 必要であれば・無限ループしなければプログラミングとしてアリなのでしょうか? 本を見てもこのような使い方をしてないので疑問に思いました。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Sub test1() Do While DateDiff("n", Now(), CDate("2012/10/24 12:00")) > 0 MsgBox "俺だ!俺だ!俺だ!!!!!!" Call test1 Loop End Sub あるいは、 Sub test2() If DateDiff("n", Now(), CDate("2012/10/24 12:00")) > 0 Then MsgBox "俺だ!俺だ!俺だ!!!!!!" Call test2 End If End Sub nはsにして秒でもいいですが。 DateDiffの使い方と、時刻設定は検索してください。 また、不等号の向きも慎重に。 設定を誤ると無限ループです。
その他の回答 (5)
- piroin654
- ベストアンサー率75% (692/917)
>これは2012/10/24 12:00より前なら >msgboxを表示するって事でしょうか。 そうです。簡単に言えば、 2012/10/24 12:00 - Now() > 0 ならば、その間メッセージボックスを表示し、 閉じてもまた表示する、ということです。
お礼
ありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
>必要であれば・無限ループしなければプログラミングとしてアリなのでしょうか? おそらく無限ループの前に、スタック領域が不足して、エラーが発生するのではないかと思います。 例えばこんな風にできますね。 数を増やすと、すぐにエラーが発生します。 Sub testR() Static i As Long If i < 10 ^ 3 Then i = i + 1 Call testR Else MsgBox "Complete! " & Str(i) i = 0 End If End Sub '// ''2つの数の最大公約数を求めるアルゴリズム(古典的) Sub Main() a = 81 b = 18 c = GCD(a, b) End Sub Function GCD(a, b) If b = 0 Then GCD = a Else GCD = GCD(b, (a Mod b)) End If End Function
お礼
ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
No3です。再度記述間違い。 No3の、 (以下No1の最初に続きます) は、 (以下No2の最初に続きます) です。重ね重ね失礼しました。
お礼
ご丁寧にありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
No2です。説明が抜けていました。 No2の最初に以下を。 引数無しでまともに自分自身を呼び出すのであれば 何かの番兵が必要ですが、自分自身以外に基準が 無いと当然ながら無限ループになるので、たとえば 時刻を基準にして (以下No1の最初に続きます) 失礼しました。
お礼
引数がない場合は時刻などを設定して無限ループにならないようにするわけですね。 詳しいご説明ありがとうございます。
- keithin
- ベストアンサー率66% (5278/7941)
自分を呼ぶことを「再帰呼び出し」と言います。 下記など一例として、参考にしてみて下さい。 http://www.moug.net/tech/exvba/0150117.html 参考URLでは、メインプロシジャから再帰呼び出し専用のサブプロシジャを呼び出す構造としています。 ここで再帰呼び出しプロシジャでは、自分自身に対して引数を渡すことでネスティングを実現している事に着目してください。 #他にも例えば、「VBA 再帰呼び出し ソート」といったキーワードで検索してみてください。
お礼
「再帰呼び出し」と言うのですか。 その言葉を知らなかったため調べられませんでした。ありがとうございました。
お礼
これは2012/10/24 12:00より前なら msgboxを表示するって事でしょうか。