t-hom’s diary

主にVBAネタを扱っているブログです。

VBA 名前付き引数の正体はプロシージャの仮引数の変数名

今回は名前付き引数についてその概念と仕組みを紹介する。
名前付き引数はVBAにおいて基本的な機能であり、マクロの記録で作ったコードでよく使われているが、正確に理解している方は少ないように見受けられる。

かくいう私も初めて名前付き引数が何かを理解した時は目から鱗が落ちた気分だった。しかしすでに自分の中である意味常識化していてこれまで記事にするということを思いつかなかったのだ。

名前付き引数とは

名前付き引数とは、プロシージャに引数を渡す際順番ではなく名前で指定する方法をいう。「ナマエツキヒキスウ」と読む。

メッセージボックスを表示させるコードを例に名前付き引数の機能をみてみよう。
まずは名前付きではない引数から。

Sub hoge()
    MsgBox "続行しますか", vbYesNo, "確認"
End Sub

このようにMsgBox関数に引き渡す値は、1番目がメッセージ、2番目がボタンの種類やアイコン、3番目がタイトル表記というふうに、順番が決まっている。
たとえば、ボタンの種類を指定せずにタイトルを指定したければ、以下のように2番目の値を空白にする。これが通常の引数の渡し方である。

Sub hoge()
    MsgBox "こんにちは", , "挨拶"
End Sub

次に名前付き引数の場合を見てみよう。
名前付き引数では、引数名:=値と書くことで、順番に関係なく狙った場所に値を渡すことができる。

コードを書いていると関数呼び出しの際に以下のようなクイックヒントが出てくる。
f:id:t-hom:20170608210304p:plain
Prompt、Buttons、Title…などと書かれているのが名前付き引数の名前だ。

名前付き引数を使うと先ほどのコードはこのように2番目を飛ばしても問題ないし、

Sub hoge()
    MsgBox Prompt:="こんにちは", Title:="挨拶"
End Sub

このように逆にしても問題なく動作する。

Sub hoge()
    MsgBox Title:="挨拶", Prompt:="こんにちは"
End Sub

これが名前付き引数だ。
どんな時に便利かというと、たとえばWorkbooks.Openのような大量のオプション仮引数が存在するケース。

Sub hoge()
    Workbooks.Open "C:\work\Sample.xlsx", , , , "abc!xy123"
End Sub

"abc!xy123"が何なのかパッと見ても分かりにくい。

このように名前付き引数であればファイル名とパスワードを指定していることが一目瞭然。

Sub hoge()
    Workbooks.Open Filename:="C:\work\Sample.xlsx", Password:="abc!xy123"
End Sub

以下のように途中までふつうの引数で、一部だけ名前付き引数という指定もできる。

Sub hoge()
    Workbooks.Open "C:\work\Sample.xlsx", Password:="abc!xy123"
End Sub

逆に名前付き引数の後に順番によるふつうの引数は使えないので注意。

名前付き引数の正体

名前付き引数というのは、実は単にプロシージャの仮引数の変数名でしかない。

たとえば以下のように引き算を行うFunctionプロシージャを作ってみる。

Function 引き算(元の数, 引く数) As Long
    引き算 = 元の数 - 引く数
End Function

呼び出す際、同じようにクイックヒントが出るはずだ。
f:id:t-hom:20170608211725p:plain

一般的には単に値だけを書いて呼び出すが、

Sub hoge()
    MsgBox 引き算(30, 10)
End Sub

名前付き引数を使用すると以下のように項目を逆に書くこともできる。

Sub hoge()
    MsgBox 引き算(引く数:=10, 元の数:=30)
End Sub

※あくまで機能紹介のためのサンプルなので特に逆に書くメリットはありません。

名前付き引数の利点

  • Optional指定を多用したプロシージャを呼び出す際には名前付き引数で中間の引数を飛ばせる。
  • 渡している値が何なのかパッと見てわかるので、うまく使うと。コードの可読性が増す。

仮引数名なんてどうせ値を運ぶ役割しかないし、スコープも小さいから適当でいいやと思われがちだけれど、このようにプロシージャの仮引数名は、名前付き引数としてコードの可読性を助けるものなので、適当に名前をつけるべきではない。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。