ビギナーにVBAを教えていると、「どこにスペースを入れたらいいんですか?」とか「ピリオドはどこで使うんですか?」などの質問を受けることがあります。それも、結構な割合で。上級者にとっては当たり前でも、意外とこういうことでビギナーは悩むんですよね。ちなみに、括弧を付けるときと付けないときのルールは、下記のページをご覧ください。
ここでは、ピリオドとスペースとカンマを使うところについて解説します。
最初に整理しておきます。VBAの構文は、次の3つに分類できます。
「オブジェクト式」とは、Excelを操作する構文です。たとえば、セルに値を代入したり、ワークシートを挿入したり、ブックを開いたり・・・などなど。「ステートメント」は、マクロの実行を制御する構文です。条件によって処理を分岐するIf Then Elseステートメントとか、繰り返しのFor Nextステートメント、変数を宣言するDimステートメントなどなど。最後の「関数」は、ワークシート上で使うSUM関数やVLOOKUP関数のように、決められた引数を与えると、いつも決められた結果を返すものです。VBA特有の関数では、たとえば、InStr関数とかSplit関数などがあります。
上図のコードは、アクティブシートのセル範囲A1:A10に入力されている文字列を、「¥」で分割して、2枚目のワークシートの、B列とC列に代入するマクロです。このコードの、青文字が「オブジェクト式」、赤文字が「ステートメント」、緑文字が「関数」です。
これを見ても分かるように、ピリオドはオブジェクト式で使います。オブジェクト式では、操作の対象(オブジェクト)が階層構造で表されます。たとえば、
Book1のSheet1のセルA1の文字の色を赤くする
なら、次のようにします。
Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Font.ColorIndex = 3
これは、いわば次のようなものです。
○○中学の1年の3組の田中の服の色を赤くする
○○中学.1年.3組.田中.服の色 = 赤
このように、オブジェクト式では、単語と単語をピリオドで結びます。ピリオドは、ここでしか使いません。あぁ、もちろん「Book1.xlsx」のように拡張子を意味するピリオドや、「3.1415」など小数を表す小数点は別ですよ。
次のコードは、セルA1に123という数値を代入しています。RangeオブジェクトのValueプロパティということで、ピリオドが使われています。
Range("A1").Value = 123
VBAのコードを入力中、ピリオドを打ち間違えたらどうなるのでしょう。
上記のようなエラーになります。ただし、間違えた場所や、間違え方によっては、異なるエラーメッセージが表示されることもあります。
上記のようにピリオドは、オブジェクト式で使います。一般的には、
のように単語と単語の区切りに使います。ただし、Withステートメントを使うときだけは、ピリオドから始まる書き方をします。
Withステートメントの詳しい解説は、下記ページをご覧ください。
「どこにスペースを使うか分かりません」という質問も、よく聞きます。冒頭にお見せしたコードでは、たとえばスペースは次のように使われています。
VBAで、マクロのソースコードとして認識される語は、次のように分類されます。
「1.VBAで定められている単語」は、オブジェクトとかプロパティとかメソッドとか、ステートメントとか関数とかです。「2.変数名や定数名」は、上記のように、あらかじめVBAで定義されている定数だけでなく、ユーザーが自由に定義できる変数名や定数名もあります。文字列の"Sheet1"とか"A1"などは、「3.一部の記号」で使用できる""で囲まれた任意の文字列です。もちろんスペースも、この「3.一部の記号」に含まれます。
「1.VBAで定められている単語」と「2.変数名や定数名」を合わせて「単語」と考えれば、スペースが使われるのは「単語」「記号」「数値」を区切るところです。つまり、
ということです。基本的に、スペースはVBEが自動的に調整してくれます。スペースが足りないときは自動的に挿入してくれますし、スペースが多すぎるときは1つにまとめてくれます。ですから、それほど意識をする必要はないのですが、いくつかエラーになるケースがありますので、ご紹介します。
Dim A As Stringところが、型指定文字を使うと、Asの代わりに、記号を指定することで、変数の型を指定できます。Aという文字列型の変数は、次のようにも宣言できます。
Sub Sample() Dim A$ MsgBox TypeName(A$) End Sub
VBAの型指定文字には、次のような種類があります。
型指定文字 | 型 |
---|---|
% | Integer |
& | Long |
! | Single |
# | Double |
@ | Currency |
$ | String |
この中で、演算子としても使われている記号は、文字列を結合するときに使う「&」です。つまり、
Range("A1").Value = A& B
の「A&」はLong(長整数型)の変数とみなされたため、エラーになりました。
基本的に、多く入力したスペースは、VBEが自動的に削除してくれることが多いです。また、スペースが不足しているところも、けっこうVBEが補完してくれます。ですから、あまり難しく考えずに、迷ったら「とりあえずスペース入れとけ」みたいな感じでよろしいのでは。マクロをたくさん作っていれば、そのうち慣れますよ。
カンマは、複数の項目を区切るときの記号として使われます。VBAのコードで"区切るもの"と言えば、ほとんどは引数(オプション、パラメータなどとも呼びます)です。たとえば、Rangeオブジェクトを返すCellsプロパティは、行と列の2つの引数を取ります。
Cells(1, 2)
ちなみに、カンマの後ろにはスペースが入りますが、これはVBEが自動的に入れてくれます。
ほかにも、複数の引数を取るメソッドや
Set FoundCell = Cells.Find(What:="tanaka", Lookat:=xlWhole)
複数の引数を取る関数もあります。
n = InStr(Range("A1"), "\")
ということで、ピリオド、スペース、カンマを使うところについて解説しましたが、理屈で覚えるよりも、身体で覚えてください。たくさんマクロを作っていけば、そのうち適切な使い方が身につきます。そんなもんです。あまり難しく考えない方がいいですよ。