【めざせExcelマスターへの道】ボールソリティアを作る②

Excel
  • VBAの特性を活かして、GUIが必要なボールソリティアを作っていきます
  • 前回の課程を踏まえて、ついに完成させます。
スポンサーリンク

前回のおさらい

前回は、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以上離れている場合に離脱し(①)、間にセルがない場合にも離脱します(②)。

移動前と移動後、その間のボールの情愛が適切かを判定し(③)、問題がなければボールの設置場所を変更します。

やっていることは非常に単純ですが、単純だからこそ、動かせない状態の判定は意外と細かくなります。

あとは実際に動くかどうかを試してみれば、実装完了です。

コメント

タイトルとURLをコピーしました