この記事は 『Excelでリバーシを作ろう!! マクロ、VBAを1から学ぶ』 のサンプルです。
前:【三目並べ:2. ゲームスタートの処理】
https://qiita.com/sano192/items/af1b85dc68307320be7c
次:【三目並べ:4. 手番を変える】
https://qiita.com/sano192/items/d1c08ff7a1221bcc6dcb
Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です!
プログラミングが全くわからない人でも大丈夫! 丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます!
値段:300円(Kindle Unlimited対象)
【kindle】
【booth(pdf】
次に盤面をクリックしたら石が置けるようにする処理を書きます。
コードを書く画面に戻り、「(General)」と書かれた部分をクリックして「WorkSheet」を選択してください。
そうすると自動的に以下のようなコードが挿入されたと思います。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
別のコードが挿入されたという人は、「WorkSheet」の右側から「SelectionChange」を選択してください。
この部分には「選択されているセルが変更されたら」行う処理を記載します。
まず選択されたセルの行番号,列番号を取得しましょう。選択されたセルはTargetなので、以下のように書くことで行番号,列番号を取得できます。
行番号 = Target.Row
列番号 = Target.Column
Rowは行、Columnは列の意味です。
行番号,列番号は「変数」という箱に入れておきます。自分で名前をつけた箱を作り、そこに数字やら文字やらを入れたり取り出したりするイメージです。
行を入れる箱の名前を「Gyou」
列を入れる箱の名前を「Retu」
としましょう。
変数の名前は必ず英数字でなければなりません。日本語は使えないので注意してください。
変数はまず「この変数(箱)を用意します」と宣言します。
※宣言しなくても使えなくはないのですが、後々めんどうが多くなるのでできるだけ宣言しておきましょう。
宣言は
Dim 変数名
と書きます。「Gyou」「Retu」を宣言するなら以下のようになります。
※ここからのコードはPrivate Sub Worksheet_SelectionChange~End Subの間に記載してください
Dim Gyou, Retu
これで「Gyou]「Retu」という箱を用意できました。この箱に行番号、列番号を入れます。
以下のようなコードになります。
Gyou = Target.Row
Retu = Target.Column
これでGyouに選択されたセルの行番号,Retuに選択されたセルの列番号が入りました。
では選択されたセルに石を置く、つまり「●」「○」を入力するよう処理を書きましょう。
とりあえず黒石、「●」を入力してみます。
(「まる」で変換すれば「●」が出てきます)
Cells(Gyou, Retu) = "●"
ここまでをまとめると以下のようになっています。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Gyou, Retu
Gyou = Target.Row
Retu = Target.Column
Cells(Gyou, Retu) = "●"
End Sub
ではちゃんと機能するかテストしましょう。
エクセルの画面に戻っててきとうなセルをクリックしてみてください。
「●」が入力されれば成功です。
ちゃんと「●」が入力されました!
もし、↓図のようにコード上で黄色のマーカーが引かれている、という人がいれば、それはコードがエラーによって停止していることを意味します。
一度左上の「■」(停止)マークを押してコードの実行を止め、コードを修正して再度テストしてみましょう。
さて、ちゃんと「●」は入力されたのですが……盤面以外の場所でもクリックすると入力されてしまいます……。
これは問題なのでコードを修正しましょう。
セル(B2)~セル(D4)をクリックしたときだけ処理を行い、それ以外のときは無視するという処理に修正します。
ここで「条件分岐」という方法を使います。
条件分岐はある条件を満たすなら→処理を行うというように処理に条件付を行う方法です。
書き方は以下です。
If 条件 Then
~処理内容~
End If
処理したい条件、内容は以下のようになります。
条件:セル(B2)~セル(D4)をクリックした場合
処理内容:「●」を入力する
条件:セル(B2)~セル(D4)をクリックした場合
というのは言い換えると
条件:行番号が2以上 かつ 行番号が4以下 かつ 列番号が2以上 かつ 列番号が4以下
となります。
この条件は以下のように書けます。
If 2 <= Gyou And Gyou <= 4 And 2 <= Retu And Retu <= 4 Then
以上という条件は「<=」と書きます。「=<」と書くとエラーになるので注意してください。
行番号が2以上4以下という条件は「2<=Gyou<=4」と書きたくなりますがそれもエラーです。「2以上」「4以下」という条件はそれぞれ分けて書きます。
「かつ」という条件は「And」で表現します。4つの条件を「And」でつなげればOKです。
次に処理内容です。
処理内容:「●」を入力する
これは先程書いたコードと全く同じですから以下のようになります。
Cells(Gyou, Retu) = "●"
If~End Ifの間に書くコードは必ずインデントをIfより下げるようにしてください。
インデントを下げないとエラーになるというわけではないのですが、見やすさが大きく向上し、間違いを減らすことが出来ます。
Ifを書いたときのよくある間違いとして
・Ifの条件を書いた後、Thenを忘れる
・最後のEnd Ifを忘れる
というものがあります。Ifを書いてエラーが出たらまずこの2つを確認しましょう。
まとめると以下のようになります。
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
Cells(Gyou, Retu) = "●"
End If
End Sub
セル(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
Cells(Gyou, Retu) = "●"
End If
End Sub
前:【三目並べ:2. ゲームスタートの処理】
https://qiita.com/sano192/items/af1b85dc68307320be7c
次:【三目並べ:4. 手番を変える】
https://qiita.com/sano192/items/d1c08ff7a1221bcc6dcb