• ベストアンサー

こういう使い方はありですか?

VBA初心者です。 Sub test() Dim i As Long If i <> 0 Then Call test End If End Sub のように、サブプロシージャーを実行している時に、 その実行してるプロシージャーを呼び出すのは 必要であれば・無限ループしなければプログラミングとしてアリなのでしょうか? 本を見てもこのような使い方をしてないので疑問に思いました。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

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の使い方と、時刻設定は検索してください。 また、不等号の向きも慎重に。 設定を誤ると無限ループです。

jklewr2342
質問者

お礼

これは2012/10/24 12:00より前なら msgboxを表示するって事でしょうか。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

>これは2012/10/24 12:00より前なら >msgboxを表示するって事でしょうか。 そうです。簡単に言えば、 2012/10/24 12:00  - Now() > 0 ならば、その間メッセージボックスを表示し、 閉じてもまた表示する、ということです。

jklewr2342
質問者

お礼

ありがとうございました。

回答No.5

>必要であれば・無限ループしなければプログラミングとしてアリなのでしょうか? おそらく無限ループの前に、スタック領域が不足して、エラーが発生するのではないかと思います。 例えばこんな風にできますね。 数を増やすと、すぐにエラーが発生します。 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

jklewr2342
質問者

お礼

ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No3です。再度記述間違い。 No3の、 (以下No1の最初に続きます) は、 (以下No2の最初に続きます) です。重ね重ね失礼しました。

jklewr2342
質問者

お礼

ご丁寧にありがとうございます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。説明が抜けていました。 No2の最初に以下を。 引数無しでまともに自分自身を呼び出すのであれば 何かの番兵が必要ですが、自分自身以外に基準が 無いと当然ながら無限ループになるので、たとえば 時刻を基準にして (以下No1の最初に続きます) 失礼しました。

jklewr2342
質問者

お礼

引数がない場合は時刻などを設定して無限ループにならないようにするわけですね。 詳しいご説明ありがとうございます。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

自分を呼ぶことを「再帰呼び出し」と言います。 下記など一例として、参考にしてみて下さい。 http://www.moug.net/tech/exvba/0150117.html 参考URLでは、メインプロシジャから再帰呼び出し専用のサブプロシジャを呼び出す構造としています。 ここで再帰呼び出しプロシジャでは、自分自身に対して引数を渡すことでネスティングを実現している事に着目してください。 #他にも例えば、「VBA 再帰呼び出し ソート」といったキーワードで検索してみてください。

jklewr2342
質問者

お礼

「再帰呼び出し」と言うのですか。 その言葉を知らなかったため調べられませんでした。ありがとうございました。