Developer

プロシージャの引数4(省略されたかを調べる)
2021.06.20
Lv1

プロシージャの引数4(省略されたかを調べる)

プロシージャの引数4(省略されたかを調べる)

引数が省略されたときの対応方法は次の2通りでした。
・初期値を設定しておく
・省略された場合の処理を作っておく

前回は「初期値を設定しておく」を紹介しました。今回は「省略された場合の処理を作っておく」に関してみていきましょう。

IsMissing関数

プロシージャ内でIsMissing関数を使用することにより、引数が省略されたかを調べることができます。
IsMissing関数は引数が省略された場合に「True」を返します。これを利用して条件分岐(If文)の条件判定を行います。
また、IsMissing関数で判定する引数は「Variant」型でないといけない決まりがあります。

これらを踏まえてサンプルプログラムを見てみましょう。

'' プロシージャの引数(省略されたかを調べる)
Sub VBA基礎第24回_1()
    Dim price As Integer
    Dim priceWithTax As Integer
    
    price = 250
    
    priceWithTax = 税込価格(price)
    Debug.Print priceWithTax
    
End Sub

'' 省略されたかを調べる
'' 「rate」のデータ型を「Variant」にする。
Function 税込価格(price As Integer, Optional rate) As Integer 
    '' 引数「rate」が省略された場合
    If IsMissing(rate) Then
        '' 「1.1」を代入して初期値とする
        rate = 1.1
    End If

    税込価格 = CInt(price * rate)

End Function

前回のサンプルプログラムを流用して変更点にコメントを付けてみました。

15行目は「rate」に「Optional」を付け、さらに「As Integer」を削除します。データ型の指定となるこの部分を削除すること(データ型を指定しないこと)によって、データ型を「Variant」にすることができます。

16~20行目では、IsMissing関数を使用して引数が省略されたかをチェックし、省略された場合は「rate」に「1.1」を代入します。

フロー図を示すと以下のようになります。

フロー図は前回のものと非常によく似ています。比較してみましょう。

この引数を省略したときの2通りの使い分け方については、明確なルールは存在しません。
筆者が考える方法としては、基本的には前回紹介した方法「初期値を設定しておく」がシンプルでありコード量も少なく使いやすいかと思います。
ただし、この方法ではうまくいかないケースが存在します。それは、「初期値には定数しか指定できない」というところです。

Sub サマリーを取る(Optional 対象シート As Worksheet = ActiveSheet)
    '' 集計を行う処理 ...
End Sub

このサンプルプログラムのようにオブジェクトを指定することができず、エラーになってしまいます。もしこのような処理を作りたい場合には、今回紹介した「省略された場合の処理を作っておく」を使用します。

Sub サマリーを取る(Optional 対象シート) '' 「対象シート」のデータ型を「Variant」にする。
    '' 引数「rate」が省略された場合
    If IsMissing(対象シート) Then
        '' 「ActiveSheet」を代入して初期値とする
        Set 対象シート = ActiveSheet
    End If
    
    '' 集計を行う処理 ...
End Sub

このように使い分けるのが1つの判断基準になるかと思っています。

まとめ

引数が省略されたときの対応方法には次の2通りが考えられる。
・初期値を設定しておく
・省略された場合の処理を作っておく
初期値に指定できるのは「定数」のみ。
プロシージャ内でIsMissing関数を使用することにより、引数が省略されたかを調べることができる。

確認問題

九九を計算する以下のSubプロシージャを以下のように変更してください。
・「x」「y」を省略可能とする
・どちらも引数が省略された場合は「9」となるようにIsMissing関数を使って実装する

Sub 九九(x As Integer, y As Integer)
    
    For i = 1 To x
        For j = 1 To y
            Debug.Print i * j
        Next
        
        Debug.Print "----"
    Next

End Sub
答え
[vb] Sub 九九(Optional x, Optional y)

If IsMissing(x) Then
x = 9
End If

If IsMissing(y) Then
y = 9
End If

For i = 1 To x
For j = 1 To y
Debug.Print i * j
Next

Debug.Print "—-"
Next

End Sub
[/vb]

次回は、「配列について」です。