このアーカイブは同期化されません。 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 系関数を明記して、
書式化すれば、思うとおりに出力される。
今回は書式なんて重要でないのでこれでよし。