【VBA】IsMissing関数で、OptionalなVariant引数が省略されたか判定する方法

目次

はじめに

VBAで引数を省略可能にする Optional キーワードは非常に便利ですが、Variantの引数に対して使う場合は、一つ特別な注意点があります。それは、OptionalVariant 型の引数には、= デフォルト値 の形で初期値を設定できない、というルールです。

では、Variant 型の引数が呼び出し元で省略されたかどうかを、どうやって知ればよいのでしょうか?

そのためにVBAに用意されているのが IsMissing 関数です。この関数を使えば、OptionalVariant 型引数が渡されなかったことを確実に検知し、省略された場合のデフォルトの動作を定義できます。

この記事では、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)

引数 targetSheetOptional Variant として定義しています。VBAのルール上、ここに = ActiveSheet のようなデフォルト値を書くことはできません。

If IsMissing(targetSheet) Then

この一行が、この記事の核心です。

  • IsMissing() 関数は、引数として渡された OptionalVariant 変数が、呼び出し元で実際に渡されたかどうかを判定します。
  • 引数が省略された場合は True を、何らかの値が渡された場合は False を返します。
  • この If 文で、IsMissingTrue を返した場合(=引数が省略された場合)に、デフォルトの動作として Set ws = ActiveSheet を実行しています。

なぜ targetSheet = ""IsEmpty(targetSheet) ではダメなのか?

OptionalVariant 引数が省略された場合、その中身は「空っぽ」ではなく、「存在しない(Missing)」という特殊な状態になります。そのため、=IsEmpty で判定しようとしても False となり、正しく判定できません。OptionalVariant 引数の省略判定には、必ず IsMissing 関数を使う必要があります。


まとめ

今回は、VBAの IsMissing 関数を使って、省略された OptionalVariant 引数を判定する方法を解説しました。

  • OptionalVariant 引数には、デフォルト値を直接設定できない
  • 引数が渡されなかったことを判定するには、IsMissing 関数を使う。

Variant 型は、シートオブジェクトや文字列、数値など、様々な種類のデータを柔軟に受け取れるため、関数の汎用性を高める上で非常に強力です。IsMissing 関数をマスターして、より堅牢で使いやすいプロシージャの作成に役立ててください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次