HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 指定範囲外にセルを移動させない

即効テクニック

セル操作関連のテクニック

指定範囲外にセルを移動させない

(Excel 97/2000/2002/2003/2007)

ある指定したセル範囲の外にアクティブセルを移動させないようにするには、ワークシートのイベントを利用します。 ここでは、Sheet1内で「セル範囲A1:C10」より外に移動させないようにしてみましょう。

(1)[Sheet1]のシート見出しを右クリックする (2)[コードの表示]をクリックする。実行するとSheet1のモジュールが開く (3)[オブジェクト]ボックスで「Worksheet」を選択する (4)[プロシージャ]ボックスで「SelectionChange」を選択する 上記の操作を行うと
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
という空のプロシージャが挿入されます。 Sheet1内でアクティブセルを移動すると、このプロシージャが実行されます。 移動先となる(新しい)アクティブセルは、引数Targetに格納されます。 アクティブセルを「セル範囲A1:C10」以外に移動させないためには、引数Targetの行位置と列位置を判定する方法もありますが、ここではApplicationオブジェクトのIntersectメソッドを使いましょう。 Intersectメソッドは、
Application.Intersect(セル範囲1, セル範囲2)
と書くことで、複数セル範囲が共有するセルを返します。 もし共有するセルがない場合にはNothingを返します。 引数Target(アクティブセルの移動先)が「セル範囲A1:C10」外のとき
Application.Intersect(Target, Range("A1:C10"))
は共有するセルが存在しないのでNothingを返します。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.Intersect(Target, Range("A1:C10")) Is Nothing Then
        MsgBox "そのセルは選択できません"
    End If
End Sub
しかし、これではメッセージを表示するだけでアクティブセルは移動してしまいます。 IntersectメソッドがNothingだったときは「直前のアクティブセル」に戻すような工夫が必要です。 SelectionChangeイベントはアクティブセルが移動した後で発生しますので直前のアクティブセルを変数に格納しておくことにしましょう。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Static LastCell As Range
    If Application.Intersect(Target, Range("A1:C10")) Is Nothing Then
        MsgBox "そのセルは選択できません"
        LastCell.Activate
    Else
        Set LastCell = ActiveCell
    End If
End Sub
考え方に間違いはありませんが、上記のコードでは初回にエラーが発生します。 上記のコードが初めて実行されるとき、変数LastCellには何も入っていませんのでLastCell.Activateがエラーになるからです。 次のように、変数LastCellをチェックするようにしましょう。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Static LastCell As Range
    If Application.Intersect(Target, Range("A1:C10")) Is Nothing Then
        MsgBox "そのセルは選択できません"
        If Not LastCell Is Nothing Then LastCell.Activate
    Else
        Set LastCell = ActiveCell
    End If
End Sub