「if typename selection 使い方」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
VBA(Visual Basic for Applications)の、
If TypeName(Selection) = "Range" Then
といったコードを、どこかで見かけた方による検索でしょう。
TypeName関数のヘルプから
TypeName関数のヘルプには以下のような記述があります。
構文
TypeName(varname)
引数 varname には、
ユーザー定義型の変数を除く、
任意のバリアント型 (Variant) の変数を指定します。
VBAの経験があまりない方がこのヘルプをそのまま読んだ場合、
If TypeName(Selection) = "Range" Then
というコードを疑問に感じるのは仕方ないのかもしれません。
ヘルプを杓子定規に読むと、TypeNameは変数に関する情報を得るための関数、ということになっていますから。
自分ではSelectionという変数を使っているつもりもないので
If TypeName(Selection) = "Range" Then
というコードが謎に見えてくるのかもしれません。
If TypeName(Selection)とは選択対象によって処理を切替る条件分岐
結論から言うと、
If TypeName(Selection) = "Range" Then
という記述は、
もしも選択されている対象がRangeオブジェクトのときに
という条件分岐文です。
選択対象によって処理を切り替える条件分岐です。
VBAのコードの中には、文法的には正しいけれど、Rangeオブジェクトが選択されていないときに実行されると実行時エラーが発生してしまうものがあります。
そのようなエラーを回避するための記述が、
If TypeName(Selection) = "Range" Then
です。
Application.Selectionは選択対象を表すオブジェクトを返すプロパティ
この、
If TypeName(Selection) = "Range" Then
は、一部省略が行われていて、省略しないで記述すると
If TypeName(Application.Selection) = "Range" Then
と書けます。
ApplicationオブジェクトのSelectionプロパティは、現在選択されているオブジェクトを返すプロパティです。
SelectionはグローバルメンバーのためApplicationが省略されて、
If TypeName(Selection) = "Range" Then
という記述をされることが多いはずです。
Application.Selectionプロパティで、選択されているオブジェクトを取得して、取得したものがTypeName関数の引数に指定されています。
TypeName関数は(変数でなくとも)引数に指定された対象が何なのかを、文字列で返します。
Rangeオブジェクトが指定されていれば「Range」という文字列が、返されます。
結果、
If TypeName(Selection) = "Range" Then
という記述は「選択されている対象がRangeオブジェクトのとき」という条件分岐文になるわけです。
簡単なマクロを実行してみましょう
是非
Sub Sample_Macro()
MsgBox TypeName(Selection)
End Sub
といった簡単なマクロを作成して、Excelで選択対象を変えながら実行してみてください。
セルを選択したとき、図形を選択したとき、グラフシートを選択したとき、それぞれで全く違う文字列がメッセージボックスに表示されます。
選択対象によってメッセージボックスに表示される文字列が変化するのを見ると、
TypeName(Selection)
というコードへの理解が深まるはずです。
- Newer:BMI判定をVLOOKUP関数で
- Older:半角文字を全角に一括変換するPowerPointマクロ
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » If TypeName(Selection) とは