ExcelマクロVBAサンプル集 | オセロを作りながらマクロVBAを学ぼう5 | Excelマクロの実用サンプル、エクセルVBA集と解説



最終更新日:2017-12-06

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


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

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

まずは、石を置ける場所の色を変更してわかりやすくしてみます。

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


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

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



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



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



項目追加



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



名前定義

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




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




L7 : 「手番石」と名前定義
M7 : このセルは、文字サイズだけ大きく(24ポイントに)してください。



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


シートモジュール

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されるプロシージャーに引数を渡しています。
CallされるSubプロシージャーが実行されると、最初に引数を受け取ります。
ここでは、オブジェクト変数であるRange型の変数を渡しています。
オブジェクト変数が渡す場合は、オブジェクトの場所を示すアドレスが渡されるものと考えて下さい。
つまり、オブジェクトそのものが渡されるわけではなく、そのオブジェクトの場所が渡されるという事です。

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



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



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

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


6へ続きます。

全体の目次


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




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

アメブロの記事本文をVBAでバックアップする1
数独(ナンプレ)を解くVBAに挑戦1
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証1
ナンバーリンク(パズル)を解くVBAに挑戦1
ナンバーリンクを解くVBAのパフォーマンス改善1

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

大量VlookupをVBAで高速に処理する方法について|ExcelマクロVBA技術解説(12月12日)
オセロを作りながらマクロVBAを学ぼう|ExcelマクロVBAサンプル集(11月26日)
ScreenUpdating=False時にエラー停止後にシートが固まったら|ExcelマクロVBA技術解説(11月21日)
データクレンジングと名寄せ|ExcelマクロVBA技術解説(10月20日)
SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い分け方|ExcelマクロVBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.CSVの読み込み方法|ExcelマクロVBAサンプル集
9.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
10.ひらがな⇔カタカナの変換|エクセル基本操作



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

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


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

    ↑ PAGE TOP