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

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

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


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


15回に渡って、オセロ作成をしてきました、
マクロVBAコードはかなりの量になっています。
今回は最終回として、これまでを振り返ってみます。

№1.シートの用意と標準モジュールの挿入
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第1回です。まずはシートを用意しなければなりません、このシートの作り方で、その後の手間が随分と変わってきますので、しっかりと作ります。とはいえ、まずは一般的な感じで作ってみます、今後必要に応じて追加・変更していきます。
シートの用意と、標準モジュールの挿入という、
マクロをやった事のない人にもわかるレベルから始めました。

№2.ブックを開いたときの処理と初期配置
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第2回です。前回でシートの準備と標準モジュールを挿入しましたので、今回からは、マクロVBAをどんどん書き足していきます。まずは、イベントプロシージャーを作っていきます。
イベントプロシージャーを作りました。
こういうソフト(ゲーム)の場合には、避けて通れないのがイベントになります。
イベントを完全に理解するのは、少々大変かもれませんが、
記事では、操作中心に記載しました。

№3.自分の石を置ける場所の判定の整理
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第3回です。いよいよ自分の石を置いて、相手の石をひっくり返す処理に進むのですが、その前に、そもそも自分の石を置ける場所はどこなのか…。クリックしたセルは、自分の石を置いて良いセルなのかの判定が必要です。
自分の石を置ける場所の判定
これをじっくり解説しました。
本シリーズで最も伝えたい部分になります。
やりたいことを整理して、簡潔にまとめる
これこそが、マクロVBA上達に一番大切な事です。

№4.自分の石を置ける場所の判定の実装
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第4回です。石を置ける場所の定義を、前回は文章で書きました、今回は、それをもとにマクロVBAのプログラミングをしていきます。考え方は決定しているので、後はVBAに翻訳(コーディング)していくだけです。
文章で書いたものを、マクロVBAで記述する。
まさに、一番苦労する部分でもあります。
ここを乗り切るのは大変です。
その為にも、先にしっかりと文章化しておくことが重要だという事です。

№5.シート機能を拡張して今後の準備
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第5回です。前回で石を置ける場所の判定が完成しましたので、これからは、ゲームとしての機能を一つずつ追加していきます。まずは、石を置ける場所の色を変更してわかりやすくしてみます。
名前定義をしました。
VBAで、セル番地を直接書くと、分かりずらい事とセル位置の変更が大変です。
名前定義をすることで、VBAを読みやすく、そして、シートの変更に柔軟に対応できるようにしています。

№6.黒石白石を交互に打って相手の石をひっくり返す
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第6回です。いよいよ今回は、黒石白石を交互に打てるようにします。もちろん、相手の石を挟んでいる場所は、自分の石に取り替えます。
追加した機能は、
・ダブルクリックされた位置に手番の石を置く。
・相手の石を挟んでいたら、その相手の石を手番の石に取り替える。
・手番を交代します。
機能は難しそうですが、VBAコードの追加は割と少なくて済みました。
それまでに作成したプロシージャーがしっかりしていたという事です。


№7.パス確認、終局確認、石数取得
VBAでオセロ(リバーシ)を作っていきながらVBAを学ぶ第7回です。前回までで、黒石白石を交互に打つことができるようになりましたが、まだまた不都合な点があります。石を打つ場所がない時に、パスが出来ないから先に進まない… 全部石が埋まっても、何も変化がない… そもそも、どっちが勝っているのかもわからない… つまり、
パスとは
終局とは
これらの定義をしてから、マクロVBAコードを作成しています。
定義をしっかりしないと、このような処理はVBAコードを書くことが出来ません。

№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回です。前回は、相手の応手を判定して、自分の置く場所を決められるようにしました。オセロソフトとしては、そこそこの強さになりました。
ソフトの強さを判定するには、実際に戦わせてみるのが一番です。
というか、ゲームなので、実際に戦ってみないと強さは分からないです。
何十戦、何百戦と、PC同士で戦わせた結果をみられるようにしました。

№13.パラメーターと重みを調整してさらに強く
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、PC1からPC5までの5段階の状態で、総当り対戦で強さを判定しましたが、PC5が最も強い事が確認出来ました。それでもPC5では、まだまだ、ある程度オセロをやった事のある人には勝てないレベルです。
自分の打つ手、相手の応手、
これを数値化する部分の調整と、
新たに、評価項目を追加して、より強くしました。
強くなったかは、実際にPC同士で戦わせて確認します。
確実に強くなったことが確認出来ました。

№14.やはり「待った」が欲しい
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第14回です。前回で、6段階の強さのPCオセロが完成しました、一番強いPC6でも、まだまだそれほどの強さとは言えませんが、初心者の人なら苦戦するでしょうし、私も油断すれば負けてしまうくらいの強さにはなっています。
あくまで個人で楽しむソフトなので、楽しめるような機能を追加しました。

「待った」が楽しいかどうかは疑問もありますが・・・
「待った」の実装の為には、棋譜も必要なので保存できるようにしました。

№15.棋譜で対局を再現
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第15回です。棋譜が扱えるようになり、「待った」の実装も出来ました。棋譜が扱えるようになったので、今回は、対局を再現できるようにします。
棋譜があつかえるようになったので、
せっかくなので棋譜とおりに対局を再現できるようにしました。
1手ずつ見ていくことで、敗因・勝因もわかるようになる・・・かも
これにより、他で作成された棋譜(があれば)も再現できるはずです。


最後の機能追加
シートの見出しが邪魔な感じがします。

マクロVBAサンプル

オセロの座標と、エクセルの行列見出しがあり、
ちょっと勘違いしやすくなってしまっています。
この見出しを消すには、

マクロVBAサンプル

表示→見出し
このチェックを外します。
そこで、ブックを開いたら、マクロでそれをやってしまいましょう。

ActiveWindow.DisplayHeadings = False

この一文を、
ThisWorkbook内のWorkbook_Openイベントに追記します。
追記する場所は、どこでも良いのですが、

      .AddItem "PC5"
      .AddItem "PC6"
    End With
    ActiveWindow.DisplayHeadings = False
    .Protect
  End With
End Sub

シート保護する直前に入れました。



作成したソフトの最強でも、私には勝てません。
今回のソフトは、
自分が打つ→相手が打つ
ここまでしか判断していません。
中盤までは、場所の重みと相手の手までを考えれば、とりあえずは十分ですが、
終盤近くになると、もう少し先を考えないと勝てなくなります。
私ですと、
自分が打つ→相手が打つ→自分が打つ
終盤では、最低でもここまでは考えます。
従って、私に勝つには、最低でももう1手先まで評価する必要があります。
しかし、
置ける場所が8箇所だとしたら、
3手先は、
8×8×8=512
この中から最善手を選ぶことになりますので、かなり高度な判定が必要になります。
プログラミングテクニックも高度なものが必要となってきます。
プログラミングテクニックはともかく、
オセロとしての、効率的な最善手の判定方法は調べなければ私にはわかりません。
私自身、それほどオセロが強いわけではありません。
今回作成したソフトのロジックは、私がオセロを打つときに考えていることをVBAコードにしただけであり、
しかも、先読みも2手先までとなっているので、そんなに強くなるはずがありません。
今後時間が取れて、良い案が出たら続きを作成するかもしれませんが、多分ないと思います。

今回のシリーズとしての目的は、
思考を論理的に整理し、それをプログラミング言語に表す
オセロを打つとは、どういう事か
オセロで勝つためには、どのように打てば良いか
これらを、自分で考えて、それをマクロVBAで書くととどうなるか
今回の記事は、ここに注力して書いてみました。


全体の目次
はじめに
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」をお願いいたします。
    本文下部へ