さて、どこから作りましょうか?(^^;
まず書いてみようって趣旨の講座なので、きっちりフローチャートやらを書いて進める気はないです。とすると、どっから手をつけるか悩みますねw
まずは簡単に視覚的な動きが見えた方が良いなぁと思うので、セルを操作する部分を先に作ってしまいましょう。
せっかくライフゲームを作るのに、初期の「生」「死」の状態をつくるのにいちいちセルの塗りつぶしをするのは、面倒ですよね。できれば、ワンクリックで生死が入れ替わるようにしたいところです。
この操作部分を初めに作ってしまいましょう。
シートの操作部分はSheet1(board)に書く。
さて、前回のファイルを開いたら、まずはリボンの下あたりに「セキュリティの警告 マクロは無効にされました」とかいうメッセージが出ているはずなので、「コンテンツの有効化」とか「オプション」というところをクリックして、マクロを有効にしてください。(Officeのバージョンによって若干異なります。)
で、早速VBEを開いてみましょう(Alt+F11)前回は標準モジュールに定数を書きましたが、今回はシートの操作にかかわる部分なので、「Sheet1(board)」のところにコードを書きます。左側のVBAProjectのところの「Sheet1(board)」をダブルクリックします。すると、右側にSheet1のエディタが開きます。
早速、書きたいところですが、今回はユーザーの操作に対しての応答部分(イベントハンドラなんて言い方をすることがあります。VBAではあまり使わない言葉かもしれません)を作るワケなので、それはVBEの自動入力に頼ってみたいと思います。
エディタ部分の左上に「(General)」右上に「(Declarations)」と書いてある部分があると思います。ここをいじると勝手にイベントハンドラができあがります。
では、「(General)」を「Worksheet」に変更しましょう。すると、右の「(Declarations)」は「SelectionChange」に変わり、エディタ部分には下記のコードが自動で入力されたハズです。
End Sub
この2行のコードの間に表示されたコードは選択しているセルを変更した際に実行されます。まさにライフゲームの操作にうってつけの機能ですね。では、この間にセルを赤く塗りつぶす式を書きます。
さて、ここまでできたら、まず保存して、ちょっと実際にいじってみましょう。クリックするだけで塗りつぶしができるようになったハズです。ほんのちょっとしたことですが、こういうふうに目に見え、自分で操作できるものができると、すごく作った感じになれませんか?
さて、このプログラムにはいくつか問題があります。まずはこの2点でしょうか。
では、順番に解決していきましょう。
塗りつぶしをなしにしたい時は「Target.Interior.Color = xlNone」と書けばよいです。ただし、選んだセルが塗りつぶされている場合には塗りつぶしをなしにし、塗りつぶされている場合には塗りつぶすという条件分岐が必要となります。これはIF文を使って制御します。IF文のお話は前に少し書きましたが、今回の条件は塗りつぶされているか塗りつぶされていないかの1点だけなので、下のような形になります。
‘条件に合えばここが実行される。
Else
‘条件に合わなければここが実行される。
End If
そして、条件はもちろん「Target.Interior.Color = RGB(255, 0, 0)」であるかどうかですね。まとめると、以下のようなコードとなります。
If Target.Interior.Color = RGB(255, 0, 0) Then
Target.Interior.Color = xlNone
Else
Target.Interior.Color = RGB(255, 0, 0)
End If
End Sub
さて、次です。次もIF文でいけそうですね。「問題は条件をどうするか」と「その時の処理をどうするか」です。
条件については、前回、せっかくセルのサイズの定数を定義したので、サイズを超えた時にはコードが実行されないようにしようと思います。Targetの後に「.Row」をつけることで行番号を取得、「.Column」をつけることで列番号を取得することができるので、組み合わせれば作れそうですね。
それから、実行される処理については、強制的にプログラムを終了させるExit Subというのを使おうと思います。また、実行されるプログラムが1行の時はIF文も1行で済ませる短縮バージョンがあるので、それを使用します。
ついでにもう一つ、セルっていうのは、常に1つだけ選択するワケではなく、複数選択する場合があります。今回はこれもなしということにしたいと思います。これはTargetの後に「.Count」をつけることで、選んだセルの個数を取ることができるので、これを使用します。
これをすべてまとめると、下のようになります。
If Target.Row > YMAX Then Exit Sub
If Target.Column > XMAX Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Interior.Color = RGB(255, 0, 0) Then
Target.Interior.Color = xlNone
Else
Target.Interior.Color = RGB(255, 0, 0)
End If
End Sub
いかがでしょうか?ここまでかけたら、またちゃんと動くか試してみましょう。さっきよりも思い通りに動くのではないでしょうか?