VBAサンプル集
Excel将棋:棋譜選択でその時点の盤面に戻す(№13)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-08-31

Excel将棋:棋譜選択でその時点の盤面に戻す(№13)


VBA マクロ Excel将棋

Excelで将棋を作ってみましょう。
人vs人で動かしてゲームとして成立するところまでが当面の目標です。


今回は、棋譜フォームの棋譜を選択することで、その時点の盤面に戻す機能を実装します。
さらに、その時点から指し継ぐこともできるようにします。

盤面を再現するには履歴の保存が重要になってきます。
VBAの変更は、この点を中心に行いました。
盤面としては、将棋盤と駒台の状態を手数ごとに保存しておきます。
この盤面の履歴と、棋譜の履歴を一致するように作成しています。

かなり複雑になってきましたので、今回は以下の資料を掲載しておきます。
・全体構成図
・全プロシージャー・プロパティの一覧
・クリックした時の主なプロシージャーの流れ

※クラス名、プロシージャー名、変数名に日本語を使用しています。

Excel将棋の動作

現時点の動作です。

VBA マクロ Excel将棋

全体構成図

VBA マクロ Excel将棋

全プロシージャー・プロパティの一覧

モジュール プロシージャー スコープ 種別 行位置 ソース コメント
modゲーム開始 ゲーム開始 Public Sub Function 5 Sub ゲーム開始()
cls駒 Class_Initialize Private Sub Function 74 Private Sub Class_Initialize()
cls駒 正式名称 Public Property Let 84 Public Property Let 正式名称(ByVal Value As String)
cls駒 表示名称 Public Property Let 91 Public Property Let 表示名称(ByVal Value As String)
cls駒 通常名称 Public Property Get 97 Public Property Get 通常名称() As String
cls駒 成駒名称 Public Property Let 101 Public Property Let 成駒名称(ByVal Value As String)
cls駒 表示順 Public Property Let 108 Public Property Let 表示順(ByVal Value As String)
cls駒 駒移動 Public Property Let 115 Public Property Let 駒移動(ByRef arg移動() As cls移動)
cls駒 成駒移動 Public Property Let 122 Public Property Let 成駒移動(ByRef arg移動() As cls移動)
cls駒 先手 Public Property Let 129 Public Property Let 先手(ByVal Value As Boolean)
cls駒 成り Public Property Let 136 Public Property Let 成り(ByVal Value As Boolean)
cls駒 駒位置 Public Property Set 143 Public Property Set 駒位置(ByVal arg駒位置 As g位置)
cls駒 Clone Public Sub Function 155 Public Function Clone() As cls駒 '自身を複製する
cls駒 駒作成 Public Sub Function 171 Public Function 駒作成(ByVal arg名称 As String, ByVal arg先手 As Boolean, Optional ByVal arg位置 As g位置 = Nothing ) As cls駒 '駒の正式名称を受け取って、その駒特有の情報を設定する
cls駒 駒移動可能位置 Public Sub Function 229 Public Function 駒移動可能位置(ByRef ary盤面() As cls駒) As Collection '駒が移動できる位置をg位置(行、列)のCollectionで返す
cls駒 駒移動設定 Private Sub Function 268 Private Function 駒移動設定(ByVal arg動き As String) As cls移動() '駒の動きを定義したConstより配列を作成する
cls駒台 手数 Public Property Let 13 Public Property Let 手数(ByVal Value As Long)
cls駒台 Class_Initialize Private Sub Function 20 Private Sub Class_Initialize()
cls駒台 駒追加 Public Sub Function 24 Public Sub 駒追加(ByVal arg駒 As cls駒)
cls駒台 駒削除 Public Sub Function 38 Public Sub 駒削除(ByVal arg駒 As Variant)
cls駒台 履歴追加 Public Sub Function 59 Public Sub 履歴追加()
cls駒台 駒台一覧 Public Sub Function 64 Public Function 駒台一覧(Optional ByVal arg手数 As Long = 0) As Variant()
cls駒台 ArrayCompress Private Sub Function 77 Private Function ArrayCompress(ByRef argAry() As t駒台) As Variant() '駒台の配列(1 To 7)の使っていない要素を圧縮します
cls駒台 特定局面再現 Public Sub Function 92 Public Sub 特定局面再現(ByRef aAry駒台() As Variant, ByVal arg手数 As Long) '静的配列のpAry駒への代入が出来ない為、一つずつ入れています。
cls駒台 盤面履歴手数戻し Private Sub Function 101 Private Sub 盤面履歴手数戻し()
cls将棋盤 Class_Initialize Private Sub Function 12 Private Sub Class_Initialize()
cls将棋盤 Class_Terminate Private Sub Function 19 Private Sub Class_Terminate()
cls将棋盤 現在盤面 Public Property Get 29 Public Property Get 現在盤面(Optional ByVal arg手数 As Long = 0) As String()
cls将棋盤 盤面履歴 Public Property Get 60 Public Property Get 盤面履歴() As Collection
cls将棋盤 棋譜履歴 Public Property Get 64 Public Property Get 棋譜履歴() As Collection
cls将棋盤 棋譜 Public Property Get 68 Public Property Get 棋譜() As String
cls将棋盤 棋譜最終 Public Property Get 72 Public Property Get 棋譜最終() As String
cls将棋盤 消費時間 Public Property Get 76 Public Property Get 消費時間() As String
cls将棋盤 開始時刻 Public Property Get 80 Public Property Get 開始時刻() As Date
cls将棋盤 最終時刻 Public Property Get 84 Public Property Get 最終時刻() As Date
cls将棋盤 手数 Public Property Let 88 Public Property Let 手数(ByVal Value As Long)
cls将棋盤 先手 Public Property Let 96 Public Property Let 先手(ByVal Value As Boolean)
cls将棋盤 Public Property Set 103 Public Property Set 駒(ByVal arg位置 As g位置, ByVal arg駒 As cls駒)
cls将棋盤 駒移動可能位置 Public Sub Function 115 Public Function 駒移動可能位置(ByVal arg位置 As g位置) As Collection '駒が移動できる位置をg位置(行、列)のCollectionで返す
cls将棋盤 着手 Public Sub Function 120 Public Sub 着手(ByVal arg駒名 As String, ByVal arg元位置 As g位置, ByVal arg先位置 As g位置, ByVal arg先手 As Boolean)
cls将棋盤 特定局面再現 Public Sub Function 164 Public Sub 特定局面再現(ByRef aAry駒() As cls駒, ByVal arg手数 As Long) '静的配列のpAry駒への代入が出来ない為、一つずつ入れています。
cls将棋盤 終局判定 Public Sub Function 175 Public Function 終局判定() As Boolean
cls将棋盤 手番交代 Private Sub Function 184 Private Sub 手番交代()
cls将棋盤 成り判定 Private Sub Function 188 Private Function 成り判定(ByRef arg元位置 As g位置, ByVal arg先位置 As g位置, ByRef arg成り As Boolean) As Boolean
cls将棋盤 盤面履歴手数戻し Private Sub Function 216 Private Sub 盤面履歴手数戻し()
g位置 NewPos Public Sub Function 6 Function NewPos(Optional ByVal arg行 As Variant, Optional ByVal arg列 As Variant) As g位置
cls将棋進行 ゲーム開始 Public Sub Function 49 Public Sub ゲーム開始(Optional ByVal arg手合い As String, Optional ByVal arg大橋流 As Boolean)
cls将棋進行 ゲーム終了 Public Sub Function 106 Public Sub ゲーム終了()
cls将棋進行 特定局面再現 Public Sub Function 110 Public Sub 特定局面再現(ByVal arg手数 As Long)
cls将棋進行 Class_Initialize Private Sub Function 130 Private Sub Class_Initialize()
cls将棋進行 Class_Terminate Private Sub Function 137 Private Sub Class_Terminate()
cls将棋進行 xlApp_SheetSelectionChange Private Sub Function 145 Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 'WithEventsのxlAppのイベント
cls将棋進行 駒配置 Private Sub Function 173 Private Sub 駒配置(ByVal arg手合い As String, ByVal arg大橋流 As Boolean) '大橋流でゆっくり駒を並べます。
cls将棋進行 棋譜位置 Private Sub Function 263 Private Function 棋譜位置(ByVal arg列 As Integer, ByVal arg行 As Integer) As g位置 '棋譜の筋・段を配列の行・列に変換
cls将棋進行 駒選択将棋盤 Private Sub Function 273 Private Sub 駒選択将棋盤() '盤内を選択した時に駒選択と移動可能位置の色設定を行う
'移動可能位置をクリックした場合は着手し駒を移動する
cls将棋進行 駒選択駒台 Private Sub Function 313 Private Sub 駒選択駒台() '駒台を選択した時に選択した駒の色を変更
cls将棋進行 着手 Private Sub Function 347 Private Sub 着手(ByVal arg元選択 As Range, ByVal arg先選択 As Range) '駒選択後に移動可能位置を選択したら着手します
cls将棋進行 盤面表示 Private Sub Function 378 Private Sub 盤面表示(Optional arg手数 As Long) '盤面配列をシートに表示する
cls将棋進行 選択解除 Private Sub Function 450 Private Sub 選択解除() '前回選択と今回選択を消去して選択状態を解除
cls将棋進行 選択セルを手番に移動 Private Sub Function 456 Private Sub 選択セルを手番に移動() '次のSheetSelectionChangeが効くように先手後手の位置へ選択セルを移動させる
cls将棋進行 駒移動可能位置色変更 Private Sub Function 463 Private Sub 駒移動可能位置色変更(ByVal argCol As Collection) '駒を選択した時に駒の移動可能位置の色設定を行う
cls将棋進行 駒移動可能 Private Sub Function 476 Private Function 駒移動可能(ByVal arg元選択 As Range, ByVal arg先選択 As Range) As Boolean '駒選択後の次のクリックが移動可能場所かの判定
cls将棋進行 セル2位置 Private Sub Function 491 Private Function セル2位置(ByVal argRng As Range) As g位置 'セル選択位置を配列の位置に変換
cls将棋進行 配列180度回転 Private Sub Function 499 Private Function 配列180度回転(ByRef argAry) As Variant '2次元配列を180度回転させる:実引数はRangeを想定
cls将棋進行 移動可能範囲 Private Sub Function 513 Private Function 移動可能範囲(ByVal arg元位置 As g位置, ByVal arg先位置 As g位置) As Boolean '移動可能範囲を判定してTrue/Falseで返す
cls将棋進行 選択場所 Private Sub Function 526 Private Function 選択場所(ByVal argRange As Range) As e場所 '選択場所をEnumで返す
cls将棋進行 終局判定 Private Sub Function 543 Private Function 終局判定() As Boolean '玉の詰み判定し、詰んでいれば終局
cls将棋進行 シート消去 Private Sub Function 552 Private Sub シート消去()
cls将棋進行 シート名前定義 Private Sub Function 566 Private Sub シート名前定義()
cls将棋進行 シート書式設定 Private Sub Function 589 Private Sub シート書式設定()
cls棋譜 Class_Initialize Private Sub Function 11 Private Sub Class_Initialize()
cls棋譜 Class_Terminate Private Sub Function 19 Private Sub Class_Terminate()
cls棋譜 先手 Public Property Get 23 Public Property Get 先手() As Boolean
cls棋譜 棋譜履歴 Public Property Get 28 Public Property Get 棋譜履歴() As Collection
cls棋譜 棋譜 Public Property Get 32 Public Property Get 棋譜() As String
cls棋譜 棋譜最終 Public Property Get 39 Public Property Get 棋譜最終() As String
cls棋譜 消費時間 Public Property Get 44 Public Property Get 消費時間() As String
cls棋譜 手数 Public Property Let 51 Public Property Let 手数(ByVal Value As Long)
cls棋譜 開始時刻 Public Property Get 58 Public Property Get 開始時刻() As Date
cls棋譜 最終時刻 Public Property Get 62 Public Property Get 最終時刻() As Date
cls棋譜 棋譜作成 Public Sub Function 68 Public Function 棋譜作成(ByVal arg元位置 As g位置, ByVal arg駒先 As cls駒, ByRef arg成り As Boolean) As String '棋譜はKIF形式で作成
'###1 5ニ銀成(43) (mm:ss/hh:mm:ss)
cls棋譜 KIF駒名変換 Private Sub Function 110 Private Function KIF駒名変換(ByVal arg駒先 As cls駒, ByRef arg成り As Boolean) As String
cls棋譜 棋譜履歴手数戻し Private Sub Function 128 Private Sub 棋譜履歴手数戻し() '棋譜履歴:手数戻しに対応
frm棋譜 Parent Public Property Set 9 Public Property Set Parent(ByVal argParent As cls将棋進行)
frm棋譜 btn棋譜出力_Click Private Sub Function 16 Private Sub btn棋譜出力_Click()
frm棋譜 btn対局開始_Click Private Sub Function 33 Private Sub btn対局開始_Click()
frm棋譜 lst棋譜_Change Private Sub Function 39 Private Sub lst棋譜_Change()
frm棋譜 UserForm_Initialize Private Sub Function 45 Private Sub UserForm_Initialize()
frm棋譜 棋譜表示 Public Sub Function 64 Public Sub 棋譜表示(ByVal arg棋譜 As Collection, ByVal arg開始時刻 As Date, ByVal arg最終時刻)
frm棋譜 棋譜追加 Public Sub Function 82 Public Sub 棋譜追加(ByVal arg棋譜 As String)
frm棋譜 先手後手表示 Private Sub Function 90 Private Sub 先手後手表示()
frm棋譜 UserForm_QueryClose Private Sub Function 94 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
frm棋譜 UserForm_Terminate Private Sub Function 101 Private Sub UserForm_Terminate()

この一覧は以下で紹介しているVBAを使用し自動作成したものです。
VBAコードの全プロシージャー・プロパティ一覧を取得
VBAの開発規模がある程度大きくなってくると、VBAソース管理の必要性を感じることもあると思います。モジュールの数も増えてきて、プロシージャー・プロパティが膨大になってきます。以下は、指定ブックの全モジュールの全プロシージャー・プロパティを一覧にするVBAサンプルです。

クリックで着手した時の主なプロシージャーの流れ

セルのクリックから着手されるまでに通過する主なプロシージャー

主なプロシージャーの流れを階層表示    補足説明
xlApp_SheetSelectionChange  
将棋進行クラス.xlApp_SheetSelectionChange   WithEvents
将棋進行クラス.駒選択将棋盤   盤上の駒が選択された場合
将棋進行クラス.着手   移動可能位置を選択した場合
         駒台クラス.駒追加/駒削除   駒を取った時/駒を打った時
将棋盤クラス.着手   盤面を履歴保存
         棋譜クラス.棋譜作成   棋譜を履歴保存
駒台クラス.履歴追加   駒台を履歴保存
将棋進行クラス.盤面表示  
棋譜フォーム.棋譜表示  

履歴について
各種履歴はCollectionに1手ごとに追加。
盤面・駒台・棋譜、それぞれ手数とインデックスが一致するように保存

Excel将棋のダウンロード

ここまでのVBAコードを組み込んだExcelファイルは以下からダウンロード出来ます。

エクセルのサンプルダウンロード

Excel将棋の目次

№1. Excel将棋:マクロVBAの学習用
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。
№2. Excel将棋:クラスの設計
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、VBAクラスの設計になります。設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。
№3. Excel将棋:駒クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒クラスの作成になります。駒クラスに必要な部品クラスとして、位置クラスと移動クラスを先に作成してから駒クラスの作成に進みます。
№4. Excel将棋:駒クラスの単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の№3.Excel将棋:駒クラスの作成、この単体テストになります。駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
№5. Excel将棋:駒台クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒台クラスの作成と単体テストになります。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前に作った位置クラスをデフォルトインスタンスに変更します。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№7. Excel将棋:将棋盤クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、いよいよ将棋盤クラスを作成します。駒クラスを2次元配列(1To9,1To9)に入れて将棋盤全体を管理します。
№8. Excel将棋:将棋進行クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、シートとやり取りする将棋進行クラスを作成します。ここまでは、作成したクラスのテスト実行用のVBAを別途作成し、結果をイミディエイトウィンドウに表示して確認していました。
№9. Excel将棋:駒を動かす
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を動かします。駒を動かせるように将棋進行クラスを拡張します。将棋進行クラスの完成はまだまだこれからですが、駒を動かせるようになるとゲームらしくなってきます。
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、相手の駒を取ったり、持駒を打ったりできるようにします。取った駒は駒台へ移し、駒台から駒を選んで打てるようにします。
№11. Excel将棋:駒を成る
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を成れるようにします。ただし、将棋では成らない選択も出来ますので、成れるタイミングで成るか成らないかを選択できるようにします。
№12. Excel将棋:棋譜をユーザーフォームに表示する
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、ユーザーフォームを作成し、初手からの棋譜を表示できるようにします。シート操作ができるように、ユーザーフォームはモードレスで表示します。
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、棋譜フォームの棋譜を選択することで、その時点の盤面に戻す機能を実装します。さらに、その時点から指し継ぐこともできるようにします。
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、KIF形式の棋譜ファイルの出力と、KIF形式の棋譜ファイルを読み込んで初手から終局までを自動再生させます。
№15. Excel将棋:反則(禁じ手)判定
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、反則(禁じ手)の判定を入れます。禁じ手は指し手そのものが出来ないようにします。※クラス名、プロシージャー名、変数名に日本語を使用しています。
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の反則(禁じ手)の続きで「打ち歩詰め」を実装します。打ち歩詰めを判定するには、そもそも「詰み」の判定が必要です。
№17. Excel将棋:千日手と連続王手の千日手
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、千日手と反則の「連続王手の千日手」を実装します。千日手は、他とは違ってある局面だけでは判定できません。
№18 Excel将棋:ひとまず完成、これまでとこれから
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。前回でひとまず当初目標の人vs人で動かしてゲームとして成立するところまでできました。連載の途中で、急遽棋譜の出力と読み込んで自動再生も作成しました。
№19 Excel将棋:棋譜ファイルから対局一覧作成
Excelで将棋を作るシリーズの当初目標の、人vs人で動かしてゲームとして成立するところまでは完成しました。今回は機能拡張として、棋譜ファイルを読み込み対局一覧を作成します。複数の棋譜ファイルも一度に処理できるようにしています。



新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ