Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » If TypeName(Selection) とは

対象:Excel2003, Excel2007, Excel2010, Excel2013

「if typename selection 使い方」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

VBA(Visual Basic for Applications)の、
  If TypeName(Selection) = "Range" Then
といったコードを、どこかで見かけた方による検索でしょう。

TypeName関数のヘルプから

TypeName関数のヘルプには以下のような記述があります。

変数に関する情報を提供する文字列型 (String) の文字列を返します。

構文
 TypeName(varname)

 引数 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)
というコードへの理解が深まるはずです。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » If TypeName(Selection) とは

「VBA関数」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.