2013/06/01

【VBA】デシジョンテーブルを自動生成する

ビジネスルールの整理、要件・仕様の整理、ソフトウェアテスト(特に単体テスト)のテスト仕様書の作成でよく用いられる手法が「デシジョンテーブル」です。

デシジョンテーブル(判断表)
複数の条件の組み合わせと、それに対応してどのような処理を行うのかを表す、表形式表現。
仕様を記述する上では日本語等の文章表現で記述するよりも誤謬性が低く、有用性が高い。

引用元:はてなキーワード(デシジョンテーブル)

このようにデシジョンテーブルは使われています。
ただ、条件が少ないうちは良いのですが、多くなるとデシジョンテーブルを作ること自体に時間がかかってしまいます。

その中でも、「Y/N」を作るところだけでも自動化しようと思いマクロを作りました。





デシジョンテーブルを自動生成する




デシジョンテーブルを使うと仕様の整理や、曖昧な部分を潰すことができますが
条件が多いとパターン数は「2のn条」となり膨大な数になってしまいます。

デシジョンテーブルを作る際に、せめて「Y/N」だけでも自動化できるように作ったマクロです。

Option Explicit

Private Const TRUE_MARK = "Y"
Private Const FALSE_MARK = "N"

' デシジョンテーブル作成
Sub DrawTable()
    Dim conditionNumber As Integer
    
    conditionNumber = InputBox("条件数を入力してください。", "条件数の指定", 1)
    
    Dim currentRow, currentCol As Long
    currentRow = ActiveCell.Row()
    currentCol = ActiveCell.Column()
    
    Dim countRow As Long
    Dim countCol As Long
    Dim countDecision As Long    ' 「YN」のひとかたまりのループ数
    Dim countYN As Long          ' YとNのそれぞれのループ回数
    countDecision = 1
    countYN = 2 ^ conditionNumber
    
    Dim i, j As Long
    
    ' 行ループ
    For countRow = currentRow To currentRow + conditionNumber - 1
        countCol = 1
        
        ' デシジョンループ(YNの塊)
        For i = 1 To countDecision
            ' Trueループ
            For j = 1 To countYN / 2
                ActiveSheet.Cells(countRow, countCol) = TRUE_MARK    ' 横方向
                'ActiveSheet.Cells(countCol, countRow) = TRUE_MARK   ' 縦方向
                countCol = countCol + 1
            Next
            
            ' Falseループ
            For j = 1 To countYN / 2
                ActiveSheet.Cells(countRow, countCol) = FALSE_MARK   ' 横方向
                'ActiveSheet.Cells(countCol, countRow) = FALSE_MARK  ' 縦方向
                countCol = countCol + 1
            Next
        Next
        
        countDecision = countDecision * 2
        countYN = countYN / 2
    Next
End Sub 


3、4行目:True/Falseの記号を設定しています。用途に合わえて変えてください。
33、34行目と40、41行目:デシジョンテーブルを展開方向に合わせて編集してください。
※Excelのバージョンにより列数・行数に限界があります。それを超えるとオーバーフローエラーになります

同じ値が連続するセルを結合する」も合わせてどうぞ!


アルゴリズム



備忘のため、マクロのアルゴリズムを説明します。

デシジョンテーブルをつくると下図の様な表になります。

この表から法則性を見つけます。

YとN、それぞれ何個連続で横に並ぶか?


1行目のYが連続で並ぶ数は「2のn乗 / 2」、Nも同様
2行目のYが連続で並ぶ数は「(2のn乗 / 2) / 2」、Nも同様
3行目のYが連続で並ぶ数は「((2のn乗 / 2) / 2 ) / 2」、Nも同様
・・・
m行目のYが連続で並ぶ数は「直前行の1/2」、Nも同様


YNのセットが何個あるか?


1行目のYとNのセットは1つ
2行目のYとNのセットは2つ
3行目のYとNのセットは4つ
・・・
o行目のYとNのセットは「直前行の2倍


擬似言語で表現するとこんな感じ


■条件数分だけ行ループする
| ・1 → 行カウント

|    ■YNのセット分だけループする
|    |   ■Yを連続で並ぶ数だけループする
|    |   |   ・指定セルに「Y」を設定
|    |   |   ・行カウント + 1 → 行カウント
|    |   ■
|    |
|    |   ■Nを連続で並ぶ数だけループする
|    |   |  ・指定セルに「N」を設定
|    |   |  ・行カウント + 1 → 行カウント
|    |   ■
|    ■

|    ・YNのセット数 * 2 → YNのセット数
|    ・連続して並ぶ数 / 2 → 連続して並ぶ数




デシジョンテーブルについての所感



メリット

  • バグを見つけることができる
  • 不明確な仕様を明確にできる
  • 仕様を文章で書くより、正確に伝わる

デメリット

  • 条件はせいぜい6個が限界
  • 作成と分析に時間がかかる
  • 条件の追加、削除が困難

条件数が多いと時間がかかるし、間違えも起こる。
仕事で 32,768パターンのデシジョンテーブルを作ったときは目から血が出るかと思った。

デメリットもあるが、メリットも十分あるため、日頃の複数条件の整理に
デシジョンテーブルを使うクセをつけると無駄な時間を過ごさなくて済む。




以上

0 件のコメント :

コメントを投稿