引数名って書かなくていいの?


ブックを開くマクロとして、次のようなコードをよく見ます。

Sub Sample1()
    Workbooks.Open Filename:="C:\Book1.xlsx"
End Sub

あるいは、まったく同じブックを開くマクロでも、次のように解説されていることがあります。

Sub Sample1()
    Workbooks.Open "C:\Book1.xlsx"
End Sub

Filename:=」が付くのと付かないのでは、いったい何が違うのでしょう。

命令とオプションの関係

VBAのオブジェクト式には、次の2種類があります。

(1)対象.様子 = 値
(2)対象.命令

(1)は対象の様子や状態を設定する命令です。セルの背景色を設定したり、ワークシートに名前を付けるときなどに使います。この"様子"を専門用語でプロパティと呼びます。一方の(2)は、何らかのアクションを起こさせるようなときに使います。たとえば、セルを挿入したり、ワークシートを削除するときなどです。こうした"命令"を専門用語でメソッドと呼びます。ちなみに、"様子"や"命令"の対象になるモノがオブジェクトです。

さて、対象に何らかのアクションを起こさせる"メソッド"には、そのアクションを「どのように」実行するかとか、実行したあと「その後どうするか」とか、実行に必要な情報などを指定できるものがあります。たとえば「田中」というオブジェクトに対して「眠れ」という命令(メソッド)を実行するとします。

田中.眠れ

このメソッドを実行すると、田中オブジェクトは眠るのですが、ただ眠れと言われても、仮眠なのか爆睡していいのかで眠り方が違います。そこで「どんな風に眠るか」を同時に指示することにします。こうした、ある命令(メソッド)に対して、実行に必要な情報を引数(ひきすう)またはオプションと呼びます。「眠れ」メソッドには、「何時間眠るか」と「どこで眠るか」を示すオプションがあったとします。

このように「眠れ」メソッドでは「時間」と「場所」という2つのオプションが指定できます。別の言い方をすると、「眠れ」メソッド側では「時間」と「場所」という2つのオプションを受け取るように設計(定義)されているということです。もし、1番目のオプションに「6時間」、2番目のオプションに「ベッド」を指定するなら、次のように位置を合わせて指定すれば、正しい指示を与えられます。

もし、「場所」は指定しないで、「時間」だけを指定したいときはどうしましょう。2番目のオプションである「場所」を省略して、「時間」だけを指定しても、「眠れ」メソッドには正しい指示を伝えることができます。

しかし、「時間」は指定しないで、「場所」だけを指定する場合、次のように指定すると「眠れ」メソッドは正しく動作できません。指示を与えるべきオプションの位置が間違っているからです。

「場所」だけを指定するとき、そのオプションが2番目であることを明確にするには、1番目は"何も指定しない"ということを表す、区切り記号「,」を使わなければなりません。

このように、あるメソッドが複数のオプションを受け取るように設計(定義)されている場合、どのオプションに何を指定するかは、位置を正確に示さなければなりません。しかし、それでは、非常に多くのオプションが定義されているときに煩雑です。たとえば、ブックを開くWorkbooksコレクションのOpenメソッドには、「どのブックを開くか」「それはどんな形式か」「読み取りパスワードがあるか」など、とても多くのオプションが定義されています。

Open Filename, UpdateLinks, ReadOnly, Format, Password, WriteResPassword,IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad

たとえば、1番目のオプションと、13番目のオプションだけを指定する場合、位置を正確に指示するなら

Open "C:\Book1.xlsx", , , , , , , , , , , , True

のように書かなければならず、これでは何のオプションを指示しているのかが分かりにくいです。そこでVBAでは、定義したオプションごとに名前を決め、明示的にオプションの名前を指定することで、正確な位置を指定しなくてもよい工夫がされています。位置の指定ではなく、オプションを名前で指定するには、次のようにします。

オプション名:=値

先の「眠れ」メソッドで、2番目の「場所」だけを指定するには「場所:=ベッド」と書きます。

これなら、位置を明確にするために、空の区切り記号「,」を使う必要もありません。オプションの名前を明記するのですから、次のように順番が入れ替わっても大丈夫です。

このように、名前を使ってオプションを指定できる仕組みを名前付き引数と呼びます。Excel VBAのメソッドで定義されているオプションは、すべてこの名前付き引数です。

上記のように、名前付き引数に値を指定するときは、「=」ではなく「:=」を使います。詳しくは、下記をご覧ください。

「=」と「:=」の違いは?

オプション名を省略できる理由

さて、「眠れ」メソッドで「時間」だけ指定するケースを、もう一度考えてみましょう。「時間」というオプション名を使って、次のように指定できますね。

あるいは、1番目という位置を特定するのなら、次のようにも指定できます。

つまり、1番目のオプションだけを指定するとき、両者はまったく同じ意味になるということです。

田中.眠れ 時間:=6時間
↑↓ 同じ意味
田中.眠れ 6時間

ブックを開くOpenメソッドには、たくさんのオプションがありますが、その中で必ず指定しなければならないのは、1番目の「どのブックを開くか」を指示する引数Filenameだけです、

Open Filename, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, ・・・
1番目のオプション(Filename)は必ず指定する

1番目のオプションだけを指定するのですから、下の2つは同じ意味になります。

Workbooks.Open Filename:="C:\Book1.xlsx"
↑↓ 同じ意味
Workbooks.Open "C:\Book1.xlsx"

ここで解説した例は、もちろんWorkbooksコレクションのOpenメソッドだけの話ではありません。VBAでオプションを指定する場合では、すべて同じように考えられます。たとえば、ワークシートを挿入するときは、WorksheetsコレクションのAddメソッドを実行します。このAddメソッドには、次のオプションが定義されています。

Add Before, After, Count, Type

引数Beforeに指定したワークシートの手前に、新しいワークシートが挿入されます。また、引数Countに数値を指定すれば、指定した数の新規ワークシートが挿入されます。「Sheet2の手前に3枚の新規ワークシートを挿入」する場合、次のコードは、どれも同じ意味になります。

Worksheets.Add Sheets("Sheet2"), , 3
Worksheets.Add Before:=Sheets("Sheet2"), Count:=3
Worksheets.Add Count:=3, Before:=Sheets("Sheet2")