仮想通貨100種類以上紹介のブログ……を目指して(^^;

プログラミング講座2-3・ライフゲーム-セルの操作部分を先に作ってみよう

 

さて、どこから作りましょうか?(^^;

まず書いてみようって趣旨の講座なので、きっちりフローチャートやらを書いて進める気はないです。とすると、どっから手をつけるか悩みますねw

まずは簡単に視覚的な動きが見えた方が良いなぁと思うので、セルを操作する部分を先に作ってしまいましょう。

せっかくライフゲームを作るのに、初期の「生」「死」の状態をつくるのにいちいちセルの塗りつぶしをするのは、面倒ですよね。できれば、ワンクリックで生死が入れ替わるようにしたいところです。

この操作部分を初めに作ってしまいましょう。

シートの操作部分はSheet1(board)に書く。

さて、前回のファイルを開いたら、まずはリボンの下あたりに「セキュリティの警告 マクロは無効にされました」とかいうメッセージが出ているはずなので、「コンテンツの有効化」とか「オプション」というところをクリックして、マクロを有効にしてください。(Officeのバージョンによって若干異なります。)

で、早速VBEを開いてみましょう(Alt+F11)前回は標準モジュールに定数を書きましたが、今回はシートの操作にかかわる部分なので、「Sheet1(board)」のところにコードを書きます。左側のVBAProjectのところの「Sheet1(board)」をダブルクリックします。すると、右側にSheet1のエディタが開きます。

早速、書きたいところですが、今回はユーザーの操作に対しての応答部分(イベントハンドラなんて言い方をすることがあります。VBAではあまり使わない言葉かもしれません)を作るワケなので、それはVBEの自動入力に頼ってみたいと思います。

エディタ部分の左上に「(General)」右上に「(Declarations)」と書いてある部分があると思います。ここをいじると勝手にイベントハンドラができあがります。

では、「(General)」を「Worksheet」に変更しましょう。すると、右の「(Declarations)」は「SelectionChange」に変わり、エディタ部分には下記のコードが自動で入力されたハズです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

この2行のコードの間に表示されたコードは選択しているセルを変更した際に実行されます。まさにライフゲームの操作にうってつけの機能ですね。では、この間にセルを赤く塗りつぶす式を書きます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Interior.Color = RGB(255, 0, 0)
End Sub

さて、ここまでできたら、まず保存して、ちょっと実際にいじってみましょう。クリックするだけで塗りつぶしができるようになったハズです。ほんのちょっとしたことですが、こういうふうに目に見え、自分で操作できるものができると、すごく作った感じになれませんか?

さて、このプログラムにはいくつか問題があります。まずはこの2点でしょうか。

  • 塗りつぶしたところを元に戻せない
  • 灰色の部分も塗りつぶせてしまう

では、順番に解決していきましょう。

塗りつぶしを元に戻す

塗りつぶしをなしにしたい時は「Target.Interior.Color = xlNone」と書けばよいです。ただし、選んだセルが塗りつぶされている場合には塗りつぶしをなしにし、塗りつぶされている場合には塗りつぶすという条件分岐が必要となります。これはIF文を使って制御します。IF文のお話は前に少し書きましたが、今回の条件は塗りつぶされているか塗りつぶされていないかの1点だけなので、下のような形になります。

If 条件 Then

    ‘条件に合えばここが実行される。

Else

    ‘条件に合わなければここが実行される。

End If

そして、条件はもちろん「Target.Interior.Color = RGB(255, 0, 0)」であるかどうかですね。まとめると、以下のようなコードとなります。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    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」をつけることで、選んだセルの個数を取ることができるので、これを使用します。

これをすべてまとめると、下のようになります。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    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

いかがでしょうか?ここまでかけたら、またちゃんと動くか試してみましょう。さっきよりも思い通りに動くのではないでしょうか?

前へ ・ 目次へ ・ 次へ

SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です