2006 年 5 月 12 日 17 時 31 分

ローダのテスト


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


さて、シートから問題を読めるようになったはずなので、
正常に読み出せているか、テストをしてみよう。

まず、当然ながら問題を用意する必要がある。
5/5 の日記に、適当に作った問題の画像を載せているので、
これを使ってテストをすることにする。

http://mixi.jp/view_diary.pl?id=129399396&owner_id=2300658

まずはこれをシートに入力しよう。
罫線は関係ないが、見やすくために入れておく。
そして、入力が終わったら、解答欄部分を選択して、
VBE の環境に戻って、テストコードを書く。

Excel や Word の VBA の 開発環境には
標準モジュールの中にある Sub プロシージャを、
直接実行することができる機能がある。

あらかじめプロシージャをコードエディタで選択しておくと、
F5 一発で、ダイアログも何も出ずにいきなり実行できる。
テストにはもってこいだ。

プログラムの起動は、Solve マクロから行なうので、
Solve の中にテストコードを書こう。
コードを書いている途中でも F5 叩けるので楽だ。

また、IDE 上ではシートの状態が見えないので、
テスト結果は、イミディエイトウィンドウに出力する。
そうするとウィンドウを切り替える必要もなくなる。
先にセル範囲を選んでおいたのはそのためだ。

では、書く。

    Public Sub Solve()

        Dim oLoader As PuzzleSheetLoader
        Dim oHints  As ArrayList
        Dim i As Long
        Dim j As Long
   
        Set oLoader = New PuzzleSheetLoader
        Call oLoader.Construct(Selection)
   
        Debug.Print "Width: "; oLoader.Width
        Debug.Print "Height: "; oLoader.Height

        For i = 0 To oLoader.Width - 1
            Debug.Print "Column"; i; ":";
            Set oHints = oLoader.ColumnHints(i)
            For j = 0 To oHints.Count - 1
                Debug.Print oHints(j);
            Next
            Debug.Print
        Next

        For i = 0 To oLoader.Height - 1
            Debug.Print "Row"; i; ":";
            Set oHints = oLoader.RowHints(i)
            For j = 0 To oHints.Count - 1
                Debug.Print oHints(j);
            Next
            Debug.Print
        Next

    End Sub

最初に PuzzleSheetLoader のインスタンスを作成し、
Excel の選択範囲(Selection)を読み込ませる。
後はプロパティをダンプしよう。

イミディエイトウィンドウへの出力は、
Debug.Print ステートメントを使う。
こいつは、カンマかセミコロン区切りで値を受け取り、
データ型なんてお構いなく出力してくれる。

    Debug.Print "Width: "; oLoader.Width
    Debug.Print "Height: "; oLoader.Height

セミコロンで区切った場合は、連続して値が出力され、
カンマで区切った場合は、14 文字のタブ間隔で出力される。

次に列ヒント値だが、列自体が複数あり、
ColumnHints(~) の戻り値は ArrayList である。
そのため、2 重ループを書いて片っ端から出力する。

Debug.Print は自動的に改行を追加するが、
最後にセミコロンを書いておけば、
改行を抑制することができる。

    Debug.Print "Column #"; CStr(i); ":";

逆に、何にも値がない Debug.Print は改行だけを出力する。

    Debug.Print

つまり、Debug.Print; なんてすると何もしないわけだ。


では F5 を叩いて実行する。

    Width: 10
    Height: 10
    Column 0 : 5
    Column 1 : 1  1
    Column 2 : 1  5
    Column 3 : 1  1
    Column 4 : 1  7
    Column 5 : 1  1  1
    Column 6 : 1  5  1
    Column 7 : 1  1  1
    Column 8 : 6  1
    Column 9 : 5
    Row 0 : 4
    Row 1 : 2  2
    Row 2 : 1  1  1
    Row 3 : 1  1  1  1  2
    Row 4 : 1  1  1  1  2
    Row 5 : 1  1  1  1  2
    Row 6 : 3  1  1  2
    Row 7 : 6  1
    Row 8 : 1  1
    Row 9 : 3

正常に読み込めているようだ。

Debug.Print でセミコロンを指定したにも関わらず、
値の間に空白が入っているのは、
Debug.Print が数値型を出力する際に、
前後に空白をつけて書式化して文字列出力するからだ。
(前の空白は符号用なので、負の値なら 「-」 になる)

いやなら、CStr や Format 系関数を明記して、
書式化すれば、思うとおりに出力される。
今回は書式なんて重要でないのでこれでよし。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.