t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 順列の出力

以前購入して積ん読書になっていた以下の書籍に取り掛かった。

Excel VBAでパズルを解こう

Excel VBAでパズルを解こう

最初の問題は順列の出力。

順列というのは、特定のモノを並べる順番が何種類あるかを求めるもの。

1個なら1とおり。
2個なら2とおり。
3個なら6とおりある。


まずは自分の頭で考えてみるが、、



f:id:t-hom:20150904134802p:plain


やめた。

答えを見よう。。


とりあえず丸写しして動かしてみようかと思ったけれど、コードが結構長くて面倒くさい。
ソースからロジックの肝だけ読み取って、自分で書くことにした。

出来たのがこれ。

Sub MyPerm1()
    For i = 1 To 3
        For j = 1 To 3
            For k = 1 To 3
                If i <> j And j <> k And i <> k Then
                    Debug.Print i, j, k
                End If
    Next k, j, i
End Sub

イミディエイトウインドウに以下のように出力される。

 1      2     3 
 1      3     2 
 2      1     3 
 2      3     1 
 3      1     2 
 3      2     1 

上のやり方だと、4個にしようと思ったらコードを書き直す必要があるが、とりあえず初回なのでそこは無視無視。

ロジックとしては、全パターンまわしてそのうち同じ値が登場するものを省くだけの簡単なものだ。


数字以外にも対応させてみた。

Sub MyPerm2()
    Dim arr() As String: arr = Split("A B C", " ")
    Dim x, y, z
    For Each x In arr
        For Each y In arr
            For Each z In arr
                If x <> y And x <> z And y <> z Then
                    Debug.Print x, y, z
                End If
    Next z, y, x
End Sub

次は、個数が増えても汎用的に使える方法を学ぶ予定である。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。