【VBA】VBAの基本構造 用語から全体像を理解する

VBA

AccessのVBA(Visual Basic for Applications)は、「マクロ」と並びAccessの処理を自動化するための機能です。VBAをマスターすることで、規模の大きな業務用ツール作成が可能になるなど、対応できる幅が一気に広がります!

しかし、最初にぶつかる壁のひとつが「専門用語の多さ」です。モジュール?プロシージャ?メソッド?……勉強する過程で聞き慣れない単語が次々と登場し、挫折する方も少なくありません。

この記事では、VBAの基本用語を通じてVBAの全体像をわかりやすく説明します。これを読めば、「VBAってこういう構造なんだ!」と、しっかりイメージできるようになります。

VBAの「構造」を用語から理解する

よく登場する用語

VBAを学んでいると、下記のような用語を目にすることが多いと思います。

VBAの主な用語
  • モジュール
  • プロシージャ
  • ステートメント
  • オブジェクト
  • メソッド
  • プロパティ
  • 引数

これらの用語を全部知っていなくともVBAを使うことはできますし、無理にすべての用語を理解する必要はありません。

ただし、知っておくと、VBAをスムーズに理解していくことができます。特に、VBAの構造を理解するうえで、これらの用語を自分の中で整理できていることは、とても重要です。

VBAの構造

一見無造作に並んでいる用語ですが、これらはお互いに関連し合い、階層構造になっています。
図解で解説します。

「モジュール」という大きな箱の中に、「プロシージャ」という仕切りがあり、その中に複数のステートメントが存在する。ステートメントの中身を覗くと、オブジェクト+メソッド(引数)で構成されていることが多い。

VBAのざっくりとした構造は、上記のようになっています。

では、肝心な各用語の中身について次項で解説します。なお、この記事では概要的な視点での解説になります。さらなる詳細については必要に応じて別記事で解説します。

用語解説

モジュール(Module)

VBAコードの「入れ物」であり、コード全体をまとめる場所です。目的に応じて以下の種類があります。

種類内容
フォーム/レポートモジュール画面や帳票の「イベント」に紐づく処理を定義する
クラスオブジェクトともいいます
標準モジュールAccess全体で共通して使う処理や関数を定義する場所
クラスモジュール独自オブジェクトを作るためのモジュール(上級)

フォーム/レポートモジュール

モジュールの中でもっとも使用されるのは「フォーム/レポートモジュール」です。このモジュールは、フォーム(またはレポート)のプロパティ「イベント」タブから作成するVBAのことを指します。

上図では、「コマンド6」というボタンの「クリック時」イベント(ボタンをクリックしたときに作動する処理)に、VBAを設定する様子です。

このように、特定のフォームやレポートに関連付けられて、そこだけで使用されるVBAが「フォーム/レポートモジュール」です。

標準モジュール

標準モジュールは、リボンメニューの「作成」→「標準モジュール」から作成することができるモジュールです。

標準モジュールは、データベース全体で使用する汎用的なプログラムを格納するモジュールです。
前述した「フォームモジュール」「レポートモジュール」と異なり、どのフォームからでも呼び出して使用することができます。

クラスモジュール

クラスモジュールは、リボンメニューの「作成」→「クラスモジュール」から作成することができるモジュールです。

Accessには最初から数多くの「オブジェクト」(フォームやレポート自体。そこに配置するテキストボックスやラベルもオブジェクト)が用意されていますが、自分でオブジェクトを作成するときに使用するのがクラスモジュールです。

自分でオブジェクトを作るということは、既存のものでは対応できないくらい熟練した域に達していることに加え、作成自体にも相応のスキルを要しますので、上級者向けのモジュールといえるでしょう。

プロシージャ(Procedure)

プログラムを構成する最小単位を「プロシージャ」といいます。モジュールがプログラムの入れ物だとしたら、プロシージャはプログラムそのものです。

プロシージャにはいくつかの種類があります。

標準プロシージャ

特定のオブジェクトに関連付けられていないオブジェクトです。他のプロシージャから呼び出すことができるので、汎用性のある処理に適しています。

標準プロシージャを別のプロシージャが呼び出している様子

標準プロシージャで汎用性のある処理を作っておけば、いろんなプロシージャでそれを呼び出せばいいので、何度も同じ処理を記述する必要がなくなります。効率的!

標準モジュールには「Subプロシージャ」と「Functionプロシージャ」の2種類があります。

Subプロシージャ

Subで始まるプロシージャ

Sub ※※※
処理記載部分
End Sub 

Functionプロシージャ

Functionで始まるプロシージャ

Function ※※※
処理記載部分
End Function

2つのプロシージャの違いは、処理の結果を返すかどうかです

Accessには様々な関数(組み込み関数)が用意されており、例えば「Date関数」は、現在の日にちを返してくれる関数です。Functionプロシージャでは、そのような処理結果を返してくれる関数を自作することができます。こういった関数を「ユーザー定義関数」といいます。

イベントプロシージャ

フォームまたはレポートの特定のイベントに関連付けられたプロシージャを「イベントプロシージャ」といいます。
こちらは「Subプロシージャ」のみ記述することができます。

前述「フォーム/レポートモジュール」で説明した、「イベント」タブへ割り当てるプロシージャのことですね!

ステートメント(Statement)

プロシージャ内に記述されたプログラムの1行分を「ステートメント」といいます。
この1行が「命令文」であり、プログラムの実行とは、プロシージャの上から下へステートメントを1行ずつ実行していくことをいいます。

ただし例外もあって、ステートメントが長くなりすぎると、コードが見にくくなります。そこで、長いステートメントは「行継続文字(半角スペース+アンダースコア)」を用いて複数行に分割することもあります。

ステートメントの説明

オブジェクト(Object)

VBAで操作の対象となる「もの」です。例えば、フォームやレポートなどのデータベースオブジェクトや、それらに配置されるコントロール(テキストボックスやコマンドボタン等)をオブジェクトといいます。

上記のように実態のあるオブジェクトもあれば、「Docmd」のように操作命令を行うオブジェクトもあります。

メソッド(Method)

メソッドは、オブジェクトが行うことができる動作に対する命令のことです。例えば、言葉で表すと次のとおりになります。

オブジェクトメソッド(例)
フォームを開く
レポートを印刷する
レコードを保存する
クエリを実行する

プロパティ(Property)

プロパティは、オブジェクトが持っている「属性」のことです。

オブジェクトプロパティ(例)
テキストボックス立体表示を「浮き出し」にする
テキストボックス編集可否をロック」する
コマンドボタンフォントサイズを12ptにする
ラベル背景色を「グレー」にする

プロパティシートで設定できる項目が、その名のとおりプロパティです。設定項目数がめちゃくちゃ多いですよ

引数(ひきすう)

引数は、メソッドに渡す追加情報のことです。引数を指定することで、メソッドに対してどんな動作をするか細かく指定することができます。

分かりやすいところでは、オブジェクト「フォーム」に対して、「開く」というメソッドを指定した際、じゃあ実際に開くはどのフォームか?…というのが引数です。

オブジェクト引数メソッド(例)
フォームF_月別取引実績一覧を開く
レポートR_取得資格一覧を印刷する
クエリSQ_新規追加実行を実行する

《具体例》VBAコードを分解してみる

前述の説明を踏まえたうえで、次は具体的なVBAコードを分解しながら、各用語がコードのどの部分かということを確認していきましょう。

Sub フォームを開く()
DoCmd.OpenForm “F_顧客管理”, acNormal
End Sub

上記のコードは、「F_顧客管理」というフォームをノーマル形式で開く、という命令です。
それを各用語に分解したものが下表です。

用語該当部分
モジュールこのコード全体が入っている箱
プロシージャSub フォームを開く()~ End Sub
ステートメントDoCmd.OpenForm “F_顧客管理”, acNormal
オブジェクトDoCmd
メソッドOpenForm
引数“F_顧客管理”, acNormal

こうやって分解してみると、冒頭で示した「VBAの構造」の図が分かりやすくなりますよね

まとめ

今回はVBAでよく登場する用語を解説しました。


用語自体を完璧に覚えることが目的ではなく、用語は、VBAのより本質的な部分を理解していくうえでの手段…くらいの、肩ひじ張らないスタンスで覚えていくと、頭に入ってきやすいと思います。

用語はまだまだたくさんありますので、引き続き一緒に勉強していきましょう!

タイトルとURLをコピーしました