この記事は 『Excelでリバーシを作ろう!! マクロ、VBAを1から学ぶ』 のサンプルです。
前:【三目並べ:3. クリックで石が置けるようにする】
https://qiita.com/sano192/items/4765ec3d3737891743e8
次:【三目並べ:5. コードにコメントを入れる】
https://qiita.com/sano192/items/d8f124a61211efc86085
Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です!
プログラミングが全くわからない人でも大丈夫! 丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます!
値段:300円(Kindle Unlimited対象)
【kindle】
【booth(pdf】
これで石を置けるようになりました。が、まだ黒石しか置けません。
黒石→白石→黒石→白石→…と交互に石を置けるようにしましょう。
次のように処理します。
(1)セルをクリックする
(2)まだ石を置いていない場所をクリックしたら手番に合わせた石を置く
(3)手番を変更する
(1)セルをクリックする
クリックしたときの処理はすでに書いている通り、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
この間に書けばOKです。
(2)まだ石を置いていない場所をクリックしたら手番に合わせた石を置く
クリックしたセルに石が置いていない場合は石を置きます。逆に言えばすでに石が置いているセルをクリックした場合はなにも起きないようにしなければなりません。
そこで
「クリックしたセルが空白でなければ」→「処理を行わない」
という条件分岐を入れます。
セル(Gyou, Retu)が空白であるという条件は「Cells(Gyou, Retu)=""」と書きます。しかし書きたい条件は「空白でない」場合です。「○○でない」という条件は「<>」を使います。
If Cells(Gyou, Retu) <> "" Then
もしすでに石がある場所をクリックした場合、すなわちセル(Gyou,Retu)が空白でなければ→処理を途中終了する、という処理内容にしたいです。
途中で処理を終了するときは
Exit Sub
と書きます。
まとめると「クリックしたセルに石が置いている場合は処理を途中終了する」という処理は以下のようになります。
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)=「白番」ならば→「○」をクリックしたセルに入力
という条件と処理内容を書いてみましょう。
If Cells(2, 6) = "黒番" Then
Cells(Gyou, Retu) = "●"
ElseIf Cells(2, 6) = "白番" Then
Cells(Gyou, Retu) = "○"
End If
このようになります。
(3)手番を変更する
手番の変更は簡単で、石を置いたらセル(F2)に黒石を置いたら「黒番」、白石を置いたら「白番」を入力するだけです。
以下のようになります。
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の直後に書いてください。
この節で書いたコードの全体は以下です。
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)以外の箇所をクリックしても何も起きないようになっているか?
・石が置かれている箇所をクリックしても上書きされないか?
・黒番なら「●」、白番なら「○」が入力されるか?
・黒番→白番→黒番→白番→…と手番の表示は入れ替わっていくか?
コードがあっていれば上記の全てがクリアできるはずです。
なにか上手く行かなかったり、エラーが出たりする人は、次にコードの全体を載せているので自分の書いたものと見比べてみてください。
【ここまでのコード】
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