『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』サンプル(5)　【三目並べ：4. 手番を変える】

この記事は **『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』** のサンプルです。

前：【三目並べ：3. クリックで石が置けるようにする】
https://qiita.com/sano192/items/4765ec3d3737891743e8

次：【三目並べ：5. コードにコメントを入れる】
https://qiita.com/sano192/items/d8f124a61211efc86085

Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です！
プログラミングが全くわからない人でも大丈夫！　丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます！
**値段：300円(Kindle Unlimited対象)**

**【kindle】**

https://www.amazon.co.jp/dp/B09XLM42MW

**【booth(pdf】**

https://sano192.booth.pm/items/3785312

これで石を置けるようになりました。が、まだ黒石しか置けません。
　
黒石→白石→黒石→白石→…と交互に石を置けるようにしましょう。
　
次のように処理します。
(1)セルをクリックする
(2)まだ石を置いていない場所をクリックしたら手番に合わせた石を置く
(3)手番を変更する
　
(1)セルをクリックする
クリックしたときの処理はすでに書いている通り、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
　     
End Sub
この間に書けばOKです。
　
(2)まだ石を置いていない場所をクリックしたら手番に合わせた石を置く
クリックしたセルに石が置いていない場合は石を置きます。逆に言えばすでに石が置いているセルをクリックした場合はなにも起きないようにしなければなりません。
　
そこで
「クリックしたセルが空白でなければ」→「処理を行わない」
という条件分岐を入れます。
　
セル(Gyou, Retu)が空白であるという条件は「Cells(Gyou, Retu)=""」と書きます。しかし書きたい条件は「空白でない」場合です。「○○でない」という条件は「<>」を使います。

```vb:
 If Cells(Gyou, Retu) <> "" Then
```

もしすでに石がある場所をクリックした場合、すなわちセル(Gyou,Retu)が空白でなければ→処理を途中終了する、という処理内容にしたいです。
　
途中で処理を終了するときは
　
Exit Sub
　
と書きます。
　
まとめると「クリックしたセルに石が置いている場合は処理を途中終了する」という処理は以下のようになります。

```vb:
If Cells(Gyou, Retu) <> "" Then
  
    Exit Sub

End If
```

このコードは
If 2 <= Gyou And Gyou <= 4 And 2 <= Retu And Retu <= 4 Thenの直後に書いてください。
　
「手番に合わせた石を置く」という処理を行うにはまず手番を確認しなければなりません。
手番はセル(F2)に「黒番」または「白番」と表示する想定なので、セル(F2)の値を確認してこちらも条件分岐すればOKです。
　
セル(F2)=「黒番」ならば→「●」をクリックしたセルに入力
セル(F2)=「白番」ならば→「○」をクリックしたセルに入力
　
と入力します。条件が2個出てきましたね。こういうときはElseIfを使います。
　
以下のように書くことで、
「条件1」が満たされていれば→「処理内容1」を行う
「条件2」が満たされていれば→「処理内容2」を行う
と処理できます。
　
If 条件1 Then
　        
    ～処理内容1～
　
ElseIf 条件2 Then
　
    ～処理内容2～
　
End If
　
ElseIfの「Else」は「その他に」という意味です。「その他に○○という条件を満たせば」という意味でElseIfと書きます。
　
もしセル(F2)=「黒番」ならば→「●」をクリックしたセルに入力
もしセル(F2)=「白番」ならば→「○」をクリックしたセルに入力
という条件と処理内容を書いてみましょう。

```vb:
If Cells(2, 6) = "黒番" Then
    Cells(Gyou, Retu) = "●"

ElseIf Cells(2, 6) = "白番" Then
    Cells(Gyou, Retu) = "○"

End If
```

このようになります。
　
(3)手番を変更する
手番の変更は簡単で、石を置いたらセル(F2)に黒石を置いたら「黒番」、白石を置いたら「白番」を入力するだけです。
　
以下のようになります。

```vb:
If Cells(2, 6) = "黒番" Then
    Cells(Gyou, Retu) = "●"
    Cells(2, 6) = "白番"

ElseIf Cells(2, 6) = "白番" Then
    Cells(Gyou, Retu) = "○"
    Cells(2, 6) = "黒番"

End If
```
このコードは
If Cells(Gyou, Retu) <> "" Then~End Ifの直後に書いてください。
　
この節で書いたコードの全体は以下です。
```vb:
If 2 <= Gyou And Gyou <= 4 And 2 <= Retu And Retu <= 4 Then

    If Cells(Gyou, Retu) <> "" Then

        Exit Sub

    End If

    If Cells(2, 6) = "黒番" Then
        Cells(Gyou, Retu) = "●"
        Cells(2, 6) = "白番"

    ElseIf Cells(2, 6) = "白番" Then
        Cells(Gyou, Retu) = "○"
        Cells(2, 6) = "黒番"

    End If

End If
```

これで以下の処理ができるようになりました。
(1)セルをクリックする
(2)まだ石を置いていない場所をクリックしたら手番に合わせた石を置く
(3)手番を変更する
　
ここまで書けたらまたテストしてみましょう。
・セル(B2)~セル(D4)以外の箇所をクリックしても何も起きないようになっているか？
・石が置かれている箇所をクリックしても上書きされないか？
・黒番なら「●」、白番なら「○」が入力されるか？
・黒番→白番→黒番→白番→…と手番の表示は入れ替わっていくか？
コードがあっていれば上記の全てがクリアできるはずです。
　
なにか上手く行かなかったり、エラーが出たりする人は、次にコードの全体を載せているので自分の書いたものと見比べてみてください。

【ここまでのコード】
```vb:
Sub GameStart()

    Range("B2", "D4").ClearContents
    Cells(2, 6) = "黒番"

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Gyou, Retu

    Gyou = Target.Row
    Retu = Target.Column

    If 2 <= Gyou And Gyou <= 4 And 2 <= Retu And Retu <= 4 Then

        If Cells(Gyou, Retu) <> "" Then

            Exit Sub

        End If

        If Cells(2, 6) = "黒番" Then
            Cells(Gyou, Retu) = "●"
            Cells(2, 6) = "白番"

        ElseIf Cells(2, 6) = "白番" Then
            Cells(Gyou, Retu) = "○"
            Cells(2, 6) = "黒番"

        End If

    End If

End Sub
```

前：【三目並べ：3. クリックで石が置けるようにする】
https://qiita.com/sano192/items/4765ec3d3737891743e8

次：【三目並べ：5. コードにコメントを入れる】
https://qiita.com/sano192/items/d8f124a61211efc86085