4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excelで迷路を作ったら、だんだん正気を失った話

4
Last updated at Posted at 2026-02-03

はじめに

Excelでできることといえば、
売上管理、勤怠管理、在庫管理……ですよね。

迷路生成?
時間で勝手に変形?
しかも見えないイベント付き?

使い方を間違えてるかもですが、
楽しいから仕方ないんです。

最近 Qiita で
「役に立たないけど本気な Excel VBA」を投稿していたら
思った以上に見ていただけるようになったので、

じゃあ、もっとやっていいよね?

ということで、
Excelで本気の迷路ゲームを作りました。

※ ただの迷路ではありません。
時間経過で形が変わり、見えないイベントも仕込んであります。

どんな迷路か

この迷路、静止していません。
一定時間ごとに形が変わります。

🟥 赤セル:プレイヤー(矢印キーで操作)

🟩 緑セル:ゴール

⬛ 黒セル:壁

⬜ 白セル:通路

Excelのセルをそのままマスとして使っています。

迷路.png

迷路はどうやって作っているのか

迷路生成は、いわゆる 穴掘り法(DFS) です。

「ランダムに掘って、行き止まりまで行ったら戻る」
という、あのやつ。

コードの全体は長いので、
核になる部分だけ抜き出します。

Private Sub DFS_Carve(rx As Long, ry As Long)
    gRooms(rx, ry).Visited = True
    gCarved(2 * rx, 2 * ry) = True

    Dim d(1 To 4, 1 To 2) As Long
    d(1, 1) = 1: d(1, 2) = 0
    d(2, 1) = -1: d(2, 2) = 0
    d(3, 1) = 0: d(3, 2) = 1
    d(4, 1) = 0: d(4, 2) = -1

    ' 方向をランダムにシャッフル
    Dim i As Long, j As Long
    For i = 1 To 4
        j = 1 + Int(Rnd() * 4)
        Swap d, i, j
    Next i

このあと、

未訪問の部屋に進む

通路を掘る

再帰で続ける

という処理をしています。

Excelなのに、ちゃんとアルゴリズムしてます。

時間が経つと、迷路が勝手に変わる

この迷路、
操作していなくても 一定時間で勝手に変化します。

しかも時間は ランダム。

Private Sub ScheduleNextTick()
    gLastInterval = MIN_AUTO_SECONDS + _
        Int(Rnd() * (MAX_AUTO_SECONDS - MIN_AUTO_SECONDS + 1))

    gNextTick = Now + TimeSerial(0, 0, gLastInterval)
    Application.OnTime gNextTick, "Maze_Tick"
End Sub

25秒のこともある

60秒のこともある

「あと一歩でゴール!」
というときに変わると、地味に悔しいです。

※ 停止/再開ボタンは用意しています(良心)

見えないイベントマスという狂気

この迷路には
見えないイベントマスが複数あります。

見た目は普通の通路

踏むまで存在が分からない

踏むとメッセージだけ出る

If gEventAlive(i) Then
    If gPlayerX = gEventX(i) And gPlayerY = gEventY(i) Then
        gEventAlive(i) = False
        ShowEventMessage
    End If
End If

表示されるのは、例えばこんなメッセージ。

msgs = Array( _
    "……何か踏んだ気がする", _
    "このExcel、正気じゃない", _
    "イベントは起きたが何も起きなかった", _
    "Qiita映え +1", _
    "ゴールは近い…気がする" _
)

何も起こらない。
でも、ちょっと楽しい。

※ ゴールの邪魔はしません
※ 理不尽すぎると面白くないので

ゴールはちゃんと可能です

最初は「イベントで迷路が変わる」仕様にしていましたが、
それだと 永遠にゴールできないことに気づきました。

なので設計を変更して、

🟩 ゴールは必ず到達可能

🟨 イベントは味付けだけ

にしています。

技術的にやっていること(まとめ)

●VBAによるDFS迷路生成

●セルをグリッドとして描画

●Application.OnKey でキー操作

●Application.OnTime でランダム時間イベント

●OnTime多重防止

●Workbook_Open / BeforeClose で後始末

Excelなのに、やってることは意外と多いです。

なぜ作ったのか

正直に言うと、

●業務では一切使えません

●生産性も上がりません

●誰にも頼まれていません

でも、

VBAの練習になる

アルゴリズムの復習になる

なにより楽しい

Qiitaには、
こういう 「役に立たないけど本気」 な記事も
あっていいと思っています。

今後やりたいこと

残り時間の可視化

フェイクゴール

イベントで壁が一瞬消える

ゴール回数の記録

もし「これやったら面白そう」という案があれば、
コメントで教えてもらえると嬉しいです。

おわりに

Excelは、
本来やらなくていいことをやらせると一番楽しい
と本気で思っています。

この記事が、

ちょっと笑えて

少しだけ記憶に残って

「作ってみようかな」と思える

そんな内容になっていたら嬉しいです。

実装全体のコードは GitHub に置いています。

VBA コードをそのまま置います。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?