VBAサンプル集
Excel将棋:駒台クラスの作成&単体テスト(№5)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013年5月以前 最終更新日:2020-08-31

Excel将棋:駒台クラスの作成&単体テスト(№5)


VBA マクロ Excel将棋

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


今回は、駒台クラスの作成と単体テストになります。
作成するクラス全体の設計は、№2. Excel将棋:クラスの設計、こちらを参照してください。
・作成するクラスの役割と作成順 ・作成するクラスのメンバー一覧 ・駒の移動の定義 ・Excel将棋の目次

※クラス名、プロシージャー名、変数名に日本語を使用しています。
日本語を適宜使う事は、
VBAを読むときの手助けとしては、コメントをダラダラと書くより、はるかに助けになると思います。
仕事で使うVBAでは、あまり日本語は使用しないのですが、
今回はVBAの勉強材料としてのゲーム作成という事で日本語を使っていきます。

駒クラス

駒クラスの設計

種別 名称 説明
プロパティ 駒台一覧 金,1;歩,3
メソッド 駒追加 オブジェクトで追加
メソッド 駒削除 名称で削除

駒クラスのVBA

クラス名称:cls駒台

Option Explicit

Private Type t駒台
  正式名称 As String
  表示名称 As String
  個数 As Integer
End Type

Private pAry駒台(1 To 7) As t駒台
Private pCol駒台 As Collection

Private Sub Class_Initialize()
  Set pCol駒台 = New Collection
End Sub

Public Sub 駒追加(ByVal arg駒 As cls駒)
  With arg駒
    pAry駒台(.表示順).正式名称 = .正式名称
    pAry駒台(.表示順).表示名称 = .表示名称
    pAry駒台(.表示順).個数 = pAry駒台(.表示順).個数 + 1
  End With
  
  '履歴保存
  pCol駒台.Add Me.駒台一覧
End Sub

Public Sub 駒削除(ByVal arg駒 As Variant)
  Dim str駒名 As String
  
  'オブジェクトの指定と文字列指定の両方をサポート
  If IsObject(arg駒) Then 'Objectはcls駒のみ
    str駒名 = arg駒.表示名称
  Else
    str駒名 = arg駒
  End If
  
  '名称一致で駒台を探す
  Dim i As Long
  For i = LBound(pAry駒台) To UBound(pAry駒台)
    If pAry駒台(i).正式名称 = str駒名 Or _
      pAry駒台(i).表示名称 = str駒名 Then
      pAry駒台(i).個数 = pAry駒台(i).個数 - 1
      Exit For
    End If
  Next
  
  '履歴保存
  pCol駒台.Add Me.駒台一覧
End Sub

Public Function 駒台一覧() As Variant()
  駒台一覧 = ArrayCompress(pAry駒台)
End Function

'駒台の配列(1 To 7)の使っていない要素を圧縮します
Private Function ArrayCompress(ByRef argAry() As t駒台) As Variant()
  Dim ary() As Variant
  ReDim ary(LBound(argAry) To UBound(argAry), 1 To 2)
  Dim i1 As Long, i2 As Long
  For i1 = LBound(argAry) To UBound(argAry)
    If argAry(i1).個数 > 0 Then
      i2 = i2 + 1
      ary(i2, 1) = argAry(i1).表示名称
      ary(i2, 2) = argAry(i1).個数
    End If
  Next
  ArrayCompress = ary
End Function

駒台クラスVBAの解説

特段に難しいテクニックは使っていません。
ユーザー定義型とCollectionの使い方くらいでしょうか。

ユーザー定義型(構造体)

Type t駒台
これは、このクラス内でしか使わないので、特にユーザー定義型の制限を苦にしなくても大丈夫です。

第110回.ユーザー定義型・構造体(Type)|VBA入門
・Typeステートメントの構文 ・ユーザー定義型の使い方 ・ユーザー定義型の使用例 ・ユーザー定義型の制限 ・最後に
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説
・ユーザー定義型 ・クラスについて ・ユーザー定義型とクラスの速度比較 ・ユーザー定義型の制限 ・ユーザー定義型の制限とクラスとの使い分け

Collection

第58回.コレクションとは(Collection)|VBA入門
・コレクションの中から単一オブジェクトを指定する場合 ・セルであるRangeオブジェクトのコレクションは? ・コレクションの要素数 ・Collectionオブジェクト

駒台クラスのテストVBAコード

Sub test2()
  Const 先手 As Boolean = True
  Const 後手 As Boolean = False
  Dim obj駒台 As New cls駒台
  Dim obj駒 As cls駒
  
  Set obj駒 = New cls駒
  Call obj駒台.駒追加(obj駒.駒作成("金将", 先手))
  
  Set obj駒 = New cls駒
  Call obj駒台.駒追加(obj駒.駒作成("歩兵", 先手))
  
  Set obj駒 = New cls駒
  Call obj駒台.駒追加(obj駒.駒作成("金将", 先手))
  
  Set obj駒 = New cls駒
  Call obj駒台.駒追加(obj駒.駒作成("歩兵", 先手))
  
  Set obj駒 = New cls駒
  Call obj駒台.駒追加(obj駒.駒作成("銀将", 先手))
  
  Call obj駒台.駒削除("金")
  
  Call PrintArray(obj駒台.駒台一覧, ":")
End Sub

Sub PrintArray(ByRef ary, Optional separator As String = "")
  Dim i As Long, j As Long, str As String
  For i = LBound(ary, 1) To UBound(ary, 1)
    str = ""
    For j = LBound(ary, 2) To UBound(ary, 2)
      If j > LBound(ary, 2) Then str = str & separator
      str = str & ary(i, j)
    Next
    Debug.Print str
  Next
End Sub

駒台に、以下の順番で出し入れしています。
金 ← 追加
歩 ← 追加
金 ← 追加
歩 ← 追加
銀 ← 追加
金 ← 削除

駒クラスのテストVBAの結果

イミディエイト ウィンドウの出力です。
VBEの使い方:イミディエイト ウィンドウ
・イミディエイト ウィンドウの表示 ・イミディエイト ウィンドウの基本的な使い方 ・イミディエイト ウィンドウの高度な使い方 ・イミディエイト ウィンドウの最後に
先手▲、後手△
金:1
銀:1
歩:2
:
:
:
:

Excel将棋の目次

№1. Excel将棋:マクロVBAの学習用
・Excel将棋の要件定義 ・Excel将棋のシート作成 ・Excel将棋の目次
№2. Excel将棋:クラスの設計
・作成するクラスの役割と作成順 ・作成するクラスのメンバー一覧 ・駒の移動の定義 ・Excel将棋の目次
№3. Excel将棋:駒クラスの作成
・位置クラス ・移動クラス ・駒クラス ・駒クラスVBAの解説 ・使用しているVBAの参考ページ ・Excel将棋の目次
№4. Excel将棋:駒クラスの単体テスト
・駒クラスのテスト内容 ・駒クラスのテストVBAコード ・駒クラスのテストVBAの結果 ・Excel将棋の目次
№5. Excel将棋:駒台クラスの作成&単体テスト
・駒クラス ・駒台クラスVBAの解説 ・駒台クラスのテストVBAコード ・駒クラスのテストVBAの結果 ・Excel将棋の目次
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
・デフォルトインスタンスに変更する理由と方法 ・位置クラスのインポート用ソース ・cls位置とg位置の使い方の違い ・位置クラス変更に伴う駒クラスの変更 ・Excel将棋の目次
№7. Excel将棋:将棋盤クラスの作成&単体テスト
・将棋盤クラス ・将棋盤クラスVBAの解説 ・将棋盤クラスのテストVBAコード ・将棋盤クラスのテストVBAの結果 ・Excel将棋の目次
№8. Excel将棋:将棋進行クラスの作成
・将棋進行クラス ・将棋進行クラスVBAの解説 ・将棋進行クラスの起動方法 ・将棋盤クラスのテストVBAの結果 ・Excel将棋の目次
№9. Excel将棋:駒を動かす
・駒クラスにプロパティ追加 ・将棋進行クラスの変更点 ・将棋進行クラスのVBA ・Excel将棋の実行動作 ・Excel将棋の目次
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
・主な変更追加箇所 ・全体の構成 ・Excel将棋の動作 ・Excel将棋の全VBAコード ・Excel将棋の目次
№11. Excel将棋:駒を成る
・主な変更追加箇所 ・Excel将棋の動作 ・変更したクラスのVBA ・Excel将棋の目次
№12. Excel将棋:棋譜をユーザーフォームに表示する
・棋譜について ・主な変更内容 ・ユーザーフォームの作成 ・Excel将棋の動作 ・変更したクラスのVBA ・Excel将棋の目次
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
・Excel将棋の動作 ・全体構成図 ・全プロシージャー・プロパティの一覧 ・クリックで着手した時の主なプロシージャーの流れ ・Excel将棋のダウンロード ・Excel将棋の目次
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
・Excel将棋の動作 ・VBAの修正箇所について ・Excel将棋のダウンロード ・棋譜KIFファイルのサンプル ・Excel将棋の目次
№15. Excel将棋:反則(禁じ手)判定
・反則(禁じ手) ・Excel将棋の動作 ・各クラスの共通で持つプロパティを整理 ・VBAの修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
・反則(禁じ手) ・Excel将棋の動作 ・VBAの追加・修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№17. Excel将棋:千日手と連続王手の千日手
・反則(禁じ手) ・Excel将棋の動作 ・VBAの修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№18 Excel将棋:ひとまず完成、これまでとこれから
・Excel将棋のこれから ・Excel将棋の目次 ・Excel将棋のダウンロード ・当初のクラス設計 ・作成するクラスのメンバー一覧 ・全体構成図 ・全プロシージャー・プロパティの一覧 ・全VBAコード
№19 Excel将棋:棋譜ファイルから対局一覧作成
・対局一覧のシート ・Excel将棋の動作 ・全体構成図 ・Excel将棋のダウンロード ・新規追加したVBAコード ・Excel将棋の目次



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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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