Switch関数はRangeオブジェクトを返すのか

Switch関数はRangeオブジェクトを返すか

前回

akashi-keirin.hatenablog.com

初めてその存在を知ったSwitch関数。

こいつは、たとえばRangeオブジェクトを返したりすることはできるのだろうか。

やってみた。

準備

Sheet1オブジェクトに次のようなProperty実装してみる。

リスト1 Sheet1モジュール
Option Explicit

Public Enum ProvocationType
  ptTypeA
  ptTypeB
  ptTypeC
End Enum

Friend Property Get ProvocationCell( _
                ByVal typeOfProvocation As ProvocationType) As Range
  Dim tmp As ProvocationType
  tmp = typeOfProvocation
  Dim ret As Range
  Set ret = Switch(tmp = ptTypeA, Me.Range("A1"), _
                   tmp = ptTypeB, Me.Range("A2"), _
                   tmp = ptTypeC, Me.Range("A3"))
  Set ProvocationCell = ret
End Property

自作のProvocationCellプロパティの引数に、自作列挙体ProvocationTypeを指定。

Propertyプロシージャ内部では、引数で受け取ったProvocationType列挙体の値(ptTypeAptTypeC)によって、Switch関数の返り値をA1セル~A3セルに切り替えるようにしている。

特に逐次コンパイルに引っかかることもなかったので、普通にRangeオブジェクトを返しそう。

ワクワク感が止まらない!

ちなみに、Sheet1はこの状態。

f:id:akashi_keirin:20190628073654j:plain

実験

標準モジュールに次のコードを書いて実験。

スト2 標準モジュール
Private Sub testSwitchFunctionReturnRange()
  Call MsgBox(Sheet1.ProvocationCell(ptTypeA).Value)
  Call MsgBox(Sheet1.ProvocationCell(ptTypeB).Value)
  Call MsgBox(Sheet1.ProvocationCell(ptTypeC).Value)
End Sub

Sheet1オブジェクトの自作ProvocationCellプロパティを、引数を変えながら参照し、取得したRangeオブジェクトのValueプロパティの値をメッセージボックスに表示させるだけのコード。

f:id:akashi_keirin:20190628073703g:plain

ご覧のとおり。

おわりに

ちゃんとRangeオブジェクトも返してくれる。

簡単な条件分岐なら、Select Caseを使わずとも簡単に書けそう。