セルが選択されているか判定する


セルに対して何らかの操作を行うマクロの場合、セル以外のオブジェクトが選択されているとエラーになる場合があります。たとえば次のコードは、セルが選択されているときは選択されているセルにRAND関数を埋め込みますが、テキストボックスやグラフなどが選択されている状態で実行するとエラーになります。

Sub Sample()
    Selection = "=RAND()"
End Sub

誤動作を避けるために、現在選択されているのがセルかどうか判定するには、TypeName関数の裏技を使います。TypeName関数は、バリアント型変数に格納されているデータの種類を調べる関数です。本来は次のように使います。

Sub Sample2()
    Dim tmp As Variant
    tmp = 100
    MsgBox "変数内のデータは、" & TypeName(tmp) & " です。", 64
    tmp = "tanaka"
    MsgBox "変数内のデータは、" & TypeName(tmp) & " です。", 64
End Sub

あまり使い道のなさそうなTypeName関数ですが、実は引数にSelectionを指定できます。セルが選択されている状態では、TypeNmae関数でSelectionを調べると"Range"という文字列が返ります。

Sub Sample3()
    If TypeName(Selection) = "Range" Then
        Selection = "=RAND()"
    Else
        MsgBox "セルを選択してから実行してください。", 16
    End If
End Sub

もしテキストボックスやグラフなどのオブジェクトが選択された状態で実行しても、エラーで止まる心配はありません。

選択されているオブジェクト(Selection)が何かを調べることは、いろいろな場面で役立ちます。ぜひ、TypeName関数を覚えてください。なお、発想を変えて、どんなときも選択されているセル範囲を操作する方法もあります。詳しくは下記のページをご覧ください。