ExcelマクロVBAサンプル集
オセロを作りながらマクロVBAを学ぼう№5

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

オセロを作りながらマクロVBAを学ぼう№5


ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第5回です。


前回で石を置ける場所の判定が完成しましたので、
これからは、ゲームとしての機能を一つずつ追加していきます。
まずは、石を置ける場所の色を変更してわかりやすくしてみます。

これから次々に機能追加する上で、マクロVBAコードを書きやすくする為に、
シートに項目を追加と手直しをします。


シート保護解除とスクロールエリア解除
シートには、シート保護と、スクロールエリアが設定されています。
このままでは、シートの修正が出来ません。

シート保護の解除をしてください。

マクロVBA参考画像

次に、スクロールエリアを解除します。

マクロVBA参考画像

この「ScrollArea」の値を消去してください。



項目追加
マクロVBA参考画像

P2セルとP3セルに、上図のように設定してください。
色と文字は自由に設定して構いません。



名前定義
B2~I9:「盤面」と名前定義

マクロVBA参考画像


L2 : 「先番石」と名前定義
L3 : 「後番石」と名前定義
P2 : 「ベース色」と名前定義
P3 : 「置ける場所色」と名前定義

マクロVBA参考画像


L7 : 「手番石」と名前定義

M7 : このセルは、文字サイズだけ大きく(24ポイントに)してください。

マクロVBA参考画像



以上で、シートの準備は完了です。
では、石を置ける場所の色を変更します。


シートモジュール

btn1_Clickの内容を以下に変更します。



Private Sub btn1_Click()
  Unprotect
  Set TarggetSheet = Sheet1
  Call 対戦開始
  Protect
End Sub

前回までは、初期配置の石を置くVBAコードだけをそのまま書いていました。
ゲームスタートとしての機能に変更します。
また、石を置く処理は今後は度々使う必要が出てきます。
そこで、専用のSubプロシージャーがあったほうが便利です。



標準モジュール

対戦開始します。
最初に、先手番の石が、今回の手番の石になるようにします。
Public変数に、手番として置く石と相手の石を、共通変数設定します。
そして、初期配置の4つの石を置く
石が置かれたら、次の手番の石を置ける場所表示(セルの色を変更)します。

以下を標準モジュールに追加してください。

Sub 対戦開始()
  With TarggetSheet
    .Range("先番石").Copy Destination:=.Range("手番石")
    .Range("手番石").Offset(, 1) = "の番です。"
    .Range("盤面").ClearContents
    Call 共通変数設定
    Call 石を置く(.Range("盤面").Cells(4, 4), 置く石)
    Call 石を置く(.Range("盤面").Cells(5, 5), 置く石)
    Call 石を置く(.Range("盤面").Cells(4, 5), 相手石)
    Call 石を置く(.Range("盤面").Cells(5, 4), 相手石)
    Call 置ける場所表示
  End With
End Sub

Sub 共通変数設定()
  Set TarggetSheet = Sheet1
  With TarggetSheet
    If .Range("手番石").Font.Color = .Range("先番石").Font.Color Then
      Set 置く石 = .Range("先番石")
      Set 相手石 = .Range("後番石")
    Else
      Set 置く石 = .Range("後番石")
      Set 相手石 = .Range("先番石")
    End If
  End With
End Sub

Sub 石を置く(ByVal ToRng As Range, FromRng As Range)
  With TarggetSheet
    ToRng.Value = FromRng.Value
    ToRng.Font.Size = FromRng.Font.Size
    ToRng.Font.Color = FromRng.Font.Color
  End With
End Sub

Sub 置ける場所表示()
  Dim myRng As Range
  With TarggetSheet
    .Range("盤面").Interior.Color = .Range("ベース色").Interior.Color
    For Each myRng In .Range("盤面")
      If is置ける全方向(myRng) Then
        myRng.Interior.Color = .Range("置ける場所色").Interior.Color
      End If
    Next
  End With
End Sub

対戦開始
先手番の石を今回の手番の石にする。
盤面を初期クリア。
共通変数設定をCallします。
初期配置の4石を置きます。
ける場所表示をCallします。

共通変数設定
手番の石を判定し、置く石と相手の石を設定します。

石を置く
指定された石(手番石or相手石)を、指定の場所に置きます。
Subプロシージャーの括弧()の中に引数が指定されています。
これはCallしているプロシージャーが、Callされるプロシージャーに引数を渡しています。
SubプロシージャーFunctionプロシージャーにおける引数リストの指定について説明します引数は呼び出し先のプロシージャーに渡すデータを指定するものです。Callステートメントでプロシージャーを呼び出すときに指定する引数を呼び出される側のプロシージャーで受け取る記述についての説明になります。
CallされるSubプロシージャーが実行されると、最初に引数を受け取ります。
ここでは、オブジェクト変数であるRange型の変数を渡しています。
オブジェクト変数が渡す場合は、オブジェクトの場所を示すアドレスが渡されるものと考えて下さい。
つまり、オブジェクトそのものが渡されるわけではなく、そのオブジェクトの場所が渡されるという事です。

置ける場所表示
盤面全体を初期の色にします。
石が置けるかどうか、盤面全体のセルを全て判定します。
判定には、前回作成した、
is置ける全方向
これで判定し、置けると判定されたら色を設定します。



これで、「対戦開始」をクリックすると、
初期配置の4石がおかれ、先手番の黒石のおける場所のセル食が変更された状態になります。

マクロVBAサンプル画像

ただし、まだ次の石を置けません。

今回は、シートの手直しと、今後の為の準備的なVBAコードの追加でした。
いよいよ次回は、黒石白石を交互に打てるようにします。
もちろん、相手の石を挟んでいる場所は、自分の石に取り替えます。
さて、いよいよゲームらしくなっていきます。


№6へ続きます。

全体の目次


ここまでのサンプルファイルのダウンロード




同じテーマ「マクロVBAサンプル集」の記事

エクセルでファイル一覧を作成
アメブロの記事本文をVBAでバックアップする№6
数独(ナンプレ)を解くVBAに挑戦№5
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№4
ナンバーリンク(パズル)を解くVBAに挑戦№8
ナンバーリンクを解くVBAのパフォーマンス改善№3
オセロを作りながらマクロVBAを学ぼう№9
他ブックへのリンクエラーを探し解除するマクロ(変更前)
Excelシートの複雑な計算式を解析するVBAの関数構文


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

Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • オセロを作りながらマクロVBAを学ぼう№5

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


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




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