第3話 for文型プログラムの解説その2

お約束の通り、後2,3回かけてプログラムを解説していきます。
第11講のプログラムは初心者の方には、
かなり難解かと思われますので、
順を追って説明したいと思います。

Private Sub CommandButton1_Click()

  Dim i As Integer, j As Integer, k As Integer, l As Integer, h1 As Integer, h2 As Integer, jyn(3) As Integer
  Dim sousuu As Long


  For i = 1 To 3
    jyn(1) = i

    For j = 1 To 3
      jyn(2) = j
      h1 = 1
      For k = 1 To 1
        If jyn(2) = jyn(k) Then
          h1 = 0
          Exit For
        End If
      Next

      
If h1 = 1 Then
      
  For k = 1 To 3
          jyn(3) = k
          h2 = 1
          For l = 1 To 2
            If jyn(3) = jyn(l) Then
              h2 = 0
              Exit For
            End If
          Next

          
If h2 = 1 Then

            sousuua = sousuu Mod 8
            sousuus = Int(sousuu / 8)
            sousuu = sousuu + 1

            For l = 1 To 3
              Cells(5 + sousuus * 2, 1 + l + sousuua * 4) = jyn(l)
            Next
          End If

        Next
      End If
    Next
  Next

End Sub

まず、最初のループ
 For i = 1 To 3
    jyn(1) = i
      ・
      ・
      ・
  Next
は何をやっているのでしょうか。

ここでは、ピンクのマスに1から3まで入れています。
jyn(1)は1マス目を意味しているわけです。

これがわかれば、次のループ
    For j = 1 To 3
      jyn(2) = j
      h1 = 1
      For k = 1 To 1
        If jyn(2) = jyn(k) Then
          h1 = 0
          Exit For
        End If
      Next
 
      ・
       ・
       ・
    Next
はもうおわかりでしょう。

のピンクに1から3まで入れループです。
では
      For k = 1 To 1
        h1 = 1
        If jyn(2) = jyn(k) Then
          h1 = 0
          Exit For
        End If
      Next

の部分では何をしているのでしょうか。
それはjyn(2)とjyn(1)の数字が重ならないようにしているのです。
For k = 1 To 1は結局k = 1しか動きません。
したがって、
        If jyn(2) = jyn(k) Then
          h1 = 0
          Exit For
        End If
では、もしjyn(2)=jyn(1)ならばh1=0として
      If h1 = 1 Then
  
       ・
         ・
         ・ 
  
    End If
を実行させないわけです。
例えば、一番最初のループi = 1、j= 1では
jyn(1)=1 、jyn(2)=1で
      If h1 = 1 Then
  
       ・
         ・
         ・ 
  
    End If
は実行されずに、Nextによってj=2となり、

となるのです。
      If h1 = 1 Then
      
  For k = 1 To 3
          jyn(3) = k
          h2 = 1
          For l = 1 To 2
            If jyn(3) = jyn(l) Then
              h2 = 0
              Exit For
            End If
          Next

        Next
          ・
          ・
          ・

      End If
も同様で、jyn(3)=jyn(1)またはjyn(3)=jyn(2)ならば、

          If h2 = 1 Then

            sousuua = sousuu Mod 8
            sousuus = Int(sousuu / 8)
            sousuu = sousuu + 1

            For l = 1 To 3
              Cells(5 + sousuus * 2, 1 + l + sousuua * 4) = jyn(l)
            Next
          End If

実行されず、Nextが2回行われて、
k=3になって、

となり、1個目の順列ができあがるのです。
kは3が最後ですから、2番目のループ
    For j = 1 To 3
      jyn(2) = j
      h1 = 1
      For k = 1 To 1
        If jyn(2) = jyn(k) Then
          h1 = 0
          Exit For
        End If
      Next
 
      ・
       ・
       ・
    Next
に戻り、j=3となり再び3番目のループ
        For k = 1 To 3
          jyn(3) = k
          h2 = 1
          For l = 1 To 2
            If jyn(3) = jyn(l) Then
              h2 = 0
              Exit For
            End If
          Next

に入ります。k=1のとき、jyn(1)とjyn(3)がそれぞれ1になり

          If h2 = 1 Then

            sousuua = sousuu Mod 8
            sousuus = Int(sousuu / 8)
            sousuu = sousuu + 1

            For l = 1 To 3
              Cells(5 + sousuus * 2, 1 + l + sousuua * 4) = jyn(l)
            Next
          End If

は実行されずNextによってk=2となり、

の2番目の順列ができあがります。
k=3のときは、2マス目と3マス目が同じになってしまうので

          If h2 = 1 Then

            sousuua = sousuu Mod 8
            sousuus = Int(sousuu / 8)
            sousuu = sousuu + 1

            For l = 1 To 3
              Cells(5 + sousuus * 2, 1 + l + sousuua * 4) = jyn(l)
            Next
          End If

は実行されず、jの1回目のループ、kの2回目のループが終了となり、
 For i = 1 To 3
    jyn(1) = i
      ・
      ・
      ・
  Next
Nextによってi=2となります。
こうして、jの2回目のループ、kの3回目のループに入り、
3個目の順列

ができあがります。
続いて、kの4回目のループ(jはまだ2回目のループ)によって、
4個目の順列

つぎに、jの3回目のループ(i=3)、kの5回目のループによって、
5個目の順列

最後に、kの6回目のループ(jはまだ3回目のまま)によって
最後の順列

ができあがるのです。

これで一通りトレースが終わりましたが、もう一度読者の皆さんは、
次のループをご自分でトレースしてみてください。

では、まだ3次順列のループ版の解説が終わっていませんが、
大分長くなったので本日はここまでとします。


第2話へ 第4話へ