map新着記事一覧アクセスランキングサイトマップ旧トップページお問い合わせホームマクロVBA応用編マクロVBAサンプル集オセロを作りながらマクロVBAを学ぼうNo11最終更新日:2019-06-16オセロを作りながらマクロVBAを学ぼうNo11ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第11回です。超々初心者なら勝てるかもしれないというレベルにはなりました。相手が良い応手を打てないような場所に自分が打つようにします。これには、かなり多くのVBAコードが必要になります。今回は、かなり多くのマクロVBAコードになります。自分の石を置いた後に、相手の打てる場所を探して判定することになります。以下の機能を追加します。・相手が置ける石の重み・相手がひっくり返す数なんとなく、何とかなりそうにも感じます。・自分の石を置くここで、実際にシートのセルに石を置いてしまいます。これでは、試行錯誤が出来ません。シミュレーションしたいのに、実際に石を置いてしまっては困ります。架空として石を置いたことにして、次の処理に進みたいのです。その為に必要なのは、シートに実際に石を置くのではなく、あくまでシミュレーションとして石を置けるようにしなければなりません。その為には、シートの盤面を配列に入れて、配列上でシミュレーションできるようにします。配列については、以下を参照してください。・配列およびマクロVBAの高速化に関するページここからは、配列を駆使したVBAになっていきます。Subモジュールレベル変数として配列を定義パプリック変数を定義します。・変数は、極力狭いスコープで使う事が望ましいとされます。TypearySimは、シートの盤面を入れる配列です。arySim2は、arySimをコピーして何度もシミュレーションする時に使います。tWaitこれは、ユーザー定義型(構造体)になります。・最後に石の置ける場所ごとに、複数の項目が必要なので構造体として定義しました。「次手候補」の中で使用します。シートの盤面を配列に入れるシートの盤面(8×8)を配列に入れます。Subその時点の手番を"1"相手を"2"として、配列に入れています。配列上で置ける場所の判定と石を置いて相手の石をひっくり返すシート上で置ける場所の判定として、既に作成済のis置ける全方向is置ける1方向これをを改造します。Functionとても長いコードになっています。is置ける全方向Sもとの、「is置ける全方向」これを配列用に改造しています。・引数についてこちらを参考にしてください。これらが都度かわるので、引数で指定できるようにしています。is置ける1方向Sもとの、「is置ける1方向」これを配列用に改造しています。置く石を、引数「id」で渡しています。is置ける1方向S2is置ける1方向Sからの派生で、石を置けるかどうかの判定だけをするものになっています。ここは、プログラミングの都合でひつようになったもので、ひつとにまとめることも出来ないことはなさそうですが、ロジックが複雑にならないように、機能を分散させたということです。相手が置ける石ばどこか、それはどの程度の価値があるかを判断します。長くなりますが、同じようなVBAコードが繰り返されます。作成済と同様処理の場合、コピペして直していく作業をします。長いコードでも、実際のタイピングはそんなに多くはないものです。・相手が置ける石の重み・相手がひっくり返す数これらのプロシージャーを追加します。tWaitこれで構造体を使う変数を配列で定義しています。石の置ける場所が複数になるので、それを配列として扱い、5つの判定項目を構造体を使っています。wait1~wait5は、4つの判定項目の結果を入れます。合計ポイントをwait9nに入れています。合計ポイントwait9nの最大値の場所に石を打つようにしています。同じように独立したプロシージャーにしました。プログラミングでは、このような事は多々行われます。全体としての可読性や、今後の拡張性を考慮してのこちになります。PCごとに、aryWaitこれに入れる数値を調整しています。PC1が一番弱く、置ける場所に適当におきます。PC5が一番強く、相手の応手を多角的に判断しています。次手シミュ3、次手シミュ4、次手シミュ5これらは、かなり同じようなVBAコードとなっています。・自分の石を置いてみる・相手の石の状態を判断するこのような順で処理を書いています。このようなロジックでは、戻り値が適正になっているかのテストが結構大変になります。VBAコードを書くのは、何とかなったとして、それが正しく動作しているかの確認が大変になります。デバッグ作業が重要になってきます。・サイト内の関連ページイミディエイトウィンドウ、ローカルウィンドウを上手に活用しなければなりません。「あなた」と「PC」だけでしたので、PCの代わりに、PC1~PC5を追加します。「次手候補」の中の記述と一致させてください。以上で完成になります。長いVBAコードですが、1行1行のコード自体は基本的なVBAコードでしかありません。頭の中で考えたことを、いかにVBAコードで表すかという事になります。・実現したい事を書き出す。石を置けるかの判定が必要このように順に掘り下げていきます。「相手が置ける場所をカウント」ここで、どうしたらよいかと試行停止せずに、それに必要なものは何か、何があればそれを実現できるのかを考えます。「何があれば」・・・当然、この時点では存在しません。それを作る為に必要なものは何かを考える。掘り下げていくと、自分で作れるものに到達します。したら、掘り下げてきた道を、逆にたどりながら、一つずつ作っていくのです。易しい道のりではありません。試行錯誤とデバッグの繰り返しになります。手本がこの世に存在しないのです。記述方法や文法の参考書はありますが、その考え方は、その人独自のものになります。自分の考えをVBAコードで実現できた時の喜びはひとしおだと思います。今回作成した、PC5これくらいですと、初心者は苦労すると思います。それでも、ある程度やっている人なら、まだ負けることはないと思います。私は、よほど油断をして適当に打たない限り負けなかったです。次回は、PC対PCを何十回と対戦させる機能を実装します。結果の記録も必要になります。実際に、どの程度強さに違いがあるのかを検証します。ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、相手の応手を判定して、自分の置く場所を決められるようにしました。オセロソフトとしては、そこそこの強さになりました。全体の目次はじめにExcelマクロVBAでオセロ(リバーシ)を作っていきながら、マクロVBAを学んで行きましょう。目的は、マクロVBAの学習であり、思考を整理しVBAでプログラミングする学習です。従って、強いソフトを作ることが目的ではありませんので、最近流行のAIなんちゃら...なんていうのは考えるつもりはありません。No1.シートの用意と標準モジュールの挿入ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第1回です。シートを用意しなければなりません、このシートの作り方で、その後の手間が随分と変わってきますので、しっかりと作ります。いえ、まずは一般的な感じで作ってみます、今後必要に応じて追加・変更していきます。No2.ブックを開いたときの処理と初期配置ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第2回です。前回でシートの準備と標準モジュールを挿入しましたので、今回からは、マクロVBAをどんどん書き足していきます。イベントプロシージャーを作っていきます。No3.自分の石を置ける場所の判定の整理ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第3回です。自分の石を置いて、相手の石をひっくり返す処理に進むのですが、その前に、そもそも自分の石を置ける場所はどこなのか...。クリックしたセルは、自分の石を置いて良いセルなのかの判定が必要です。No4.自分の石を置ける場所の判定の実装ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第4回です。石を置ける場所の定義を、前回は文章で書きました、今回は、それをもとにマクロVBAのプログラミングをしていきます。考え方は決定しているので、後はVBAに翻訳(コーディング)していくだけです。No5.シート機能を拡張して今後の準備ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第5回です。前回で石を置ける場所の判定が完成しましたので、これからは、ゲームとしての機能を一つずつ追加していきます。石を置ける場所の色を変更してわかりやすくしてみます。No6.黒石白石を交互に打って相手の石をひっくり返すExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第6回です。今回は、黒石白石を交互に打てるようにします。相手の石を挟んでいる場所は、自分の石に取り替えます。マクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第7回です。前回までで、黒石白石を交互に打つことができるようになりましたが、まだまた不都合な点があります。そもそも、どっちが勝っているのかもわからない......No8.石を置ける場所の表示とアニメーションExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第8回です。前回までで大分ゲームらしくなってきました。PC対戦の機能を入れたいところですが、今回は、はPC対戦の機能を入れる前に、気になる細かい部分を変更しておきます。No9.PC対戦の実装ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第9回です。前回までで人が打つのであれば不自由のない機能が実装できたと思います。ここからはPC対戦の機能を入れていきます。No10.置く場所に重みを付けて少しだけ強くExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第10回です。前回は、PCが自動で打つ機能を実装しました。強さはともかく、とにかくPCが勝手に売ってくれるようになりました。No11.相手の応手を評価してさらに強くマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第11回です。前回の石を置く場所に重みを付けることで、超々初心者なら勝てるかもしれないというレベルにはなりました。今回は、自分の打つ場所ではなく、No12.PC対PCの対戦で強さを確認ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、相手の応手を判定して、自分の置く場所を決められるようにしました。オセロソフトとしては、そこそこの強さになりました。No13.パラメーターと重みを調整してさらに強くExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第12回です。前回は、PC1からPC5までの5段階の状態で、総当り対戦で強さを判定しましたが、PC5が最も強い事が確認出来ました。それでもPC5では、まだまだ、ある程度オセロをやった事のある人には勝てないレベルです。No14.やはり「待った」が欲しいExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第14回です。前回で、6段階の強さのPCオセロが完成しました、一番強いPC6でも、まだまだそれほどの強さとは言えませんが、初心者の人なら苦戦するでしょうし、私も油断すれば負けてしまうくらいの強さにはなっています。No15.棋譜で対局を再現ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第15回です。棋譜が扱えるようになり、「待った」の実装も出来ました。棋譜が扱えるようになったので、今回は、対局を再現できるようにします。No16.これまでを振り返りつつ全体のまとめExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第16回です。15回に渡って、オセロ作成をしてきました、マクロVBAコードはかなりの量になっています。今回は最終回として、これまでを振り返ってみます。Next)|VBA入門5.ひらがな⇔カタカナの変換|エクセル基本操作6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門7.マクロって何?VBAって何?|VBA入門8.Excelショートカットキー一覧|Excelリファレンス9.並べ替え(Sort)|VBA入門10.エクセルVBAでのシート指定方法|VBA技術解説ホームマクロVBA応用編マクロVBAサンプル集オセロを作りながらマクロVBAを学ぼうNo11このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。アクセスランキングサイトマップ事業案内お問い合わせホームマクロVBA応用編マクロVBAサンプル集オセロを作りながらマクロVBAを学ぼうNo11このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。第114回.セル範囲⇔配列パプリック変数ユーザー定義型(構造体)Optionalデバッグ作業イミディエイトウィンドウローカルウィンドウNo12へ続きます。