はじめに
VBAで引数を省略可能にする Optional キーワードは非常に便利ですが、Variant 型の引数に対して使う場合は、一つ特別な注意点があります。それは、Optional な Variant 型の引数には、= デフォルト値 の形で初期値を設定できない、というルールです。
では、Variant 型の引数が呼び出し元で省略されたかどうかを、どうやって知ればよいのでしょうか?
そのためにVBAに用意されているのが IsMissing 関数です。この関数を使えば、Optional な Variant 型引数が渡されなかったことを確実に検知し、省略された場合のデフォルトの動作を定義できます。
この記事では、IsMissing 関数を使って、省略可能な Variant 引数を安全に扱う方法を解説します。
IsMissing関数を使ったVBAサンプルコード
この例では、ワークシートを引数として受け取り、そのシートのA1セルの値を返す GetCellValue という関数を作成します。シートの引数は Optional で、もし省略された場合は、現在アクティブなシートを対象とするようにします。
完成コード
' --- IsMissing関数で引数の省略を判定するFunction ---
' 第1引数(targetSheet)が省略可能なVariant引数
Function GetCellValue(Optional targetSheet As Variant) As Variant
Dim ws As Worksheet
' --- IsMissing関数で、引数が省略されたかを判定 ---
If IsMissing(targetSheet) Then
' 省略された場合:アクティブシートを対象に設定
Set ws = ActiveSheet
Else
' 省略されなかった場合:渡されたオブジェクトを対象に設定
Set ws = targetSheet
End If
' 対象シートのA1セルの値を戻り値として返す
GetCellValue = ws.Range("A1").Value
End Function
' --- 作成したFunctionを呼び出すSubプロシージャ ---
Sub Test_GetCellValue()
' --- 引数を省略して呼び出す ---
' ActiveSheetのA1セルの値が返される
Debug.Print "引数省略時: " & GetCellValue()
' --- 引数を指定して呼び出す ---
' Worksheets("Sheet2")のA1セルの値が返される
Debug.Print "引数指定時: " & GetCellValue(Worksheets("Sheet2"))
End Sub
コードの解説
Function GetCellValue(Optional targetSheet As Variant)
引数 targetSheet を Optional Variant として定義しています。VBAのルール上、ここに = ActiveSheet のようなデフォルト値を書くことはできません。
If IsMissing(targetSheet) Then
この一行が、この記事の核心です。
IsMissing()関数は、引数として渡されたOptionalなVariant変数が、呼び出し元で実際に渡されたかどうかを判定します。- 引数が省略された場合は
Trueを、何らかの値が渡された場合はFalseを返します。 - この
If文で、IsMissingがTrueを返した場合(=引数が省略された場合)に、デフォルトの動作としてSet ws = ActiveSheetを実行しています。
なぜ targetSheet = "" や IsEmpty(targetSheet) ではダメなのか?
Optional な Variant 引数が省略された場合、その中身は「空っぽ」ではなく、「存在しない(Missing)」という特殊な状態になります。そのため、= や IsEmpty で判定しようとしても False となり、正しく判定できません。Optional な Variant 引数の省略判定には、必ず IsMissing 関数を使う必要があります。
まとめ
今回は、VBAの IsMissing 関数を使って、省略された Optional な Variant 引数を判定する方法を解説しました。
OptionalなVariant引数には、デフォルト値を直接設定できない。- 引数が渡されなかったことを判定するには、
IsMissing関数を使う。
Variant 型は、シートオブジェクトや文字列、数値など、様々な種類のデータを柔軟に受け取れるため、関数の汎用性を高める上で非常に強力です。IsMissing 関数をマスターして、より堅牢で使いやすいプロシージャの作成に役立ててください。
