1ヶ月でWebデザイン・プログラミングスキルをオーダーメイドのカリキュラムで学べるスクール、それがWebCamp。

「数億規模スタートアップのCTO講師」と「エンジニアキャリア専門のポテパン」が贈る、実践型Rubyスクール。

ExcelVBAを使って入れ替えゲームを作る方法

Pocket

VBAで入れ替えゲームを作りましょう。

ルールは以下の通りとします。

・左右に3つずつ、同じ種類のカードが並んでいる

・空白のカードと模様の入ったカードを交換することにより左右の配置を

入れ替えることができればクリア

・カードは1つまでなら跳び越すことができる

 下準備

まずは『IMG』シートを作成し、カードの絵柄を図のように作成します。

今回は幅5×高さ6のセルを使ってピンクと青の星マークを作りましたが、星の上部に番号を入力しておきます。

そして2つの星の右側に空白のカード用の枠を作り、同じ位置に番号を入力します。

次に空の『MAIN』シートを作成します。ここに『IMG』シートのカードをコピーして並べていくので、

列幅を同じサイズに調整しておきます。

 共通定義

始めに新規のモジュールを作成し、『Option Base 1』と記述します。

通常配列の要素数は0から始まりますが、この設定により要素数が1からになります。

そして要素数7の配列『Stars』を定義します。

初期配置

それでは、新規のプロシージャ『MAIN』を作成してコードを書いていきましょう。

<コード①>

<解説>

配列Starsには各カードの種類を表す番号を格納していきます。

このゲーム内ではピンクが3枚、空白1枚、青が3枚という構成なのでStarsの要素数は7とします。

次に、『Gards_Repaint』プロシージャを作成してカードを描画します。

このコードの中では『IMG』シートからセルをコピーして『MAIN』シートへカードを並べていきます。

<実行結果>

それでは『MAIN』シートに『START』ボタンを作成し、上記コードを登録して実行してみましょう。

配列の要素数の順番で、左からカードが並んでいます。

クリック操作に対応

次に、セルをクリックすることにより各カードの場所を入れ替えるコードを入力していきます。

『MAIN』シートをダブルクリックしてシートのイベントを記述するためのモジュールを開き、

左上部のタブから『Worksheet』、右上部のタブから『SelectionChange』を選択して『SelectionChange』プロシージャを作成します。

このプロシージャは『MAIN』シート内で選択されているセルの位置が変更された場合を検知します。

つまり、『SelectionChange』でクリックイベントに対する処理を組み込むことができるのです。

<コード②>

<解説>

まずは変数pos_Starを定義し、左から何番目のカードが選択されたかを記録します。

選択されているセルの行数は『Target.Row』、列数は『Target.Column』という変数に格納されています。

というわけで、カードが配置されている範囲内のセルが選択されたら処理を行うようにします。

このゲームでは2枚のカードを選択して交換するので、1枚目のカード位置は『G10』セルに、2枚目のカード位置は『G11』セルに記録しています。

そしてカードが配置されていない場所のセルをクリックした場合は『end_Select_Star』ラベルへ移動し、『G10』『G11』セルをクリアして処理を終了しています。

<実行結果>

カードの枠線の色を変える

ところで、このままではどのカードが選択された状態か分かりづらいのでカードの枠線に色を付けます。

新しく『Paint_Line』というプロシージャを作成し、コード②の最後から呼び出すこととします。

<コード③>

<解説>

引数『myPos』で左から何枚目のカードが選択されているかを判断し、『myColor』で枠線の色を指定します。

ちなみに色の情報についてはコード④(後述)で説明しますがLong値で取得します。

そして対象となるセルの上下左右について『xlEdgeBottom』『xlEdgeTop』『xlEdgeRight』『xlEdgeLeft』という引数で

線の太さと色の設定を行っています。

<コード④(コード②の最後に記述)>

<解説>

カードが選択されている場合は『Paint_Line』へカードの座標と色の値を渡します。

色を表現するRGB関数に引数として赤・緑・青の割合を表す3つの数字を渡すと、戻り値としてLong値が返ります。

<実行結果>

この状態ではまだ変更した枠線の色は黒に戻りませんが、後に修正するのでこのままにしておきます。

カードの場所を交換

<コード⑤(コード④の続きに記述>

<解説>

まずはカードが2枚選択されていることをセルG10・G11で確認します。

次に同じカードが選ばれている場合や両方のカードが星マークである場合・

カードの距離が2枚以上離れている場合もカードの交換はできないので処理を中断します。

これらの条件に当てはまらない場合は各カードの番号を配列『Stars』に格納して場所を交換します。

そして『Cards_Repaint』でカードを再描画し、枠線の色を黒に戻します。

<SelectionChangeのエラーを修正>

ところで、ここまでのコードを書いた状態でMAINシートをクリックすると枠線が点滅したような状態になり、

入力処理を受け付けなくなってしまいます。

これはSelectionChange内のコードにいずれかのセルを選択する処理がある場合、

再度SelectionChangeのイベントが発動し、コードが無限にループしてしまうことによる現象です。

こうなってしまうとExcelがフリーズして強制終了するか、『Ctrl』+『Pause』キーを押して

VBAの処理を強制的に中断するしかありません。

このようにイベントが連鎖的に発生することを防ぐために、『EnableEvents』のステータスを

Falseにする処理を追記します。

また、カードのクリック処理を再度受け付けたい場面では『EnableEvents』のステータスはTrueへ修正しましょう。

<コード⑥:MAINプロシージャに赤字部分を追記>

<コード⑦:SelectionChangeプロシージャの最初と最後に赤字部分を追記>

<解説>

イベントの連鎖を止めたい場合にEnableEventsのステータスをFalseに、

クリックイベントを再度受け付けたい場合にTrueへ修正しています。

なお、SelectionChangeではend_Select_Starを経由して終了した場合と経由せずに終了した場合の

2パターンについて修正が必要な点に注意してください。

<実行結果>

カードの位置をクリックで入れ替えられるようになりました。

採点

いよいよ、カードの並び替え結果を採点してみましょう。

<コード⑧:コード⑦の途中に記述>

<解説>

配列『Stars』に各カードの番号を格納し、左から3枚目までが青い星、4枚目が空白、

5枚目から右端までがピンクの星の場合にクリアメッセージを表示します。

<実行結果>

補足

ここまででコードは完成ですが、カード上部に表示されている番号はゲーム上不要なので

『IMG』シートで文字色を白に変更し、見えないようにしておきましょう。

まとめ

入れ替えゲームではカードの柄をIMGシートに用意し、カードの位置を配列で管理します。

そしてカードの入れ替えはSelectionChangeのイベントを使用しますが、

SelectionChangeはイベントの連鎖が発生しやすいのでEnableEventsのステータスを適宜調整します。

そしてカードの枚数や模様を変えればまた違った雰囲気で楽しめそうですね。

投稿者:プロスタ編集部

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

おすすめスクール

全国30校舎で展開されるヒューマンアカデミーのWeb講座は修了者数4万人超、講師とカリキュラムの満足度がどちらも9割を超えています。就職や転職に必要なレベルの実務スキルを身に付けられます。

初心者がプログラミングで挫折しない学習方法を無料動画で公開中。オンラインに特化したプログラミングスクール「TechAcademy(テックアカデミー)」が解説。

この記事が気に入ったら
いいね!しよう

プロスタの最新情報をお届けします

あわせて読みたい

関連記事

イチ押しランキング

1リナックスアカデミー

リナックスアカデミー

2システムアーキテクチュアナレッジ

システムアーキテクチュアナレッジ
ページ上部へ戻る