はじめに
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
関数をマスターして、より堅牢で使いやすいプロシージャの作成に役立ててください。