【VBAリファレンス】VBAサンプル集オセロを作りながらマクロVBAを学ぼう№9

スポンサーリンク

オセロ開発で学ぶVBAの真髄:ロジック構築とイベント駆動の極意

Excel VBAは単なる事務作業の自動化ツールではありません。適切に設計すれば、複雑なアルゴリズムを実装するプログラミング言語としてのポテンシャルを秘めています。本稿では、VBA学習の集大成とも言える「オセロ」の実装を通じて、配列操作、条件分岐、そしてイベント駆動型プログラミングの要諦を解説します。初心者から一歩先へ進み、プロフェッショナルな設計思想を身につけるためのステップを確認していきましょう。

オセロロジックの設計思想:モデル・ビュー・コントローラの分離

VBAでゲームを開発する際、最も陥りやすい罠は「シート上のセルを直接データソースとして扱うこと」です。セルはあくまで「ビュー(表示)」であり、ゲームの盤面状態(石の配置)はメモリ上の「配列」で管理するのが鉄則です。

今回の設計では、8×8の盤面を「二次元配列」として定義します。空きマスを0、黒を1、白を-1と定義することで、石の反転処理を数学的に簡略化できます。この「モデル(データ)」と「ビュー(Excelシート)」を分離することで、計算速度の向上とデバッグの容易性を両立させることが可能になります。

盤面管理と石の反転アルゴリズムの詳細解説

オセロの核心となるのは「石を置いた際に、どの方向の石が反転するか」を判定するロジックです。これを実装するには、8方向(上下左右および斜め)のベクトルを定義し、再帰的あるいはループ処理で探索を行う必要があります。

具体的には、以下の手順でアルゴリズムを組み立てます。
1. 石を置く座標(r, c)が空いているか確認する。
2. 8方向それぞれについて、相手の石が連続して並んでいるかを確認する。
3. 相手の石の先に自分の石がある場合、その間の相手の石を反転させる。

この処理を関数(Function)として独立させることで、AI(思考ルーチン)の実装時にも同じロジックを流用できるようになります。コードの再利用性は、保守性の高いVBAを構築する上での生命線です。

サンプルコード:盤面初期化と石の配置ロジック

以下は、盤面の状態を管理するクラスモジュール的なアプローチを採用したコード例です。シートのSelectionChangeイベントをトリガーにして、クリックしたセルに石を配置する仕組みを想定しています。


Option Explicit

' 盤面状態を保持するグローバル変数
Public Board(1 To 8, 1 To 8) As Integer

' 盤面の初期化処理
Sub InitializeBoard()
    Dim i As Integer, j As Integer
    ' 全マスをクリア
    For i = 1 To 8
        For j = 1 To 8
            Board(i, j) = 0
        Next j
    Next i
    
    ' 初期配置
    Board(4, 4) = -1: Board(5, 5) = -1
    Board(4, 5) = 1: Board(5, 4) = 1
    
    UpdateSheet
End Sub

' シートへの反映(ビューの更新)
Sub UpdateSheet()
    Dim i As Integer, j As Integer
    For i = 1 To 8
        For j = 1 To 8
            Select Case Board(i, j)
                Case 1: Cells(i, j).Value = "●"
                Case -1: Cells(i, j).Value = "○"
                Case Else: Cells(i, j).Value = ""
            End Select
        Next j
    Next i
End Sub

' 石を置く処理の核となる判定関数
Function CanPlace(r As Integer, c As Integer, color As Integer) As Boolean
    ' ここに8方向の探索ロジックを実装する
    ' 簡略化のため、ここでは判定の枠組みのみ提示
    If Board(r, c) <> 0 Then Exit Function
    
    ' 各方向へのベクトル探索をループで回す
    ' 相手の石が挟めるかをチェックし、Trueを返す
    CanPlace = True
End Function

実務現場で活きるVBA開発のベストプラクティス

オセロという「ゲーム」を作る過程で学んだテクニックは、そのまま業務アプリケーション開発に応用できます。

第一に「エラーハンドリングの徹底」です。ユーザーが予期せぬセルをクリックした場合、あるいは盤面外をクリックした場合にプログラムがクラッシュしないよう、入力チェック(バリデーション)を厳格に行う必要があります。実務では、これがそのままデータの整合性を保つためのバリデーションロジックとなります。

第二に「描画の高速化」です。VBAで頻繁にセルを書き換えると画面がチラつきます。これを防ぐには、`Application.ScreenUpdating = False`を適切に使用し、処理終了後に一括で再描画を行う手法が必須です。これは、大量のデータ行を処理する業務マクロにおいて、実行時間を数分から数秒に短縮するための極めて重要なテクニックです。

第三に「イベントの連鎖を断ち切る」ことです。`Worksheet_SelectionChange`イベント内でセルを書き換えると、それが再びイベントを呼び出し、無限ループに陥る危険性があります。これを防ぐために`Application.EnableEvents = False`を忘れずに記述しましょう。これは、複雑な連動型入力フォームを作成する際に必ず直面する問題への特効薬です。

プロフェッショナルへの道:さらに先へ

今回のオセロ実装を通じて、単なる「動くコード」ではなく「拡張性のあるコード」を書く重要性を理解できたはずです。次に挑戦すべきは、AIの実装です。単純なミニマックス法から始めて、評価関数を工夫することで、VBA上で動く非常に強力な思考エンジンを作成することが可能です。

VBAはレガシーな言語と揶揄されることもありますが、Excelという巨大なプラットフォーム上で動作するその即時性は、現代のDX推進においても依然として強力な武器です。今回作成した盤面管理のロジックや、イベント駆動の考え方を、日々の業務効率化ツールにも応用してみてください。

まとめ:VBAを「習う」から「使いこなす」へ

オセロの制作は、VBAの基礎構文から、配列、クラス、イベント処理、そしてアルゴリズムの設計までを網羅的に学べる最高の教材です。コードを書く際は、常に「なぜこの書き方をするのか」という意図を持ってください。

・データ構造を独立させること(配列管理)
・ビューとモデルの責務を分けること
・イベントの制御を確実に行うこと

これら3点を意識するだけで、あなたの書くVBAコードは、他人が見てもメンテナンスしやすく、かつ高速で安定したものに進化します。今回のプロジェクトが、あなたのVBAエンジニアとしてのスキルを一段引き上げる礎となることを確信しています。さあ、次はAIを組み込み、自分自身が作ったプログラムに挑戦してみる番です。技術の探求に終わりはありません。引き続き研鑽を積んでください。

タイトルとURLをコピーしました