確実に選択されているセルを操作する


ユーザーが選択したセル範囲を操作するには、Selectionを使います。

Sub Sample1()
    Dim c As Range
    For Each c In Selection
        c.Font.ColorIndex = 3
    Next c
End Sub

ただし、もしグラフやテキストボックスなどが選択された状態でこのマクロを実行するとエラーになります。SelectionがRangeオブジェクトではないからです。そんなときは、TypeName関数で何が選択されているかを確認するといいのですが、もうひとつ確実に「選択されたセル」を操作する方法があります。

そもそも、何が選択されるかわからないSelectionに頼るのがトラブルのもとなのですから、「選択されているもの」を表すSelectionではなく「選択されているセル」を確実に指定すればいいです。それにはRangeSelectionを使います。

Sub Sample2()
    Dim c As Range
    For Each c In ActiveWindow.RangeSelection
        c.Font.ColorIndex = 3
    Next c
End Sub

RangeSelectionはWindowオブジェクトのプロパティです。Selectionと違い、たとえグラフなどのオブジェクトが選択されていても、その前に選択されていたセル範囲を返します。Windowオブジェクトのプロパティですから、必ずWindowオブジェクトを指定しなければなりません。選択されているセル範囲を操作するときは、一般的にアクティブシートが対象ですから、ActiveWindowを指定すればいいですね。