【サンプルコード付き】VBAのゲーム作り方を徹底解説!


VBAでゲームを作る方法が知りたいな・・・
できれば考え方だけでなく、チュートリアルが欲しい・・

VBAはExcel業務を自動化できる言語ですが、少し工夫すればゲームを作ることができます。ただ、ゲームを作ろうとすると...ツールを作るときと根本的な考え方が違うため、作るのに苦戦する人も多いです。

こんにちは!フリーランスエンジニア兼テックライターの脇坂です。

この記事では、VBAでゲームを作るときの考え方・具体的なチュートリアルを解説します!

この記事はこんな人のために書きました。

  • VBAのゲームの作り方を知りたい人
  • 具体的なチュートリアルをもとにVBAでゲームを作りたい人

VBAでゲームを作るときの考え方

はじめに、VBAでゲームを作るときの考え方について解説します。VBAでゲームを作るときは、次のような流れで考えます。

VBAでゲームを作るときの流れ

  • ゲームの仕様を決める
  • ゲームの設計をする
  • VBAのコード以外の事前準備を終わらせる
  • VBAで仕様に合わせて処理を作る

ゲームの仕様・画面設計はいくつか考えるポイントがあるので、先に考え方を解説しますね!

ゲームの仕様を決める

まず、ゲームの仕様を考えます。ゲームの仕様を考えるときは、最低限以下を考えましょう。

ゲームの仕様で最低限考えること

  • ゲームの概要
  • ゲームのゴール
  • 具体的なゲームの流れ
  • 機能の一覧

ある程度ざっくりでもかまわないので、仕様を考えていきましょう。ゴール・ゲームの流れ・機能が決まったら、具体的な画面イメージを作っていきます。

ゲームの設計をする

次に、ゲームの設計をしていきます。仕様がある程度できていればすぐに作り始めることもできますが、詳細な処理や画面を決めておかないと・・・次のように作るのに時間がかかってしまいます。

設計をしなかった場合の悩み

  • 画面や機能をどこまで作ればいいかわからないため、作りこみすぎる
  • ボタンの名前や画面のレイアウトを作りながら悩むため、時間がかかる

具体的なVBAに書く処理のイメージ、作る画面のイメージを固めておくことでスムーズにゲームを作ることができるのです。次に、具体的なゲームの作り方を解説しますね。

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の処理で最高得点を更新する処理を入れています。

時間の計算については、以下で詳しく解説しています。深く知りたい方は以下を見てみてくださいね!

【ExcelVBA】時間を計算するための取得・計算方法を徹底解説!
更新日 : 2018年10月30日

セルの選択を変更したときの処理

次に、セルの選択を変更したときの処理について解説します。

セルの選択を変更したときの処理

  • 処理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までの数値をランダムで計算した値を設定しています。このように、ランダムで数値を入れるような処理を取り入れることで、ゲーム性が増しますね。

ちなみに、ランダムで数値を設定する処理の作り方は以下で詳しく解説しています。詳しく知りたい方は以下を見てみてくださいね!

【ExcelVBA入門】Rnd関数・Int関数を使った乱数取得方法を徹底解説!
更新日 : 2018年8月13日

終了ボタンをクリックしたときの処理

最後に、終了ボタンをクリックしたときの処理を解説します。

終了ボタンをクリックしたときの処理

  • 処理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を使った途中終了ボタンの作り方については、以下で詳しく解説しています。興味がある方は以下を見てみてくださいね!

【ExcelVBA入門】DoEventsを使って処理を途中で止める方法を徹底解説!
更新日 : 2019年4月16日

Excelの機能を最大限活かすことがミソ

ここまでVBAでゲームを作る時の考え方、具体的なチュートリアルを使った作り方を解説してきました。

ゲームを1から全て自分で作るのは大変ですよね。チュートリアルでも少し解説しましたが、重要なのは「Excelの既存機能を最大限利用してゲームを作ること」です。

今回は条件付き書式で色を自動で塗りつぶす処理を使っていますが、セル関数で自動計算した値を使ったり、シートを画面として使う感覚はとても重要です。無駄な工数を増やさないためにも、「ゲームを作るためにExcelの機能で実現できる機能はないかな?」と考える時間をつくるのがおすすめです。

まとめ

今回は、VBAでゲームを作る方法について徹底的に解説しました。

作り方を学んでからチュートリアルを自分で作ってみることで、基礎的なゲームの作り方が身につきます。

ぜひ、作ってみてくださいね!

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

Sanshiro Wakizaka

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!

侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー