前回のおさらい
前回は、VBAを用いてシートのセルに●と○を入れて初期状態を作りました。
ここからボールを実際に動かし、ボールソリティアを動かします。
前回はその前提として、Worksheet_SelectionChangeについて確認しました。
動きを分解する
初回のクリックかどうか
ここで改めてボールソリティアを動かすためのGUIの動きについて確認します。
ボールソリティアでは、「どこにあるボールをどこに動かすか」という操作が必要になります。
つまり、初回のクリックと、その後に行われているクリックと、それぞれ処理を変更する必要があります。
ここで、初回クリックの場合には、クリックされた場所を緑色にぬりつぶし、2回目のクリックの場合には、黄色く塗りつぶされたボールを指定の場所に移動するという処理にします。
具体的な実装はこのようになります。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If InStr(Target.Address, ":") Then Exit Sub
If Target.Row > 7 Or Target.Column > 7 Then Exit Sub
Dim bfr As Range
Dim aft As Range
Dim mid As Range
Dim midRow As Long, midClm As Long
Set bfr = Target
'2回目に選択されたかどうかの判定
For iter = 0 To 48
arrRow = Int(iter / 7) + 1
arrClm = iter Mod 7 + 1
If Cells(arrRow, arrClm).Interior.ColorIndex = 4 Then
Set bfr = Cells(arrRow, arrClm)
End If
Next
If bfr.Address = Target.Address Then
'初回のクリックが行われた場合の処理
Target.Interior.ColorIndex = 4
Else
'2回目のクリックが行われた場合の処理
End If
End Sub
最初に、範囲指定が行われた場合と、クリックされた場所がボールソリティアの範囲外の場合を除外します。
その後、緑色に塗られたセルが存在すればそれを移動前のボールの場所と判定します。
仮にその判定がなければ、事前に「bfr」には今のクリック箇所が指定されていますので、「bfr.Address = Target.Address」で初回クリックであることを判定し、クリックされた場所を緑色に塗りつぶします。
2回目のクリックの場合には、その場合の処理を記載していく、という流れです。
実際にこれを操作すると、クリックした場所が緑色になりました。
2回目のクリックの場合
一方で、2回目のクリックの場合に関してですが、まず緑色にしたセルの塗りつぶしを解除します。
その上で、2回目のクリックしたセルを「aft」に格納し、後は実際にボールを動かせる状態にあるかどうかを判定していきます。
bfr.Interior.ColorIndex = 0
Set aft = Target
If Abs(bfr.Row - aft.Row) > 2 Then Exit Sub
If Abs(bfr.Column - aft.Column) > 2 Then Exit Sub '①
midRow = (bfr.Row + aft.Row) / 2
midClm = (bfr.Column + aft.Column) / 2
Set mid = Cells(midRow, midClm)
If midRow <> Int(midRow) Then Exit Sub
If midClm <> Int(midClm) Then Exit Sub '②
If bfr.Value <> "●" Then Exit Sub
If aft.Value <> "○" Then Exit Sub
If mid <> "●" Then Exit Sub '③
bfr = "○"
aft = "●"
mid = "○"
まず2以上離れている場合に離脱し(①)、間にセルがない場合にも離脱します(②)。
移動前と移動後、その間のボールの情愛が適切かを判定し(③)、問題がなければボールの設置場所を変更します。
やっていることは非常に単純ですが、単純だからこそ、動かせない状態の判定は意外と細かくなります。
あとは実際に動くかどうかを試してみれば、実装完了です。
コメント