第2講 試行錯誤法でヒント数0数独の解答を作る(1)
第4話 5次順列自動生成ソフト
※本ページは初心者のための excel 2016 マクロ vba 入門講義 基礎から応用まで 第1部の第8講第7話を再利用しています。

po
wqe

を実現するプログラム例
Private Sub CommandButton1_Click()

  CommandButton2_Click
  f '5次順列作成プロシージャ

End Sub
Sub f()

  Dim i As Integer, j As Integer, k As Integer
  Dim l As Integer, m As Integer, n As Integer, cn As Integer
  Dim a(5) As Integer '順列を収納する配列
  cn = 0 'cnは順列総数をカウントする変数、0に初期化
  For i = 1 To 5
    a(0) = i 'セル番号0のセルに1から5まで入力
    For j = 1 To 5
      If j <> a(0) Then
        a(1) = j 'セル番号1のセルに1から5まで入力
        For k = 1 To 5
          If k <> a(0) And k <> a(1) Then
            a(2) = k 'セル番号2のセルに1から5まで入力
            For l = 1 To 5
              If l <> a(0) And l <> a(1) And l <> a(2) Then
                a(3) = l 'セル番号3のセルに1から5まで入力
                For m = 1 To 5
                  If m <> a(0) And m <> a(1) And m <> a(2) And m <> a(3) Then
                    a(4) = m 'セル番号4のセルに1から5まで入力
                    Call g(cn, a())
                    cn = cn + 1
                  End If
                Next
              End If
            Next
          End If
        Next
      End If
    Next
  Next

End Sub

Sub g(cn As Integer, a() As Integer) '順列表示プロシージャ

  Dim i As Integer
  For i = 0 To 4
    Cells(5 + Int(cn / 5), 1 + i + 6 * (cn Mod 5)) = a(i)
  Next

End Sub

Private Sub CommandButton2_Click()

  Rows("4:20000").Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub
参考ダウンロード添付ファイル

おそらく皆さんは、次は6次順列自動生成だよと言われると、
うんざりではないでしょうか。
実は、For文で組んでもらった理由は、
この方法では81次順列生成は不可能に近いということを実感していただくためです。
本当に忍耐強い人ならば、出来るかもしれませんが、
私ならNOです。

ではどうしたらよいでしょうか。
初心者のレベルを卒業した皆さんであればおわかりですね。
前に、私の魔方陣自動生成の研究においてブレークスルーになったのは、
魔方陣自動生成は、n次順列自動生成を応用すればよいと気がついた時点だと前に述べましたが、
実は、飛躍を支えたものはもう一つあったのです。
プロシージャの再帰的使用によってn次順列が出来る!です。
これによって、一気にn次順列自動生成が可能になります。
つまり、For文では組むのが大変であるのに加えて汎用性がないのに対して、
再帰的使用を使えば簡単に汎用的なプログラムが組めるのです。
といってもいきなりn次順列自動生成ソフトと組めといわれても・・・
という方も多いでしょうから、
まず、1+2+3+・・・+nを計算するプログラムを再帰的使用で組んでみましょう。
001C4に数字を入力して実行ボタンを押すと、
002
消去を押すとF4が消える
Functionプロシージャで組んでもよいですが、
後のつながりのためにSubプロシージャで組みましょう。
Subプロシージャで組むとなると余り望ましいとは言えないグローバル変数を用意しなければなりませんが、
プログラムを複雑にせず、見通しのよりプログラムを組むためには、
時にはグローバル変数も必要となります。




第3話へ 第5話へ



トップへ