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

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日: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 ・・・新着記事一覧を見る

抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.マクロって何?VBAって何?|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説




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


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



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