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



最終更新日:2017-12-06

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


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

石を置ける場所の定義を、前回は文章で書きました、
今回は、それをもとにマクロVBAのプログラミングをしていきます。

考え方は決定しているので、後はVBAに翻訳(コーディング)していくだけです。

まずは、前回のまとめの確認です。

自分の石を置ける場所の判定の整理
・判定セルから、8方向に検査を進める
・8方向は、
 For i = -1 To 1
 For j = -1 To 1
 これをネストする
・1方向に向かって順に置かれている石を判定
 終了条件は、
  ・空白(石が置かれていない)
  ・自分の石が置かれている
 自分の石が置かれていて終了した時、それまでに相手の石があるか
・8方向のいずれか一つでも、上記条件を満たせば、自分の石が置ける


セルをダブルクリックした時、
そこに石が置けるかどうかを判定し、メッセージボックスを表示するようにしてみます。


シート「オセロ」のシートモジュールにダブルクリックのイベントプロシージャーを追加します。



Sheet1(オセロ)
ここをダブルクリックします。
または、右クリックから「コードの表示



この下にダブルクリックのイベントプロシージャーを追加します。



プロシージャーが追加されます。
左オブジェクト選択のドロップタ゜ウンを「Worksheet」を選択した時点で、
「Worksheet_SelectionChange」これが追加されてしまいます。
残したままでも特に問題はありませんが、削除しておきましょう。
以下のコードを追加してください。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Set TarggetSheet = Sheet1
  Set 置く石 = Range("L2")
  Set 相手石 = Range("L3")
  If is置ける全方向(Target) Then
    MsgBox "置ける"
  Else
    MsgBox "置けない"
  End If
  Cancel = True
End Sub

引数の、
TargetはRangeオブジェクトです。
ダブルクリックしたセルになります。



標準モジュールに石が置けるかの判定を作ります。



Module1
ここをダブルクリック
または、右クリックから「コードの表示

Option Explicit
これだけが入っているはずなので、その下に以下のコードを追加してください。

Public TarggetSheet As Worksheet
Public 置く石 As Range
Public 相手石 As Range

Function is置ける全方向(ByVal Target As Range) As Boolean
  Dim i As Long
  Dim j As Long
  '既に石が置いてある場合は置けない
  If Target.Value <> "" Then
    is置ける全方向 = False
    Exit Function
  End If
  '8方向を順に判定
  For i = -1 To 1
    For j = -1 To 1
      If is置ける1方向(Target, i, j) Then
        is置ける全方向 = True
      End If
    Next
  Next
End Function

Function is置ける1方向(ByVal Target As Range, _
      ByVal i As Long, _
      ByVal j As Long) As Boolean
  Dim r As Long
  Dim c As Long
  Dim is置く石 As Boolean
  Dim is相手石 As Boolean
  '石を置くセルの行列位置
  r = Target.Row
  c = Target.Column
  With TarggetSheet
    '空白or置く石と同じ石が出てくるまで判定
    Do
      r = r + i
      c = c + j
      '空白(石が置かれていない)
      If .Cells(r, c) = "" Then
        Exit Do
      End If
      '自分の石が置かれている
      If .Cells(r, c).Font.Color = 置く石.Font.Color Then
        is置く石 = True
        Exit Do
      End If
      '相手の石が置かれている
      If .Cells(r, c).Font.Color <> 置く石.Font.Color Then
        is相手石 = True
      End If
    Loop
  End With
  '自分の石が置かれていて終了した時、それまでに相手の石があるか
  If is置く石 = True And is相手石 = True Then
    is置ける1方向 = True
  End If
End Function

良く使うオブジェクトをオブジェクト変数パプリック変数として定義しています。

Public TarggetSheet As Worksheet ・・・ オセロ盤があるシート
Public 置く石 As Range ・・・ 置く石が設定されているセル
Public 相手石 As Range ・・・ 相手の石が設定されているセル

Worksheet_BeforeDoubleClick
この中で、パブリック変数を設定してから、 「is置ける全方向」を呼び出します。
Cancel = True
これは、ダブルクリックの後にセル編集状態にならないように、イベントを終了させるためのものです。

Functionプロシージャー
プログラム内で特定の作業を実行し、値を返すプロシージャです。
Functionプロシージャーの括弧()の中に引数が指定されています。
これは、プロシージャーに引数を渡しています。

is置ける全方向
これで8方向を判定できるようにしています。
実際には3×3=9方向なのですがも行0列0の移動は石を置きたい場所なので、
既に石が置いてある場合は置けない判定で直ぐに判定が終了しています。
If is置ける1方向(Target, i, j) Then
これで、1方向でも「置ける」判定であれば、「置ける」と返すようにしています。

is置ける1方向
ここでは、「is置ける全方向」から渡された方向について判定をします。
If is置く石 = True And is相手石 = True Then
これで、相手の石があって、その先に置く石があることを判定しています。

.Font.Color
この違いで判定しているので、少しわかりずらいかもしれませんが、
個々のステートメントは極めて基本的なものだけとなっています。

変数の型として、Boolean(ブール型)を多用しています。
ブール型は、True,Falseの2値をとる変数です。
つまり、ON,OFFや有,無等々の状態判定に使います。

判定に必要な項目の状態を、その項目ごとにTrue,Falseを先に判定し設定しておくことで、
その後に、複数の項目の状態を判定し、全体として条件を満たしているかどうかを判定しています。
これは、判定が複雑な場合に良く使う手法ですので、ぜひマスターして下さい。



「自分の石を置ける場所の判定の整理」
この文章と、VBAコードを見比べて下さい。
参考程度ではありますが、VBA内にコメントを書いておきました。

実際に、オセロ盤をダブルクリックして動作確認してみて下さい。
石の配置を変更する場合は、シート保護を解除してからコピペで石を配置してください。


今回は、文章をVBAコードにする部分に注力しました。
これで、オセロゲームの根本的な部分のロジックができましたので、
次回からは、ゲームとしての機能を一つずつ追加していきます。

5へ続きます。

全体の目次


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




同じテーマ「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を学ぼう4

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


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

    ↑ PAGE TOP