1,2,3,4,5の数列から3の数の組合せをワークシートに表示するプログラムを作っています。
このソースは以前他の質問に載っていたものを自分用に多少アレンジしたものです。構造は再帰呼び出しを使って、123、124、125、134、135、145、234、235…345という形で結果を出力します。いろいろと試してみて、計算結果は正しいとわかったのですが、デバックをしていて1つどうしても理解できないことがありました。計算結果が145から234になるとき、カーソルがSub combiPrのEnd subを指したあと直前のEnd ifに移ります。その後Forに移って234以降の計算を始めます。どうしてEnd Subからこのような動作をするのかわかる方いらっしゃいましたら是非ワケを教えてください。よろしくお願いしますm(_ _)m
Const m As Integer = 3 '←取り出す個数
Const n As Integer = 5 '←サンプル数
Dim rStr As String
Dim mRow As Integer
Dim Nest As Integer
Dim A(10) As Variant
Sub combi()
Cells.ClearContents
mRow = 0
Nest = 0
combiPr (0)
End Sub
Sub combiPr(n1)
Dim mCol As Integer
For nn = n1 + 1 To n - m + Nest + 1
Nest = Nest + 1
A(Nest) = nn
If Nest = m Then
mRow = mRow + 1
For mCol = 1 To m
Worksheets(1).Cells(mRow, mCol).Value = A(mCol)
Next
Else
Call combiPr(nn)
End If
Nest = Nest - 1
Next nn
End sub
No.2ベストアンサー
- 回答日時:
p1(プログラム1)がp2を呼び出し、p2がp3を呼び出し、という再帰呼び出しをビジュアルで書くと下。
p1始
p2始
p3始
p3終
p2終
p1終
提示されたソースでいうと下(だと思う)。
組み合わせの1桁目をセットするプログラム(プロシージャ)をcombiPr1と書くことにする。
combiPr2が、combiPr3を呼び出しcombiPr3が答えを出力して終了(End Sub)、combiPr2のcombiPr3呼び出し行に戻る。
なるほど!わかりやすい御説明ありがとうございました。私の再帰呼び出し文の理解が不十分だったようです。呼び出す前のプロシージャが生きていることを忘れていました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
Javaを使った行列計算
-
やってみてもわからないので教...
-
変化させるセルが変化しない
-
VBAでの勤務時間計算
-
Excel VBAの残業時間の合計計算...
-
[ASP]日付と時間の比較
-
ファイルから数式を読み込む
-
SNRの計算の仕方
-
C# 計算処理中に実行中ウィン...
-
MATLABの積分について
-
モジュラス103の計算とは何でし...
-
C言語で、漸化式を使ってパスカ...
-
VBAで関数をつくる
-
0xf0=256?
-
エクセルで特定のセルのみを任...
-
傾いた四角形内の範囲の条件式
-
VBとVBAの違い
-
Java 電卓の連続計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
引き放し法による除算アルゴリ...
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
Perlで時間の計算
-
CRC8を教えてください
-
傾いた四角形内の範囲の条件式
おすすめ情報