Excel VBAのOptional引数とは?省略可能な引数で柔軟なプロシージャを作る方法
生徒
「先生、VBAで自作関数を作っているのですが、たまに指定しなくてもいい項目を作りたいんです。いつも全部入力しないとエラーが出るので困っています。」
先生
「それは『Optional(オプショナル)引数』を使えば解決できますよ。これを使うと、引数を渡しても渡さなくても動く、柔軟なプログラムが作れるようになります。」
生徒
「オプショナル……『任意』っていう意味ですね!初心者の私でも使いこなせますか?」
先生
「もちろんです。基本の書き方と、省略されたときにどう動かすかのコツさえ掴めば、とても便利な機能ですよ。詳しく見ていきましょう!」
1. Optional(オプショナル)引数とは何か?
Excel VBAの世界で「引数(ひきすう)」とは、プログラム(プロシージャや関数)に渡す「指示内容」のようなものです。通常、引数を設定すると、それを使わずにプログラムを動かそうとしたときに「引数が足りません」というエラーが出てしまいます。
しかし、現実の仕事では「基本的にはこの値だけど、特別なときだけ別の値を使いたい」とか「書かなくても自動で決まった値にしてほしい」という場面があります。そんなときに役立つのがOptional引数です。
Optionalを直訳すると「選択可能な」「任意の」という意味になります。つまり、その引数を「書いても書かなくてもいいよ」とVBAに教えてあげる機能のことです。これをマスターすると、一つのプログラムで複数のパターンに対応できるようになり、コードがスッキリと整理されます。
2. Optional引数の基本的な書き方とルール
使い方はとても簡単です。プロシージャのカッコ内で、引数名の前に Optional というキーワードを付けるだけです。ただし、絶対に守らなければならない重要なルールがあります。
それは、「Optional引数は、必ず普通の引数よりも後ろに書く」というルールです。例えば、名前と年齢を受け取る関数で、年齢を省略可能にしたい場合は、必ず「名前、Optional 年齢」の順番で書かなければなりません。年齢を先に書いて名前を後にすることはできないので注意しましょう。
また、引数には必ず「データ型(数字なのか文字なのか)」を指定するのが良い習慣です。省略された場合に備えて、あらかじめ「初期値(デフォルト値)」を設定しておくこともできます。
3. 実践!初期値を設定して計算を楽にする方法
まずは、一番よく使われる「初期値(デフォルト値)」を設定する方法を紹介します。例えば、商品の金額に「おまけの割引」を適用する関数を作ってみましょう。割引額を省略したときは、自動的に「0円」として計算されるようにします。
' 金額を計算する関数。割引額(discount)は省略可能。
' 省略された場合は「= 0」の部分が適用されます。
Function CalcPrice(price As Long, Optional discount As Long = 0) As Long
' 引かれた金額を戻り値として返す
CalcPrice = price - discount
End Function
' 実行して確認するためのコード
Sub TestOptional()
Dim result1 As Long
Dim result2 As Long
' パターン1:割引なし(引数を一つだけ渡す)
result1 = CalcPrice(1000)
' パターン2:500円割引(引数を二つ渡す)
result2 = CalcPrice(1000, 500)
MsgBox "割引なしなら " & result1 & " 円、500円引なら " & result2 & " 円です。"
End Sub
このプログラムを実行すると、引数を一つしか書かなくてもエラーにならずに動きます。これがOptional引数の最大のメリットです。もし Optional を付けていなければ、CalcPrice(1000) と書いた瞬間にエラーになってしまいます。
4. IsMissing関数で省略されたかを判定する
次に、数値ではなく「Variant(バリアント)型」という、何でも入る便利な型を使ったテクニックを紹介します。引数が省略されたかどうかを直接調べたいときは、IsMissing(イズ・ミッシング)という専用の命令を使います。
「ミッシング」は「欠けている」という意味ですので、文字通り「引数が足りないかな?」と確認するわけです。これを使うと、省略されたときに全く別の特別な処理をさせることが可能になります。
' 挨拶メッセージを作る関数。名前を省略可能にする。
' IsMissingを使うときは、引数の型を「Variant」にします。
Function MakeGreeting(Optional personName As Variant) As String
' 引数が省略されている(Missing)かどうかを確認
If IsMissing(personName) Then
MakeGreeting = "お客様、こんにちは!"
Else
MakeGreeting = personName & "様、こんにちは!"
End If
End Function
' 動作を確認するコード
Sub CheckGreeting()
' 名前を指定しない場合
MsgBox MakeGreeting
' 名前を指定する場合
MsgBox MakeGreeting("田中")
End Sub
このように、引数があるときとないときでメッセージを完全に切り替えることができます。柔軟なシステムを作るときに欠かせないテクニックです。
5. 複数のOptional引数を使うときの注意点
Optional引数は、一つだけでなく複数使うことも可能です。ただし、その場合は「順番」に気をつける必要があります。例えば、三つの引数のうち二つ目と三つ目をOptionalにした場合、呼び出す側で「三つ目だけ指定したい」というときはどうすればいいでしょうか。
その場合は、カンマ(,)だけを書いて場所を飛ばすか、「引数名:=値」という書き方(名前付き引数といいます)を使います。パソコン操作に慣れていない方には少し複雑に見えるかもしれませんが、要するに「何番目の箱にデータを入れるか」をVBAに正しく伝える必要がある、ということです。複数の省略可能な項目が増えれば増えるほど管理が大変になるので、まずは一つか二つから使い始めるのがおすすめです。
6. 実践!文字の装飾を自由に変える関数
今度は文字列処理を応用して、特定の文字を「カッコ」で囲む関数を作ってみましょう。カッコの種類を省略したら普通の丸カッコ () に、指定すれば好きなカッコ 【】 などに変えられるようにします。
' 文字をカッコで囲む関数。カッコの種類は省略可能。
Function WrapText(txt As String, Optional symbol As String = "()") As String
' 左側のカッコと右側のカッコを分解して挟む
Dim leftSide As String
Dim rightSide As String
leftSide = Left(symbol, 1) ' 最初の1文字
rightSide = Right(symbol, 1) ' 最後の1文字
WrapText = leftSide & txt & rightSide
End Function
' 呼び出しテスト
Sub TestWrap()
' 通常のカッコ
Dim normal As String
normal = WrapText("重要")
' 隅付きカッコを指定
Dim special As String
special = WrapText("秘匿", "【】")
MsgBox normal & vbCrLf & special
End Sub
実行結果は以下の通りです。
(重要)
【秘匿】
初期値を設定しておくことで、よく使うパターン(この場合は丸カッコ)をわざわざ入力する手間が省け、作業効率がアップします。
7. Optional引数を使うときの3つの落とし穴
とても便利なOptional引数ですが、初心者がハマりやすい「落とし穴」がいくつかあります。これを知っておくだけで、デバッグ(間違い探し)の時間を大幅に削れます。
- IsMissingが効かない型がある:
IsMissingは、引数が「Variant型」でないと正しく動きません。Integer(整数型)やString(文字列型)でIsMissingを使おうとしても、常に「省略されていない」と判断されてしまうことがあるので注意しましょう。 - 途中の引数だけOptionalにできない: 先ほども触れましたが、「(普通の引数), (Optional引数), (普通の引数)」という順番はNGです。省略可能なものは必ずお尻にまとめましょう。
- 初期値の型に注意: 引数が「数字」なのに、初期値に「文字」を入れようとすると、当然ながらエラーが発生します。箱の種類と中身の種類は常に一致させておきましょう。
これらのルールは、一度覚えてしまえば難しいことではありません。最初のうちは「省略するものは一番最後に書く!」とだけ覚えておけば十分です。
8. メッセージボックスのカスタマイズでの活用例
VBAには元々 MsgBox という命令がありますが、これをさらに使いやすくした自分専用のメッセージ表示プログラムを作るときにもOptional引数は大活躍します。例えば、「タイトル」を省略したら自動で「システム通知」という名前にするような処理です。
' 独自のメッセージ表示プロシージャ
Sub MyMessage(msg As String, Optional title As String = "システム通知")
' 標準のMsgBoxを呼び出す
MsgBox msg, vbInformation, title
End Sub
' 呼び出し例
Sub TryMyMessage()
' タイトルを省略
MyMessage "処理が完了しました。"
' タイトルを指定
MyMessage "エラーが発生しました", "警告"
End Sub
このように、「普段は決まった形式でいいけれど、たまに内容を変えたい」というすべての処理に対して、Optional引数は強力な武器になります。プログラミング未経験の方でも、この「基本セット+オプション」という考え方は直感的に理解しやすいはずです。
9. なぜOptional引数を使うとプログラムが「柔軟」になるのか
「柔軟なプログラミング」とは、一つのコードが色々な状況に対応できることを指します。もしOptional引数がなかったら、割引があるとき用の関数と、割引がないとき用の関数を二つ作らなければなりません。これでは、後で計算式を直したいときに両方の関数を修正する必要があり、手間もミスも増えてしまいます。
Optional引数を使って一つにまとめておけば、修正は一箇所で済みます。また、呼び出す側も「とりあえずこれだけ渡しておけば動く」という安心感があります。これは大規模な開発だけでなく、日々のちょっとしたエクセル作業の自動化でも非常に重要な考え方です。シンプルでありながら、変化に強い。それがOptional引数の魅力です。
10. 練習してOptional引数をマスターしよう!
最初は難しく感じるかもしれませんが、まずは「引数の前にOptionalと書くだけ」という簡単なところからスタートしてください。自分で関数を作ってみて、引数を一つ抜いて実行してみる。それでエラーが出ずに初期値が表示されたとき、あなたはVBAを操る感覚を一つ掴んだことになります。
パソコンを触るのが苦手だった人でも、こうした「便利な設定」を一つずつ積み重ねていくことで、誰よりも使いやすいツールを作れるようになります。Excelの自動化は、こうした小さな工夫の積み重ねです。ぜひ、今日から自分の作るプロシージャに Optional を取り入れて、もっと楽に、もっと自由にVBAを楽しんでくださいね!