t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA マクロ、プロシージャ、メソッドなどの用語について正確に理解する

初心者向けの解説によくマクロとVBAの違いが取り上げられる。
一応違いについて説明した後、同じようなものなのであまり気にしなくて良いと締めくくるケースも多いけど、私はやはり違いを意識したほうが良いと考える。

初心者は同じようなものと言ってくれたほうが嬉しいだろう。単純に「VBA=マクロ」と覚えれば良いのだから。

しかしいざネットで調べものをしようと思った際に、そこに書かれているVBAあるいはマクロという言葉がその文章において何を指しているのか理解できなければ、筆者の意図を正確に理解することはできず、誤解のもとになるかもしれない。

言葉の正確な理解はコミュニケーションの基本である。

今回はマクロとVBAの違いの話がメインではないが、一応違いについても書いておく。

マクロとVBAの違い

マクロはもともと「マクロインストラクション」の略で、和訳すると「大きな命令」。
つまりExcelの命令群をたくさん集めてひとつの大きな命令として集約したものである。
対してVBAはそのマクロを書くための言語のこと。日本語とか英語とかと同じ、VBA語。

マクロとソースコードの違い

VBAなどのプログラミング言語で書かれたものは、ソースコードあるいは省略してソース、またはコードともいう。
じゃあソースコード=マクロなの?っていうとそれも違う。

マクロは実際に実行できる機能としての命令群を指すのに対し、ソースコードは単に「プログラミング言語で書かれたもの」を指している。
ソースコードはマクロの原材料になるものである。実行できようができまいがそんなことは関係なく、書きかけでも断片でもソースコードと呼ぶ。

マクロとプロシージャの違い

さて、ここからが重要。
VBAを学習していくとプロシージャという呼び方が登場する。新しい横文字が登場するたびにウンザリする方もいるだろう。ひょっとして隠れた挫折地点になっているということもあるかもしれない。

ここに適当に書いたソースコードがある。
マクロはいくつある?

Sub Sample()
    MsgBox "Hello!"
End Sub

Sub Sample2()
    Call Sample
    MsgBox "1 + 2 = " & Add(1, 2)
    MsgBox "GoodBye!"
End Sub

Function Add(a, b) As String
    Add = a + b
End Function

3つと答えた方は不正解。
マクロは実行単位で見た言い方なので、単体で実行できないAddはマクロではない。

Sampleはマクロだ。開始から終了まで一直線で実にシンプル。
f:id:t-hom:20170129085354p:plain

Sample2はもう少し複雑で、実行の流れを図示するとこうなる。
f:id:t-hom:20170129085516p:plain

SampleはHello!と表示するマクロである。
Sample2はまずHello!と表示し、次に1+2の計算結果を表示し、最後にGoodBye!と表示するマクロである。

このように、一連の実行単位で見た呼び方が、「マクロ」なのである。

一方プロシージャという呼び方はもっと単純で、単にSubからEnd Sub、FunctionからEnd Functionというかたまりを指す。
f:id:t-hom:20170129083945p:plain

プロシージャとは手続きという意味の英語である。
マクロとして単体で実行できるものもあれば、単体では実行できないものもある。

プロシージャとメソッドの違い

プロシージャが単に個々の手続きを指すのに対し、メソッドはプロシージャの所属元を意識した言い方である。

それぞれ、Module1のSampleメソッド、Module1のSample2メソッド、Module1のAddメソッドであると言える。
f:id:t-hom:20170129090430p:plain

メソッドとは「手法・方法」という意味の英語であるが、ここではModule1が持つ「技(ワザ)」と考えたほうがしっくりくる。

ちなみにSubプロシージャやFunctionプロシージャはメソッドであるが、Propertyプロシージャはふつうメソッドとは呼ばない。

※標準モジュールでメソッドという言い方は聞きなれないかもしれないが、私は標準モジュールもオブジェクトであると考えているのでメソッドと呼ぶ場合もある。とりわけModule1.Sampleなどとドット付きで呼び出す場合はメソッドという概念を持ち出したほうが解説が楽だ。
thom.hateblo.jp

フィールドとモジュールレベル変数、Public変数

VBAのモジュールはまず先頭に宣言セクションがあり、そのあとにプロシージャを記述する領域となる。
f:id:t-hom:20170129092641p:plain
※宣言セクションに何も書かずにプロシージャから始めることもできる。

この宣言セクションでDimまたはPrivateで宣言した変数はモジュールレベル変数と呼ばれ、モジュール内のどこからでも参照、代入ができる。

モジュールレベル変数はMicrosoftが用いている用語で、一般的なオブジェクト指向の用語ではプライベートフィールドと呼ぶ。

宣言セクションでPublicを用いて宣言した変数はPublic変数と呼ばれる。こちらは一般的なオブジェクト指向の用語ではパブリックフィールドと呼ぶ。

宣言セクションで宣言される変数はPublic、Privateいずれにしてもフィールドと呼ばれる。

フィールドもまた、所属を意識した呼び方である。
Module1のプライベートフィールド、Module1のパブリックフィールドという言い方をする。
f:id:t-hom:20170129094021p:plain

プロパティについて

プロパティというのはこれまたややこしい奴なのだが、以下の記事で詳しく書いたので割愛する。
thom.hateblo.jp

メンバーについて

メソッド、フィールド、プロパティなど、そのオブジェクトに所属するものを総称して「メンバー」と呼ぶ。
f:id:t-hom:20170129093430p:plain

Javaなどでは「メンバ」とのばし棒が入らない呼び方が一般的だが、VBAではオブジェクトブラウザー上で「メンバー」の表記を見かけたのでこちらの表記とする。

関数について

VBAにおいて関数とは値を返すプロシージャのうち、汎用的に使用できるものを指す。

なんともふわっとした定義なのだが、MicrosoftがNowを関数と呼ぶ以上、このように定義するしかなかった。
thom.hateblo.jp

VBAの組み込み関数、ワークシート関数も関数である。
ここでいう汎用的にというのは特定のオブジェクトと結びつきが無いという意味である。

通常はFunctionプロシージャを用いて作られるが、Propertyプロシージャでも作ることができる。また、Functionで作られているものでもオブジェクトモジュールに書かれて固有のオブジェクト操作に用いるものはメソッドと呼び関数とは区別する。

C言語出身の方はVBAのSubプロシージャを関数と呼ぶケースがあるが、これは間違い。
Cの関数はmainでさえ必ず値を返すので手続き(プロシージャ)=関数であるが、VBAではSubは値を返さないので関数ではない。

おわりに

プログラミング初心者はネットで調べものをしても書かれている言葉がちんぷんかんぷんでちっとも理解できないということも多いと思う。今回は特に紛らわしい用語についてその違いを説明したかった。

ネットの記事では恰好つけるためにわざと小難しい言葉が選ばれているわけではない。
同じプロシージャでも、マクロと呼ぶか、コードと呼ぶか、プロシージャと呼ぶか、メソッドと呼ぶか、メンバーと呼ぶかでそれぞれ視点が違う。
この微妙な違いを感じ取れるようになったら、マニュアルやネットの記事を見てもより筆者の言いたいことが理解できるようになる。

やはり言葉の正確な理解はコミュニケーションの基本である。
用語は大事なのでしっかりおさえておこう。

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