Excel のマクロで作る!マインスイーパ風ゲームの作り方を徹底解説

[初回公開] 2025年05月27日

「Excelって表計算ソフトでしょ?ゲームなんて作れるの?」と思っていませんか?実は、Excelには「マクロ(VBA)」という強力な機能があり、工夫次第でちょっとしたゲームも作れてしまいます。本記事では、定番のパズルゲーム「マインスイーパ」をExcelのマクロ機能を使って作る手順を、初心者にもわかりやすく解説します。エクセル操作とプログラミングの両方を楽しみたい方は、ぜひ最後までご覧ください!

Excel のマクロで作る!マインスイーパ風ゲームの作り方を徹底解説

1.Excel でゲームは作れるのか?

Excel は通常、表計算やデータ分析に使われるツールですが、マクロ(VBA)を活用すれば、ボタンや条件分岐などの要素を組み合わせて、簡単なゲームを作成することが可能です。この記事では、Excel でマインスイーパを作るコードも触れていきます。

Excel でゲームは作れるのか?


2.マインスイーパとは

マインスイーパは、地雷を避けながらマスを開けていく有名なロジックパズルゲームです。マインスイーパの基本ルールやゲームの進め方は次の通りです。
これにより、これから作成する Excel 版のマインスイーパが、どのような仕組みを再現するのかがイメージしやすくなります。

  • マス目のある真っ白なフィールドが表示される
  • マス目をクリックすると数字か爆弾が表示される
  • 爆弾を表示させてしまうとゲームオーバー
  • 数字が表示されたらセーフ
  • 数字はそのマスの周辺(8マス)に爆弾が何個あるか示している
  • 爆弾以外の全てのマス目を開くとゲームクリア

3.Excel のマクロでゲーム「マインスイーパ」を作成する方法

この章では、Excel 上でマインスイーパを再現するための具体的な作業手順を解説します。
表の準備からコードの記述、マクロの実行方法まで、順を追って進めていくため、VBA 初心者でも取り組みやすくなっています。

3-1.10 x 10 のマスを用意する

最初のステップは、Excel のシートに10列×10行のマス目を用意することです。
このマス目がマインスイーパの盤面になります。セルの幅や高さを調整することで、後の作業がスムーズになります。

3-2.1マスを正方形にする

Excel のセルは初期状態では長方形のため、1つ1つのマスを正方形に近づけることで、見た目もゲームらしく整えます。
行の幅はそのままに、列の幅を 3 にするとよいです。

Excel の列の幅を 3 にする

3-3.VBA を開いて「標準モジュール」にコードを書く

いよいよ VBA(Visual Basic for Applications)の登場です。
Alt + F11 キーで VBE を開き、「標準モジュール」に基本的なゲーム処理のコードを記述していきます。
地雷の配置やセルの動作を管理するためのロジックが含まれます。

VBA を開いて「標準モジュール」にコードを書く

VBA を開いて Microsoft Excel Objects で右クリックして「挿入→標準モジュール」でコードを入力するウィンドウが表示されるので下記を記入します。

' 10x10 マスを利用する
' A から J 列の幅は 3 にする
Public bombBoard(1 To 10, 1 To 10) As Boolean ' Bがあるかどうかを管理する配列
Public revealedBoard(1 To 10, 1 To 10) As Boolean ' セルが開放されたかどうかを管理する配列
Public bombs As Integer ' Bの数
Public gameActive As Boolean ' 進行状態を管理するフラグ

Sub Mine()
    Dim i As Integer, j As Integer
    bombs = 10 ' Bの数
    gameActive = True
    
    ' 盤面の初期化
    For i = 1 To 10
        For j = 1 To 10
            bombBoard(i, j) = False ' Bなし
            revealedBoard(i, j) = False ' セルは未開放
            Cells(i, j).ClearContents
            Cells(i, j).Interior.ColorIndex = 2 ' セルの色を白に戻す
        Next j
    Next i
    
    ' Bの配置
    Randomize
    For i = 1 To bombs
        Dim row As Integer, col As Integer
        row = Int((10 * Rnd) + 1)
        col = Int((10 * Rnd) + 1)
        
        ' すでにBがある場合は再試行
        If bombBoard(row, col) = False Then
            bombBoard(row, col) = True ' B配置
        Else
            i = i - 1 ' 再試行
        End If
    Next i
End Sub

3-4.「Sheet1(Sheet1)」にコードを書く

シート自体にもイベントハンドラなどのコードを書き加える必要があります。
ここでは、ユーザーがセルをクリックしたときの処理や、表示の制御を行うためのコードを記述します。

VBA の「Sheet1(Sheet1)」をダブルクリックして下記を追記します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim r As Integer, c As Integer
    Dim bombCount As Integer
    Dim rowOffset As Integer, colOffset As Integer
    Dim totalRevealed As Integer
    Dim totalCells As Integer

    ' A1:J10の範囲が選択された場合に処理
    If Not Intersect(Target, Range("A1:J10")) Is Nothing Then
        r = Target.row
        c = Target.Column

        ' セルがすでに開放されている場合は何もしない
        If revealedBoard(r, c) = True Then Exit Sub
        
        ' セルが爆弾の場合
        If bombBoard(r, c) = True Then
            ' 爆弾セルを薄いグレーに設定
            Target.Interior.Color = RGB(200, 200, 200) ' 爆弾セルを薄いグレーに
            Target.Value = "B" ' Bを表示
            Target.HorizontalAlignment = xlCenter ' Bを中央寄せ
            Target.VerticalAlignment = xlCenter ' Bを中央寄せ

            ' 隠れている全ての爆弾を表示
            For r = 1 To 10
                For c = 1 To 10
                    If bombBoard(r, c) = True And revealedBoard(r, c) = False Then
                        Cells(r, c).Interior.Color = RGB(200, 200, 200) ' 爆弾セルを薄いグレーに
                        Cells(r, c).Value = "B" ' Bを表示
                        Cells(r, c).HorizontalAlignment = xlCenter ' Bを中央寄せ
                        Cells(r, c).VerticalAlignment = xlCenter ' Bを中央寄せ
                    End If
                Next c
            Next r
            
            ' ゲーム終了メッセージ
            MsgBox "終了" ' 終了
            gameActive = False ' ゲームを終了
        Else
            ' セルを白に戻す
            Target.Interior.Color = RGB(255, 255, 255)
            
            ' 周囲の爆弾の数をカウント
            bombCount = 0
            For rowOffset = -1 To 1
                For colOffset = -1 To 1
                    ' 範囲外のセルを除外
                    If r + rowOffset >= 1 And r + rowOffset <= 10 And c + colOffset >= 1 And c + colOffset <= 10 Then
                        ' 周囲に爆弾があればカウント
                        If bombBoard(r + rowOffset, c + colOffset) = True Then
                            bombCount = bombCount + 1
                        End If
                    End If
                Next colOffset
            Next rowOffset
            
            ' 周囲の爆弾数をクリックしたセルに表示
            If bombCount > 0 Then
                Target.Value = bombCount
            Else
                ' 周囲に爆弾がなければ0を表示
                Target.Value = 0
            End If
            
            ' セルの数値を中央に配置
            Target.HorizontalAlignment = xlCenter
            Target.VerticalAlignment = xlCenter
            
            revealedBoard(r, c) = True ' セルを開放
        End If
    End If
    
    ' ゲームが進行中かつすべての爆弾でないセルが開放された場合
    If gameActive Then
        totalRevealed = 0
        totalCells = 0
        
        ' 全セルを確認し、開放されたセルの数を数える
        For r = 1 To 10
            For c = 1 To 10
                If revealedBoard(r, c) = True Then
                    totalRevealed = totalRevealed + 1
                End If
                totalCells = totalCells + 1
            Next c
        Next r
        
        ' もしすべての爆弾でないセルが開放されたら
        If totalRevealed = totalCells - bombs Then
            ' 全ての爆弾を表示
            For r = 1 To 10
                For c = 1 To 10
                    If bombBoard(r, c) = True Then
                        Cells(r, c).Value = "B" ' 爆弾セルにBを表示
                        Cells(r, c).Interior.Color = RGB(200, 200, 200) ' 爆弾セルを薄いグレーに
                        Cells(r, c).HorizontalAlignment = xlCenter ' Bを中央寄せ
                        Cells(r, c).VerticalAlignment = xlCenter ' Bを中央寄せ
                    End If
                Next c
            Next r
            
            ' 完了のメッセージ
            MsgBox "完了!すべての爆弾以外のセルを開放しました!"
        End If
    End If
End Sub

3-5.マクロを実行する

すべての準備が整ったら、最後にマクロを実行して、実際にゲームとして動作させます。
マクロを開くと下図のように実行できるマクロの一覧が表示されるのでボタン「実行」をクリックします。

マクロを実行する

爆弾のあるマス目を避けながらクリックしていき、全てのマス目を開くとゲームクリアです。

ゲームをクリアした様子

4.まとめ

Excel のマクロ機能を使えば、表計算以外にもこのような遊び心あふれる使い方が可能です。
本記事を通じて、マクロの基本や VBA の面白さを感じていただけたのではないでしょうか?

ぜひ自分なりの改良を加えて、オリジナルのマインスイーパを完成させてみてください。

関連記事

コメント

※コメントへの返信は本ページで行いますので、入力されたメールアドレスには返信いたしません。
後日、本ページをご確認ください。

  1. 匿名 より:

    ぼくは、とても初心者だったけど、とてもやりやすかったです。けど今作っているけど、少しミスっていて、名前がないとか言われています。

    1. 「名前がない」ですか・・・。
      デバッグで黄色の背景色になっている行のプログラムを教えてもらえると何かお伝えできるかもしれません

匿名 へ返信する コメントをキャンセル