【VBAリファレンス】VBAサンプル集Excel将棋:棋譜選択でその時点の盤面に戻す実装テクニック

スポンサーリンク

概要

Excelを盤面に見立て、VBAで将棋を再現する試みは、オブジェクト指向プログラミングと配列操作の基礎を学ぶ上で最高の教材です。しかし、ただ駒を動かすだけでは「将棋アプリ」とは呼べません。将棋の醍醐味は、過去の棋譜を遡り、特定の局面から再検討することにあります。本稿では、記録された棋譜データから任意のターンを抽出し、一瞬で盤面を復元するアルゴリズムを詳解します。この技術を習得することで、Excel内で「巻き戻し」や「検討モード」といった高度な機能を実装するための論理的思考力が養われます。

詳細解説

盤面の復元を実現するためには、まず「棋譜の持ち方」を定義する必要があります。一般的に、Excel将棋では「駒の種類」「座標(x, y)」「先手・後手」を配列またはコレクションとして保持します。

局面を戻すロジックの核心は「初期状態からの再構築」にあります。
1. 盤面を一旦クリアする(全セルを空白化)。
2. 初期配置(平手)を盤面にセットする。
3. 棋譜リストから、目標とするターン数までのデータを順次ループで実行する。

ここで重要なのは、VBAの「再描画制御」です。画面更新を抑制する「Application.ScreenUpdating = False」を適切に使用しなければ、過去の局面に戻るたびに駒が動くアニメーションが走ってしまい、処理速度が著しく低下します。また、棋譜データが「指し手」のみ(例:7七角)で記録されている場合、その指し手が「成ったのか」「持ち駒を打ったのか」「移動したのか」を判定するバリデーション関数が必須となります。

サンプルコード

以下は、棋譜テーブル(シート「Kifu」)から指定したターン数まで盤面を再構築する実装例です。


' 棋譜から指定ターンまで盤面を復元するプロシージャ
Public Sub RestoreBoardState(ByVal targetTurn As Long)
    Dim wsBoard As Worksheet: Set wsBoard = ThisWorkbook.Sheets("Board")
    Dim wsKifu As Worksheet: Set wsKifu = ThisWorkbook.Sheets("Kifu")
    Dim i As Long
    
    ' 画面更新を停止して高速化
    Application.ScreenUpdating = False
    
    ' 1. 盤面を初期化
    Call InitializeBoard(wsBoard)
    
    ' 2. 棋譜の1手目から指定ターンまで順次適用
    For i = 1 To targetTurn
        Dim moveInfo As String
        moveInfo = wsKifu.Cells(i + 1, 2).Value ' 棋譜列から指し手を取得
        
        ' 指し手の解析と実行関数
        Call ApplyMove(wsBoard, moveInfo)
    Next i
    
    ' 画面更新を再開
    Application.ScreenUpdating = True
    
    MsgBox targetTurn & "手目までの局面を復元しました。"
End Sub

' 盤面初期化用の簡易関数
Private Sub InitializeBoard(ws As Worksheet)
    ws.Range("B2:J10").ClearContents
    ' ここに初期配置ロジックを記述(略)
End Sub

' 指し手適用用のダミー関数(実際には複雑な座標変換が必要)
Private Sub ApplyMove(ws As Worksheet, moveInfo As String)
    ' moveInfoを解析してセルの値(駒)を移動させるロジック
    ' 例: 7七角 なら セル(7,7)の値を「角」に書き換える等
End Sub

実務アドバイス

実務でこのレベルのプログラムを組む際、最も陥りやすい罠は「データの不整合」です。例えば、「持ち駒」の管理を怠ると、戻した盤面で駒が消失したり、逆に増殖したりするバグが発生します。

ベテランの知恵として、以下の3点を意識してください。
1. 「差分」ではなく「再構築」で考える:中途半端に盤面を修正しようとせず、必ず初期状態から積み上げる設計にすることで、バグの発生確率を劇的に下げることができます。
2. 棋譜データのシリアライズ:棋譜をセルにそのまま書き込むのではなく、カンマ区切りの文字列やJSON形式で保持すると、パース(解析)が容易になります。
3. エラーハンドリング:存在しない指し手や、ルール違反の指し手が棋譜に含まれていた場合、プログラムが停止しないよう「On Error Resume Next」を適切に使い、ログに記録する仕組みを組み込んでください。

また、Excelのセルに駒を表示する際、フォントを「MS ゴシック」ではなく「将棋フォント」に変更し、条件付き書式で持ち駒エリアの背景色を制御すると、一気にプロ仕様のインターフェースに昇華します。

まとめ

Excel将棋における「棋譜からの盤面復元」は、単なる機能実装ではありません。これは、過去のデータをどのように構造化し、いかに効率よく再利用するかという、データ構造の本質を問う課題です。

今回紹介した「初期状態からの再構築」というアプローチは、ゲーム開発だけでなく、業務システムの履歴管理や監査証跡(トレースログ)の再現にもそのまま応用可能です。コードの美しさは、無駄な再計算を避け、確実な手順を踏むことで生まれます。ぜひ、このコードをベースに、あなたのExcel将棋をより高度なツールへと進化させてください。VBAという道具は、あなたの論理構成力次第で、どこまでも可能性を広げることができるのです。

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