=と:=の違い


VBAのコードで、ときどき「:=」という記号を見かけます。たとえば次のようなコードです。

Sub Sample1()
    Workbooks.Open Filename:="Book1.xls"
End Sub

これは、Book1.xlsを開くマクロですが、これを次のように書くとエラーになります。

Sub Sample2()
    Workbooks.Open Filename = "Book1.xls"
End Sub

上記のコードは、引数Filenameに"Book1.xlsx"という文字列を設定しているので、何となく正しいようにも思えます。だって、変数に値を代入するときは「=」を使うのですから。

Sub Sample3()
    Dim Target As String
    Target = "Book1.xlsx"
End Sub

値を代入(設定)するとき「=」と「:=」の違いは何なのでしょう。

「:=」の意味を理解するのは、まず「=」の話からしなければなりません。

VBAで「=」は、数学のイコールのように右辺と左辺が等しいという使い方だけでなく、右辺を左辺に代入するという意味も持ちます。たとえば、次のマクロはセルA1に100を代入します。

Sub Sample()
    Range("A1").Value = 100
End Sub

これは、Range("A1").Value と 100 が等しいという意味ではなく、右辺の 100 を、左辺の Range("A1").Value に代入する、いわば Range("A1").Value ← 100 のようなイメージです。

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

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

(1)は、セルやワークシートなどの様子や状態を設定する書式です。先の Range("A1").Value = 100 も、この(1)の書式です。

もうひとつの(2)は、何らかのアクションを起こすような書式です。たとえば Range("A1").Delete と書けば、Range("A1")を削除できます。(1)の"様子"を、専門用語で"プロパティ"と呼び、(2)の"命令"を"メソッド"と呼びます。まぁ、用語はどうでもいいのですが。

(2)の"命令"は削除したり挿入したりと、何らかのアクションを起こすコマンドですが、この"命令"には、「どんな風に」実行するかとか、実行したあと「その後どうするか」とか、実行に必要な情報を指定できるものがあります。いわば、実行に対する"オプション"ですね。そうしたオプションのことを引数(ひきすう)と呼びます。

この、引数に値を設定するときに使用される記号が「:=」です。右辺を左辺に代入するという意味では「=」と同じ働きですが、引数を指定するときだけは、「=」ではなく「:=」を使わなければなりません。それがVBAのルールです。また「:=」は、「対象.命令」の"命令(メソッド)"で引数を設定するときだけしか使えませんから、この記号があったら、それは「メソッドを実行している」と判断できます。

たとえば、「田中」というオブジェクトに対して「走れ」というメソッドを実行するとします。VBA的に書くと、次のようになります。

田中.走れ

しかし、ただ走れと言われても、どこに走ればいいのか、どのくらい本気で走るのかによって、走り方が違います。そこで「走れ」という命令に対して、いくつかのオプションを指定します。たとえば「目的地は駅まで」で「全力で走れ」みたいに。もし、「走れ」メソッドに「目的地」と「速度」というオプションがあるなら、これをVBA的に表すと次のようになります。

田中.走れ 目的地:=駅, 速度:=全力

このように、メソッドのオプション(引数)を指定するときに使うのが「:=」です。ブックを開くには、WorkbooksコレクションのOpenメソッドを実行します。

ブック.開け
  ↓
Workbooks.Open

このとき「どのブックを開くのか」というオプションを指定できます。というか、指定しないと、どのブックを開いたらいいかわかりません。だから、必ず指定します。

ブック.開け どのブック:="C:\Sample.xlsx"
  ↓
Workbooks.Open Filename:="C:\Sample.xlsx"

ということです。もうひとつ例をお見せします。セル(Rangeオブジェクト)を削除するときは、Deleteというメソッドを使います。セルを削除するときは、削除した後のセルをどちらにシフトするかを選択できます。

セルB2を削除して、削除した後のセルを左方向にシフトするなら

Range("B2").Delete Shift:=xlToLeft

となります。これは、マクロ記録で記録されるコードですが、このように、メソッドのオプションに指定する値として「xlToLeft」のように「xl○○」という語が記録されるときがあります。こうした「xl○○」を定数と呼びます。定数については、下記をご覧ください。

定数ってなに?

また、こうしたメソッドの動作に関するオプションは、名称を省略することができます。これも詳しくは、下記で解説します。

引数(オプション)名って書かなくていいの?