この記事では、サンプルコードも交え、VBAを用いたゲームの作り方を解説します。
VBAでゲームを作る方法が知りたいな・・・
できれば考え方だけでなく、チュートリアルが欲しい・・
VBAはExcel業務を自動化できる言語ですが、少し工夫すればゲームを作ることができます。ただ、ゲームを作ろうとすると…ツールを作るときと根本的な考え方が違うため、作るのに苦戦する人も多いです。
こんにちは!フリーランスエンジニア兼テックライターの脇坂です。
この記事では、VBAでゲームを作るときの考え方・具体的なチュートリアルを解説します!
この記事はこんな人のために書きました。
- VBAのゲームの作り方を知りたい人
- 具体的なチュートリアルをもとにVBAでゲームを作りたい人
- VBAで希望のゲームを開発するには仕様/設計書が重要
- ゲーム開発を行うときは画面や機能のイメージを作成すると良い
- VBAのゲーム開発ではExcelの機能を最大限活用すべき
VBAでゲームを作るときの考え方
はじめに、VBAでゲームを作るときの考え方について解説します。VBAでゲームを作るときは、次のような流れで考えます。
- VBAでゲームを作るときの流れ
-
- ゲームの仕様を決める
- ゲームの設計をする
- VBAのコード以外の事前準備を終わらせる
- VBAで仕様に合わせて処理を作る
ゲームの仕様・画面設計はいくつか考えるポイントがあるので、先に考え方を解説しますね!
ゲームの仕様を決める
まず、ゲームの仕様を考えます。ゲームの仕様を考えるときは、最低限以下を考えましょう。
- ゲームの仕様で最低限考えること
-
- ゲームの概要
- ゲームのゴール
- 具体的なゲームの流れ
- 機能の一覧
ある程度ざっくりでもかまわないので、仕様を考えていきましょう。ゴール・ゲームの流れ・機能が決まったら、具体的な画面イメージを作っていきます。
ゲームの設計をする
次に、ゲームの設計をしていきます。仕様がある程度できていればすぐに作り始めることもできますが、詳細な処理や画面を決めておかないと・・・次のように作るのに時間がかかってしまいます。
- 設計をしなかった場合の悩み
-
- 画面や機能をどこまで作ればいいかわからないため、作りこみすぎる
- ボタンの名前や画面のレイアウトを作りながら悩むため、時間がかかる
具体的なVBAに書く処理のイメージ、作る画面のイメージを固めておくことでスムーズにゲームを作ることができるのです。次に、具体的なゲームの作り方を解説しますね。
なお、IT企業への転職や副業での収入獲得に向け、どの言語が自分にあうのか、どう学習を進めればいいのかなどがあいまいな人は「プログラミング学習プラン診断」をお試しください。
かかる時間は1分ほど。4つの質問に答えるだけで、あなたにあう言語や学習プランを診断してもらえます。
効率よくプログラミングを学習したい人は、ぜひ一度お試しください。
\ 4つの質問に答えるだけ /
VBAチュートリアル「クリックゲーム」の作り方
次に、VBAでゲームを作る具体的な方法を解説します。今回は、背景色が黒いセルをクリックした数を競う「クリックゲーム」を例に解説しますね。
「クリックゲーム」の仕様
まず、クリックゲームの仕様を考えていきます。先ほど解説した考え方で、以下のように仕様を決めました。
- クリックゲームの仕様
-
- 概要:制限時間が0になるまでセルをクリックし、得点を数えるゲーム
- ゴール:制限時間が0になったら終了
- 操作方法1:ゲームのやり方
1. スタートボタンを押す
2. セルの背景色が黒のセルをクリック
3. 制限時間が0になるまで2を行う- 操作方法2:ゲームを途中終了する方法
1. 終了ボタンを押す
- 機能一覧
-
- 制限時間をカウントする機能
- 背景色が黒のセルクリック時の得点追加機能
- クリック後にランダムで背景色が黒の位置を変える機能
- 処理途中停止機能
- 最高得点を更新する機能
これだけだとイメージしづらいので、次に設計をします。
クリックゲームを設計する
次に、クリックゲームを設計します。画面設計、詳細処理の設計の流れで解説しますね。
画面を設計する
まず、画面を設計していきます。Excelでゲームを作るときは、Excelシートがそのまま画面として使えるので、シートにゲームのイメージを作っていきましょう。今回は、次のように設計しました。
クリックゲームの画面イメージ:
大きく分けて、次のような画面の要素を用意しています。
- クリックゲームで用意した画面の要素
-
- ゲームのスタート・途中終了用のボタン
- 制限時間の表示セル
- 得点・最高得点の表示セル
- 黒い背景色のセルを表示するエリア
スタートボタンを押して、黒い背景色をクリックすると得点のセルの値が増えていくイメージですね。ここまで画面が設計出来たら、次にVBAの詳細処理を考えていきます。
詳細処理を設計する
次に、詳細処理を設計していきます。ここで1点注意点ですが、全ての機能をVBAだけで満たす必要はありません。たとえば、「クリック後に、ランダムで背景色が黒の位置を変える機能」はVBAで作らなくても「条件付き書式」を駆使すれば作ることができます。
今回は画面の左端の列(A列)に、数字を入れるエリアを用意しています。この値を変えると黒の背景色が変わるような条件付き書式を事前に設定しておくことで、A列の値を変えるだけで黒の背景色の位置を変更することができます。
このように、事前にExcelの既存機能で作りこめる箇所がないか考えるのもポイントですね。ここまでできたら、次のようにVBAの詳細処理を考えてきます。
- スタートボタンクリック時の処理
-
- 処理1:得点を0に変更
- 処理2:制限時間を20秒に変更
- 処理3:制限時間が0になるまでループ処理を実行
- 処理4:ループ処理内で制限時間が0になるまでカウントを1秒ずつ減らす
- 処理5:制限時間が0になったら、最高得点を更新
- セルの選択を変更したときの処理
-
- 処理1:選択したセルが点数更新の条件に合致しない場合は処理終了
- 処理1-1:背景色が黒以外のセルを選択したときは処理を強制終了
- 処理1-2:複数セルを一括で選択したときは処理を強制終了
- 処理2:得点を更新
- 処理3:A列の数値を更新して、黒い背景色のセル位置変更
- 終了ボタンをクリックしたときの処理
-
- 処理1:全ての処理を強制終了
- 処理2:得点・制限時間を0に変更
ここまでできれば、実際にコードを書いていきます。
VBAのコードを書く
次に、VBAでコードを書いていきます。ここからは、「VBAの処理全体コード + 細かい処理ごとのコード解説」の流れで解説していきますね。
スタートボタンクリック時の処理
まず、スタートボタンクリック時の処理について解説します。詳細設計で考えた処理に合わせて番号を振っているので、合わせてみてみてください。
- スタートボタンクリック時の処理
-
- 処理1:得点を0に変更
- 処理2:制限時間を20秒に変更
- 処理3:制限時間が0になるまでループ処理を実行
- 処理4:ループ処理内で制限時間が0になるまでカウントを1秒ずつ減らす
- 処理5:制限時間が0になったら、最高得点を更新
スタートボタンクリック時の処理のコード:
Dim judgeEndBtnClick As Boolean '終了ボタンクリック判定用変数 'スタートボタンクリック時の処理 Sub startBtn_Click() '1. 得点を0に設定 Worksheets("クリックゲーム").Range("X11").Value = 0 '2. 制限時間を設定 Dim countdownTimer As Integer Dim endtime As Date countdownTimer = 20 endtime = DateAdd("s", countdownTimer, time) '終了ボタンクリック判定を初期化 judgeEndBtnClick = False '3. 制限時間が0になるまでループ処理 Do Until countdownTimer <= 0 '終了ボタンクリック時に処理を強制終了 DoEvents If judgeEndBtnClick = True Then Exit Sub End If '4. メインのカウント更新処理 countdownTimer = DateDiff("s", time, endtime) Worksheets("クリックゲーム").Range("E5").Value = countdownTimer Loop '5. 最高記録を出したら、最高得点を更新 Dim rngCount As Range Dim rngBestCount As Range Set rngCount = Range("X11") Set rngBestCount = Range("X13") If rngCount.Value > rngBestCount.Value Then rngBestCount.Value = rngCount.Value End If End Sub
1の処理で、クリックゲームシートのX11セルの値を0にしています。次に、2の処理で制限時間を設定するためにDateAdd関数を使って20秒を日付型で計算しています。次に、3の処理で制限時間が0になるまでループ処理をしつつ、ループ処理の中にある4の処理でDateDiff関数を使い、制限時間を更新する処理を入れています。
最後に、ループ処理が終了したら5の処理で最高得点を更新する処理を入れています。
時間の計算については、以下で詳しく解説しています。深く知りたい方は以下を見てみてくださいね!
セルの選択を変更したときの処理
次に、セルの選択を変更したときの処理について解説します。
- セルの選択を変更したときの処理
-
- 処理1:選択したセルが点数更新の条件に合致しない場合は処理終了
- 処理1-1:背景色が黒以外のセルを選択したときは処理を強制終了
- 処理1-2:複数セルを一括で選択したときは処理を強制終了
- 処理2:得点を更新
- 処理3:A列の数値を更新して、黒い背景色のセル位置変更
選択しているセルの位置を変更したときの処理が書ける、Worksheet_SelectionChangeサブシージャに以下のように処理を書いています。
選択しているセル変更時に得点更新する処理のコード:
'選択しているセル変更時に得点更新する処理 Private Sub Worksheet_SelectionChange(ByVal Target As Range) '1. 選択したセルが条件を満たしてなかった場合は処理終了 Dim intSelColIndex As Integer intSelColIndex = Target.DisplayFormat.Interior.ColorIndex '選択セルの背景色のカラーインデックスを取得 '1-1. 制限時間が0の場合 If Range("E5").Value = 0 Then Exit Sub '1-2. 複数のセル範囲を選択してしまった場合 ElseIf Selection.Count <> 1 Then Exit Sub '1-3. 選択したセルの背景色のカラーインデックスが黒(1)じゃない場合 ElseIf intSelColIndex <> 1 Then Exit Sub End If '2. 得点を更新 Const strRangeAddress = "X11" '得点の入力セル Range(strRangeAddress).Value = Range(strRangeAddress).Value + 1 '3. 選択したセルの行番号を使って、黒の位置を設定できるA列の数値を更新 Dim lngSelRowNo As Long lngSelRowNo = Target.Row Cells(Target.Row, 1).Value = randCalcNum End Sub 'ランダムで1~15の数字を返す関数 Function randCalcNum() As Integer Dim intMin As Integer '最小値 Dim intMax As Integer '最大値 intMin = 1 intMax = 15 randCalcNum = Int((intMax - intMin + 1) * Rnd + intMin) End Function
1の処理で、制限時間が0の場合、複数のセル範囲を選択した場合、選択したセルの背景色が0じゃなかった場合に処理を強制終了しています。「DisplayFormat.Interior.ColorIndex」で条件付き書式で設定したカラーインデックスを取得できるのが最大のポイントですね。
次に、2の処理で得点を1追加する処理を行った後、選択した背景色が黒の位置を更新する処理を3で書いています。3の処理は選択した行のA列の数値をランダムで設定するrandCalcNum関数を自作して実行しています。
randCalcNum関数では、Int関数とRnd関数を駆使して1 ~ 15までの数値をランダムで計算した値を設定しています。このように、ランダムで数値を入れるような処理を取り入れることで、ゲーム性が増しますね。
ちなみに、ランダムで数値を設定する処理の作り方は以下で詳しく解説しています。詳しく知りたい方は以下を見てみてくださいね!
終了ボタンをクリックしたときの処理
最後に、終了ボタンをクリックしたときの処理を解説します。
- 終了ボタンをクリックしたときの処理
-
- 処理1:全ての処理を強制終了
- 処理2:得点・制限時間を0に変更
終了ボタンをクリックしたときのコード:
'終了ボタンクリック時の処理 Sub endBtn_Click() '1. 終了ボタンクリック判定を更新 judgeEndBtnClick = True '2. カウント・得点を0に戻す With Worksheets("クリックゲーム") .Range("E5").Value = 0 .Range("X11").Value = 0 End With End Sub
終了ボタンクリック時に全ての処理を強制終了するために、制限時間をカウントするループ処理に「DoEvents」を入れています。「DoEvents」を使うと、ループ処理よりもボタンの処理を優先させることができます。
この仕組みを利用して、ボタンクリック時にどのサブシージャでも使えるグローバル変数judgeEndBtnClickの値をTrueに変更し、スタートボタンクリック処理にあるループ処理の中に、以下のようにIF文を作って処理を強制終了しています。
'終了ボタンクリック時に処理を強制終了 DoEvents If judgeEndBtnClick = True Then Exit Sub End If
DoEventsを使った途中終了ボタンの作り方については、以下で詳しく解説しています。興味がある方は以下を見てみてくださいね!
なお、IT企業への転職や業務・作業の効率化などを見据え、独学でVBAが習得できるか不安な人は「侍エンジニア」をお試しください。
侍エンジニアでは、現役エンジニアと学習コーチの2名体制で学習をサポートしてもらえます。
「受講生の学習完了率98%」「累計受講者数4万5,000名以上」という実績からも、侍エンジニアなら未経験からでも挫折なく転職や効率化が実現できますよ。
\ 給付金で受講料が最大80%OFF /
Excelの機能を最大限活かすことがミソ
ここまでVBAでゲームを作る時の考え方、具体的なチュートリアルを使った作り方を解説してきました。
ゲームを1から全て自分で作るのは大変ですよね。チュートリアルでも少し解説しましたが、重要なのは「Excelの既存機能を最大限利用してゲームを作ること」です。
今回は条件付き書式で色を自動で塗りつぶす処理を使っていますが、セル関数で自動計算した値を使ったり、シートを画面として使う感覚はとても重要です。無駄な工数を増やさないためにも、「ゲームを作るためにExcelの機能で実現できる機能はないかな?」と考える時間をつくるのがおすすめです。
なお、副業での収入獲得を目指しているものの、どんな仕事が自分に合うかわからない人は「副業診断」をお試しください。
かかる時間はたった1分ほど。5つの質問に答えるだけで、自分にあう副業を診断してもらえます。
自身が取り組みやすい副業で収入を獲得したい人は、ぜひ一度お試しください。
\ 5つの質問に答えるだけ /
まとめ
今回は、VBAでゲームを作る方法について徹底的に解説しました。
作り方を学んでからチュートリアルを自分で作ってみることで、基礎的なゲームの作り方が身につきます。
ぜひ、作ってみてくださいね!