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

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



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

マクロVBAサンプル画像

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

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


№6へ続きます。
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第6回です。いよいよ今回は、黒石白石を交互に打てるようにします。もちろん、相手の石を挟んでいる場所は、自分の石に取り替えます。

全体の目次

はじめに
ExcelマクロVBAでオセロ(リバーシ)を作っていきながら、マクロVBAを学んで行きましょう。目的は、マクロVBAの学習であり、思考を整理しVBAでプログラミングする学習です。従って、強いソフトを作ることが目的ではありませんので、最近流行のAIなんちゃら…なんていうのは考えるつもりはありません。
№1.シートの用意と標準モジュールの挿入
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第1回です。まずはシートを用意しなければなりません、このシートの作り方で、その後の手間が随分と変わってきますので、しっかりと作ります。とはいえ、まずは一般的な感じで作ってみます、今後必要に応じて追加・変更していきます。
№2.ブックを開いたときの処理と初期配置
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第2回です。前回でシートの準備と標準モジュールを挿入しましたので、今回からは、マクロVBAをどんどん書き足していきます。まずは、イベントプロシージャーを作っていきます。
№3.自分の石を置ける場所の判定の整理
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第3回です。いよいよ自分の石を置いて、相手の石をひっくり返す処理に進むのですが、その前に、そもそも自分の石を置ける場所はどこなのか…。クリックしたセルは、自分の石を置いて良いセルなのかの判定が必要です。
№4.自分の石を置ける場所の判定の実装
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第4回です。石を置ける場所の定義を、前回は文章で書きました、今回は、それをもとにマクロVBAのプログラミングをしていきます。考え方は決定しているので、後はVBAに翻訳(コーディング)していくだけです。
№5.シート機能を拡張して今後の準備
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第5回です。前回で石を置ける場所の判定が完成しましたので、これからは、ゲームとしての機能を一つずつ追加していきます。まずは、石を置ける場所の色を変更してわかりやすくしてみます。
№6.黒石白石を交互に打って相手の石をひっくり返す
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第6回です。いよいよ今回は、黒石白石を交互に打てるようにします。もちろん、相手の石を挟んでいる場所は、自分の石に取り替えます。
№7.パス確認、終局確認、石数取得
VBAでオセロ(リバーシ)を作っていきながらVBAを学ぶ第7回です。前回までで、黒石白石を交互に打つことができるようになりましたが、まだまた不都合な点があります。石を打つ場所がない時に、パスが出来ないから先に進まない… 全部石が埋まっても、何も変化がない… そもそも、どっちが勝っているのかもわからない… つまり、
№8.石を置ける場所の表示とアニメーション
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第8回です。前回までで大分ゲームらしくなってきました。そろそろ、PC対戦の機能を入れたいところですが、今回は、はPC対戦の機能を入れる前に、気になる細かい部分を変更しておきます。
№9.PC対戦の実装
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第9回です。前回までで人が打つのであれば不自由のない機能が実装できたと思います。さて、ここからはPC対戦の機能を入れていきます。
№10.置く場所に重みを付けて少しだけ強く
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第10回です。前回は、PCが自動で打つ機能を実装しました。強さはともかく、とにかくPCが勝手に売ってくれるようになりました。
№11.相手の応手を評価してさらに強く
VBAでオセロ(リバーシ)を作っていきながらVBAを学ぶ第11回です。前回の石を置く場所に重みを付けることで、超々初心者なら勝てるかもしれないというレベルにはなりました。ですが、ある程度オセロをやった事のある人なら、まあ負けることはないでしょう 今回は、自分の打つ場所ではなく、
№12.PC対PCの対戦で強さを確認
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、相手の応手を判定して、自分の置く場所を決められるようにしました。オセロソフトとしては、そこそこの強さになりました。
№13.パラメーターと重みを調整してさらに強く
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、PC1からPC5までの5段階の状態で、総当り対戦で強さを判定しましたが、PC5が最も強い事が確認出来ました。それでもPC5では、まだまだ、ある程度オセロをやった事のある人には勝てないレベルです。
№14.やはり「待った」が欲しい
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第14回です。前回で、6段階の強さのPCオセロが完成しました、一番強いPC6でも、まだまだそれほどの強さとは言えませんが、初心者の人なら苦戦するでしょうし、私も油断すれば負けてしまうくらいの強さにはなっています。
№15.棋譜で対局を再現
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第15回です。棋譜が扱えるようになり、「待った」の実装も出来ました。棋譜が扱えるようになったので、今回は、対局を再現できるようにします。
№16.これまでを振り返りつつ全体のまとめ
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第16回です。15回に渡って、オセロ作成をしてきました、マクロVBAコードはかなりの量になっています。今回は最終回として、これまでを振り返ってみます。


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




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

VBAでのCSVの扱い方まとめ|VBAサンプル集(11月9日)
VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)


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

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




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


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




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