ここから本文です

Dim data(6) As Variant Dim disp(6) As Variant Dim flg(5) As Integer Dim i ...

mhy********さん

2020/1/2117:08:14

Dim data(6) As Variant
Dim disp(6) As Variant
Dim flg(5) As Integer
Dim i As Integer

Function tmp(num As Integer)
Dim count As Integer
count = 0
If num = 5 Then
For i = 0 To 4
Sheets("Sheet2").Cells(count + 1, i + 1) = disp(i)
Next
count = count + 1
Else
For i = 0 To 5
If flg(i) = 0 Then
flg(i) = 1
disp(num) = data(i)
tmp (num + 1)
flg(i) = 0
End If
Next
End If


End Function

Sub per()
For i = 0 To 4
data(i) = Sheets("sheet1").Cells(1, i + 1)
disp(i) = Sheets("sheet1").Cells(1, i + 1)
Next

tmp (0)

End Sub

打ち込んだデータ5の順列(並び方5!通り)を表示するプログラムなのですが、
関数tmpでなぜか end function まで行った後に必ずflg(i)=0 に行き(i=6)エラーとなります。

なぜでしょうかよろしくお願いいたします。

閲覧数:
24
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hot********さん

2020/1/2208:49:03

temp内のループ用のiをモジュールレベルでグローバルに宣言してるから。
グローバルで宣言されてるのでtmp内から再帰して、戻った時に6になったままになるから。

とりあえずtmp内に
Dim i As Integer
が無ければおかしい。

質問した人からのコメント

2020/1/22 14:38:18

ありがとうございました!
無事解決しましたが、今度はcountが再帰のたびリセットされてしまうので、
結果が上書きされてしまいました・・・。

ベストアンサー以外の回答

1〜1件/1件中

glo********さん

2020/1/2209:04:21

変数iを定義する場所が悪いんじゃないかな。

プロシージャごとに定義しないとこれでは他のプロシージャと共有になる。

それは再帰処理中も言えることで、
tmp (num + 1)
から戻ってきた時点、直前に行ったtmp内で実行されたForNext終了時の値のi=6になる。

ややこしい、わかるかな?

とりあえず各プロシージャごとに変数iを定義すればいいと思う。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる