即効テクニック |
ある指定したセル範囲の外にアクティブセルを移動させないようにするには、ワークシートのイベントを利用します。 ここでは、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