Access超入門
この講座で使用するVBA
作成日:2018/10/25

ページ内目次

  1. 概要
  2. VBEの解説
    1. VBEとは
    2. VBEを開く方法
    3. VBE画面の区画
    4. VBEのオプションの設定
  3. プロシージャ
    1. プロシージャとは
    2. イベントについての予備知識
    3. フォーカスについて
    4. プロシージャ名
  4. フォームを呼び出すVBAの記述
    1. VBAの記述について
    2. イベントプロシージャの種類
    3. フォームを呼び出すためのVBA
    4. VBA記述の詳細
    5. VBA記述の整理

1.概要

マイクロソフトのOffice製品(AccessやExcel、Wordなど)には VBA と呼ばれる開発言語(プログラミング言語)が組み込まれています。
マイクロソフトアクセス(MS-Access)も例外ではなくVBAが組み込まれています。
Access用のVBAなので「Access VBA」とも呼ばれたりします。

VBAを使用することによって、 その製品(アクセス)に標準で組み込まれている機能を拡張したり、 新しい機能を追加することができます。

この講座では、VBA全般の解説はしません。
この講座を読み進めるのに必要となる機能だけを解説します。

VBAは、 「Visual Basic for Application」の略で、 開発言語(プログラミング言語)です。
マイクロソフトが開発したものなので全て英語で記述しなければなりません。

最近では小学生でもプログラミングの勉強をしているようですが(本格的には2020年度からだそうです)、 そのような授業を受けたことのない人たちには敷居が高いかもしれません。
しかし、 この講座で覚えなければならないことはそれほど多くはありません。
数個の命令を覚えるだけで実現できるように解説しています。
その上、 状況によってVBAを工夫するなどということはなくコピー&ペーストで実現できるようにしています。

「超入門」と銘打ったこの講座なので操作の逐一を解説しています。
そのため、 非常に多くの手順を踏まなければならないように見えるかもしれませんが、 じつは単純な事柄を詳しく説明しているだけなので安心してください。
それに、 入力時にはAccessが補完してくれたり、 候補の一覧を表示してくれますので、 それほど難しいものではないと思います。

VBAを記述する必要がある代表的な事例は、 「F住所録一覧表」 から選択したレコードを 「F住所録明細」 を開いて表示するときです。
一般的にひとつのフォームだけで完結するようなアプリケーションはそんなに多くはありません。
この講座で作成した住所録は単なる例題です。 その先へ進む第一歩なので力を入れて解説しています。

この講座の主目的は 「4. VBAの記述」 です。
その他の記事は、 初めてVBAに触れる人のために予備知識をできる限り詳しく説明しています。

Accessには同じような目的のマクロと言うものがあります。
しかし、 この講座ではマクロの解説は行っていません。

2.VBEの解説

VBEとは
VBEはビジュアル・ベーシック・エディター(Visual Basic Editor)の略で、 VBAを記述するための画面(エディター)です。
VBEを開く操作を行うと、 Accessの操作画面とは別の画面でVBEが開かれます。
VBEを開く方法

VBEを開く方法その1 「Alt」+「F11」キーを押してVBEを開く

VBEの画面 すぐにVBEを開きます。
この場合は、 どの イベント にも関連付けられていないので、 このようなVBEの画面が表示されるだけです。

VBEを開く方法その2 フォームセレクタコントロール を右クリックしてVBEを開く (「常にイベントプロシージャを使用する」にチェックが入っていない場合)

ビルダーの選択ウィザード フォームやコントロールを右クリックして表示されるメニューから「イベントのビルド(E)」を選択するとこのような画面が表示されます。
この画面から「コード ビルダー」を選択するとVBEが表示されます。

VBEの画面(サブプロシージャあり) この場合は、 フォームやクリックしたコントロールの代表的なイベントに対応したVBAコードが挿入されます。
この画面の例では氏名コントロールのクリック時イベントが挿入されています。

フォームセレクタやコントロールを右クリックしてVBEを開く
(「常にイベントプロシージャを使用する」にチェックが入っている場合)

VBEの画面(サブプロシージャあり) フォームやコントロールを右クリックして表示されるメニューから「イベントのビルド(E)」を選択すると、 すぐにVBEの画面が表示されます。
この場合は、 フォームやクリックしたコントロールの代表的なイベントに対応したVBAコードが挿入されます。
この画面の例では氏名コントロールのクリック時イベントが挿入されています。

VBE画面の区画

VBE画面の区画 VBE画面を見てみましょう。
この画像はは資料を見やすくするためにVBE画面の右と左をカットています。

VBEの画面はこのように④つの部分に別れています。

 ファイル名
ここには現在開いているアクセスファイルのファイル名が表示されています。
ファイル名の後ろには他と混同しないように「(コード)」の文字が書かれています。

 メニュー
他のアプリケーションと同様にここにメニューが表示されます。

 プロジェクトエクスプローラー
このアクセスファイルに含まれるオブジェクト名をエクスプローラー形式で表示しています。

表示メニュー この部分はメニューの「表示(V)」で変更することができます。
ここにはこのオブジェクトエクスプローラーの他にプロパティウィンドウを表示することができます。
もちろん何も表示しないこともできます。
右上の「X」をクリックして表示しないようにします。

 コードライディングエリア(Code Writing Area)
ここにVBAコードを記述します。
プロジェクトエクスプローラーを見ると「Form_F住所録一覧表」だけが表示されていますが、 開発を続けるうちにフォームやレポートが増えてきます。
ここには、 プロジェクトエクスプローラーで選択されたフォーム(レポート)のVBAコードだけが表示されます。

VBEのオプションの設定

VBEのオプション 何はともあれ、 先ずはVBEのオプションを設定します。
メニューの「ツール(T)」→「オプション(O)」をクリックするとこのような画面が表示されます。
この画面のように全てにチェックが入っていることを確認してください。
インデントは現在3になっていますが、 これは好みで変更してもかまいません。
ここでは「編集」タブだけを表示していますが、 他のタブの設定は既定値のままで構いません。

VBEの画面 もう一度この画面を見てください。
まだVBAの記述前の状態ですが、 一番上に
  「Option Compare Database」
  「Option Explicit」
の2行が既に記述されています。

Option Compare Database
文字列の比較方法を指定します。
通常は画面のように先頭に自動的に挿入されます。
もしも、 挿入されていないときは、 手入力で挿入してください。
詳細は 「MSDNのモジュールに対する文字列比較の設定を指定する【外部サイト】」 を参照してください。

Option Explict
VBAは、 本来変数を定義していなくても問題なく動作します。
例えば金額を入れる変数を「kingaku」として金額計算を行っていた時に、 「kingku」(「a」が抜けている)と記述しても
(処理の結果は正しいものにはなりませんが)
エラーにはならずに正常に動作します。
ここで「Option Explict」を指定すると、 定義していない変数を使用するとエラーになります。
この講座では変数を定義することはありませので、 必ずしもこのオプションを記述する必要はないのですが、 将来のために記述しておくことをお勧めします。
なお、 このオプションはVBEのオプションで 「変数の宣言を矯正する(R)」 にチェックが入っていると自動で挿入されます。
もしも、 挿入されていないときは、 手入力で挿入してください。

ここで解説しているVBAがエラーになるときはVBE画面のメニューから
「ツール(T)」 -> 「参照設定(R)」を開き、 「参照可能なライブラリファイル(A)」内の「Microsoft DAO 3.n Object Library」にチェックを入れて「OK」をクリックしてみてください。

3.プロシージャ

プロシージャとは
VBAに関する言葉にプロシージャというものがあります。
「ここからVBAの記述が始まります」でプロシージャがはじまり、
必要なVBAを記述した後に「これでVBAの記述は終了です」で終了します。
このひとつのかたまりをプロシージャと呼びます。

Private Sub コマンド明細表示_Click()

End Sub

これは、 ボタンをクリックした時に実行されるプロシージャです。

「Private Sub コマンド明細表示_Click()」
これがプロシージャの始まりを定義しています。

「End Sub」
プロシージャの終わりを定義しています。

この2行の間にVBAを記述します。

最も簡単なプロシージャの例です。
Private Sub コマンド明細表示_Click()
  MsgBox "明細表示ボタンがクリックされました"
End Sub

「MsgBox "明細表示ボタンがクリックされました"」は小窓にメッセージを表示するVBAです。
通常プロシージャ内のVBAの記述はタブなどで少し右に寄せて記述します。
これは視認性の向上が目的なので、 右に寄せなくても問題はありません。

MsgBoxのサンプル 明細表示ボタンをクリックしたときに表示される小窓です。

イベントについての予備知識
VBAを知るには「イベント」という言葉を知ることが必須になります。
とはいえ、 それほど詳しく知る必要はありません。
その概念を解るだけで良いと思います。

イベントとは 「コントロール」 に何らかの操作を行った結果イベントが発生します。
何らかの操作とは、 そのコントロールをクリックした、改行キー(Enterキー)を押下したなどの操作のことを言います。

ボタンコントロールのイベントの数 これはボタンコントロールのイベントです。
クリック時からフォーカス喪失時までたくさんのイベントがあります。

ボタンコントロールにもたくさんのイベントがありますが、 フォームのイベントの種類はこの数倍もあります。

とはいえ、 通常使用するイベントはこの中のひとつかふたつでしょう。

フォーカスについて
「超入門」講座ということで、 フォーカスについて簡単に説明しておきます。
タブキーでコントロールを移動した時に、 移動した先のコントロールはフォーカスを得たといいます。
フォーカスについてはこの様に 「フォーカスを得た」 以外にも 「フォーカスがあたっている」などといいます。
上の画像(ボタンコントロールのプロパティシート)では、 「フォーカス取得後」や「フォーカス喪失後」の表現もあります。
この様にフォーカスにはいくつもの表現があります。
また、 タブキーでコントロールを移動したときなどは 「フォーカスが移動した」と表現します。

ここからが本題です。
コントロールのイベントは、 そのコントロールにフォーカスがあたっている時に発生します。
ボタンをクリックしたときは、 先ずそのボタンにフォーカスがあたり、 その後でイベントが発生しますので、 問題なくイベントプロシージャが呼び出されます。
しかし、 そのボタンにフォーカスがあたっていない時にキーを押下しても、 そのボタンの「キークリック時」のプロシージャは呼び出されません。
当然のことなのですが、 初心者の中に時々このような思い違いをする人を見かけますので、 念のために書いておきます。
プロシージャ名
プロシージャには、 呼び出したり識別するために名前が必要です。
名前はプロシージャの開始時に指定します。
先程の「Private Sub コマンド明細表示_Click()」で説明します。

「Private」
これは、 どの場所から呼び出すことを許可するかを規定します。
例えば、 親族の呼び出しだけを許可する。
それとも他人からの呼び出しも許可する、 を規定しています。
「Private」は親族の呼び出しだけを許可しています。
この講座では「Private」だけ使用しますので、 プロシージャの開始時には「Private」を書くとだけ覚えていれば良いでしょう。

「Sub」
プロシージャにはいくつかの種類があり、 これはSubプロシージャであることを意味します。
これも「Sub」と書くとだけ覚えていれば良いでしょう。

「コマンド明細表示」
この部分がプロシージャ名です。
「明細表示」だけでは、 開発中は覚えているかもしれませんが、 期間が空くと何のためのプロシージャなのかわからなくなってしまいます。
そこで、 イベントプロシージャの場合はコントロールの名前を先頭につけるようにしています。
(コントロールの名前はプロパティシートの「その他タブ」の「名前」に入力したものです)

ボタンコントロールを配置したときは「コマンドnn」(nnは連番)と自動的に名付けられます。
Accessの場合は「ボタンnn」ではなく「コマンドnn」と名付けられますので「コマンド明細表示」と名付けています。
(もちろん、「ボタン明細表示」でも何の問題もありません)
このような名前付けのルールを作っておけば、 どのコントロールのイベントプロシージャであるのかが明確になります。

「Click」
これはクリック時イベントであることを示しています。

「()」
呼び出し元から、 このプロシージャに与える引数を記述します。
「(argDate As Date, argMessage As String)」
この様に記述します。
「As Date」や「As String」に関しては「Accessのデータ型」を参照してください。
「argDate」や「argMessage」は引数の名称です。
「argDate」は日付の引数なのですが、 私はこの様に引数の名前の前に「arg」を付けています。
「Date」はVBAのキーワードなので引数の名前につけることはできません。
引数の名前の前に常に「arg」を付けていると、 この様にキーワードと衝突することがないからです。
ちなみに、 argとはargumentの略で引数のことです。

説明が長くなりましたが、 「Private Sub コマンド明細表示_Click()」 という名称のプロシージャは
ボタンコントロールのクリック時イベント」であることがわかります。

4.フォームを呼び出すVBAの記述

VBAの記述について
ここでは、 フォームを呼び出すVBAの記述を詳細に説明しています。
要するに結論となる1行をコピーして貼り付けるだけなのですが、 その1行に至るまでの逐一を細かく書いています。
フォームを呼び出すためのVBAのみを解説していますが、 他のVBAの場合も同じ方法でVBAを記述することができます。
必要な箇所でVBAの記述だけを解説していますが、 ここの解説が基本ですのでしっかり理解するようにしてください。
イベントプロシージャの種類
この講座では、 3種類の方法でフォームを呼び出すことを解説しています。
どの方法でも作成されるイベントプロシージャはプロシージャ名が異なるだけで形式は同じです。
このプロシージャ内に1行だけ記述するVBAの説明です。

ボタンクリック時のイベントプロシージャ ボタンコントロールをクリックした場合のイベントプロシージャです。

氏名コントロールでEnterキー押下時のイベントプロシージャ 名前コントロールで改行キー(Enterキー)押下のイベントプロシージャの場合です。

レコードセレクタダブルクリック時のイベントプロシージャ レコードセレクターをダブルクリックした場合のイベントプロシージャの場合です。

フォームを呼び出すためのVBA
フォームを呼び出すVBAはこの様になります。
DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id

「DoCmd.OpenForm」
DoCmdオブジェクトのOpenFormメソッドを使用することを定義します。
DoCmd.OpenFormと記述し、フォームを呼び出すための命令です。
「docmd.openform」と全て小文字で記述してもAccessはこの様に大文字と小文字にしてくれます。

「F住所録明細」
呼び出すフォームの名前をダブルクォーテーション(”)で囲んで記述します。
変数に代入して、 ここに変数名を記述することもできます。 このときはダブルクォーテーション(”)で囲んではいけません。

「"id = " & Me.id」
F住所録明細は単票形式フォームなので1件のレコードしか表示できません。
そこでどのレコードをそのフォームに表示するのかを指定します。
この講座では、 テーブル定義の際は必ず 主キー として, 「id」という名称の オートナンバー型 のフィールドを定義するルールになっています。
主キーということは、 その 「テーブルの中に同じ値を持つレコードは無い」 ということで確実にレコードを特定することができます。

idフィールドの値が「5」である「F住所録明細」を表示場合には、 「"id=5"」と記述すればよいのです。
しかし、 常に「id=5」のレコードを表示しても意味がありません。
「F住所録一覧表」フォームのフォーカスのあたっているレコードを表示したいのです。
「Me.id」と記述することで、 「Me(私)」、 つまり「F住所録一覧表」フォームの 「フォーカスのあたっているレコード内のidフィールドの値」 をここに記述します。
その記述方法が「"id=" & Me.id」となるわけです。
アンパーサンド(&)は文字列を連結します。
つまり「"id="」と「Me.id」の値を連結しています。

コマンドボタンのイベントプロシージャを例にするとこの様になります。
Private Sun コマンド明細表示_Click()
  DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id
End Sub
VBA記述の詳細

「DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id」 を入力する場合を例に入力例を解説します。

docmd.と入力したときの状態 docmd.と入力したところです。
この様に、次に入力する候補が表示されます。

openformと入力したいのでo(おー)を押すと

o(オー)を先頭にしたリスト この様にo(おー)を先頭にした場所までリストがスクロールします。

openformは3行目にあるので矢印キーで2行下げてEnterキーを押すか、
openformをクリックすると入力されます。

半角スペースを入れた状態 DoCmd.Openformの後ろに半角スペースを入力すると、 長い英文の説明が出てきました。

太字で書かれている「FormName」が次に入力するものです。
開きたいフォームの名称を入力する箇所なので 「"F住所録明細"」 とフォーム名をダブルクォーテーション(") で囲んで入力したあとにカンマ(,) を3回入力します。

この説明文では「OpenForm(FormName, ・・・」と書かれていますが、 OpenFormの後ろには、 かっこ「(」ではなく、 半角スペースを入力します。

WhereConditionの入力待ち 今度は「WhereCondition」が太字になっています。
ここで先程の「"id=" & Me.id」を入力します。

これでフォームを開くVBAの記述は完了です。

もう少し説明を追加すると、 カンマを3個入力しましたが、 これはカンマで挟まれた箇所に入力すべきものを省略しているのです。
つまり既定値のままで良いということです。

「WhereCondition」 とはSQLのWhere文のWhereを外したものを入力するので、 「WhereCondition」と書かれているのです。

VBA記述の整理
明細表示ボタンをクリックした時、 氏名でEnterキーを押下した時 そして レコードセレクターをダブルクリックしたもすべてF住所録明細を表示できるようにVBAを作成してみました。
Option Compare Database
Option Explict

Private Sub コマンド明細表示_Click() ' 明細表示ボタンクリック時処理
  DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id
End Sub

Private Sub 氏名_Click() ' 氏名クリック時処理
  DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id
End Sub

Private Sub Form_DblClick(Cancel As Integer) ' レコードセレクターダブルクリック時処理
  DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id
End Sub

「_Click()」のうしろにあるアポストロフィはコメントの始まりを意味します。
アポストロフィの後ろは行の最後まですべてコメントと見なされます。

レコードセレクターダブルクリック時のイベントプロシージャの登録方法は、
フォームセレクタ をクリックしてフォーム全体を選択した後、 「イベント」タブの「ダブルクリック時」の ビルドボタン をクリックします。

これで3種類の動作のどれでもF住所録明細を表示できるようになりました。

もちろん、 これで問題なく動作するのですが、 フォームを呼び出す「DoCmd.OpenForm」を3箇所に記述することはあまりありません。
これは、 将来フォームを呼び出すところで何かの追加や変更があった場合に3箇所すべてで処理が必要になるからです。

そこでこのように変更してみました。
Option Compare Database
Option Explict

Private Sub コマンド明細表示_Click() ' 明細表示ボタンクリック時処理
  Call 明細表示処理
End Sub

Private Sub 氏名_Click() ' 氏名クリック時処理
  Call 明細表示処理
End Sub

Private Sub Form_DblClick(Cancel As Integer) ' レコードセレクターダブルクリック時処理
  Call 明細表示処理
End Sub

Private Sub 明細表示処理()
  DoCmd.OpenForm "F住所録明細", , , "id = " & Me.id
End Sub
一番下に「明細表示処理」という名称のプロシージャを追加しました。
(この場合は、イベントにより動作するわけではないのでイベントプロシージャとは言いません)
そして3つのイベントプロシージャの「DoCmd.OpenForm」の行を、
「Call 明細表示処理」に変更しました。
「Call」はプロシージャを呼び出す命令(ステートメント)です。

これでフォームを呼び出す場合に何かの変更があっても1箇所の修正で済みます。
免責免責