ACCESS VBAとは

ACCESS VBAとは

ACCESSを使っていると、VBAという単語を聞くことが多いと思います。
なんだか難しそう。別に使わなくてもいいんじゃない?と思うかもしれません。

しかし、ACCESSを本当に便利に使いこなすにはVBAが必須といっても過言ではありません。
VBAを使うことでACCESSでの業務効率化がより一層進みます。

今回は、ACCESS VBAについてご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

VBAとは

VBAとはVisual Basic for Applicationsの略で、プログラミング言語の一種です。

ACCESSだけでなく、マイクロソフトOfficeで広く使用でき、Excel VBAが最も一般的でしょう。

比較的難易度の低いプログラミング言語であり、かつマイクロソフトOfficeの普及率が高いことから、初めてプログラミングを学ぶ方がVBAから始める、というのはよくある話です。

ACCESS VBAでできること

VBAを使用すると、ACCESSで作成したデータベースをより使いやすくすることが可能です。

VBAを使うと以下のことができるようになります。

・メインメニューフォームから別のフォームを開く

・一覧フォームから選択した特定のレコードの詳細フォームを表示する

・検索フォームを作成する

・フォームに表示された内容を元にレポートを表示する

・データの取り込み処理を自動化する

上記に挙げたのはほんの一例ですが、ACCESS VBAを使用すれば、様々な機能を作成して業務を効率化することが可能です。

ACCESSの本領を発揮するためには、VBAが必須であるといっても過言ではないでしょう。

マクロとの違い

同様の機能を持つものにマクロがあります。

Excelをよく使われる方はマクロの方がなじみがあるかもしれません。

ACCESSにもマクロがあります。

マクロであればGUIで操作できるので、VBAのようにプログラミングを覚えなくても簡単にできるのでは?と思われるかもしれません。

確かにその通りです。
とっつきやすさはマクロの方が上でしょう。

しかし、マクロには以下の2つの欠点があります。

自由度が低い

マクロとVBAではVBAの方ができることの範囲が広いのです。
変数を使った自由な処理などがVBAの特徴です。

自分の作成したい機能をマクロで作っていったときに、途中でマクロだけでは実現できなことが分かって結局VBAでコードを書くくらいなら、最初からVBAで作成したほうが早いでしょう。

影響範囲の調査が難しい

2点目は影響範囲の調査が難しいということです。

ACCESSデータベースは一度作成した後も、少しずつ修正して使いやすくしていくことが一般的です。

また、作成者が異動や退職でいなくなった場合に、他の方がその運用を引き継ぐことが良くあります。
こうした際に、処理内容が分かりやすく作ってあるか否かは非常に重要なポイントです。

マクロはGUI画面で見ることができるので、一見可読性が高いように感じられるかもしれません。
しかし、大きな課題は検索ができないことです。

ACCESSはテーブルやクエリ、フォームなどの複数のオブジェクトを複雑に組み合わせて利用します。

そのため、特定のオブジェクトに加えた変更が他のオブジェクトに影響を及ぼす可能性が高く、修正する際には影響範囲を考慮して行うことが必須になります。

この際、テーブル名やフォーム名でACCESS内の検索を行って、該当のオブジェクトを使用している他のオブジェクトを事前にチェックする必要があります。

VBAであればテキストで検索を行うことで、オブジェクトを使用している箇所を簡単に全て洗い出すことが可能です。
しかし、マクロの内容は検索できないため、マクロをすべて目視で確認して影響調査をする必要があるのです。

これは、大規模なデータベースになればなるほど大きな問題になります。

ACCESS VBAの構成要素

ACCESS VBAには以下の構成要素があります。

プロジェクト

プロジェクトとは、VBAで管理する複数のモジュールを束ねた最上位の概念です。
画面でいうと下記のように、ツリー構造の最上位に位置します。

モジュール

モジュールとは、VBAのプログラムであるプロシージャをまとめた単位です。
ツリー構造でいうとプロジェクトの下に位置します。

ACCESSのオブジェクトである、フォーム単位に1つのモジュールがあると考えるとわかりやすいでしょう。

また、ACCESSオブジェクトに紐づかない、汎用的なモジュールを標準モジュールといいます。

プロシージャ

プロシージャとは、VBAのプログラムを構成する最小単位です。

一つのモジュールの中に複数のプロシージャが存在します。

例えば、上記の例ではPrivate Subから始まり、End Subで終わるまでが1つのプロシージャです。

一般的にはこのプロシージャがVBAでのプログラミングの基本単位だと思ってください。

上記の例では、このモジュールには4つのプロシージャがあることがわかります。

オブジェクト

オブジェクトとは、プロシージャによって操作する対象となる、ACCESSの構成要素です。

わかりやすく言うとテーブルやクエリ、フォームやレポートなど、GUI操作で作成するものがオブジェクトになります。

VBAではプログラムによってこのオブジェクトを操作することが可能です。

ACCESS VBAの利用方法

ACCESS VBAはVBE(Visual Basic Editor)でコードを記述して作成します。

こちらが、VBEの画面です。

VBEの表示方法は2通りあります。

メニューから表示する

ACCESSのメニューから、作成→Visual Basicを押すとVBEが表示されます。

ショートカットキーで表示する

ALT + F11キーでも同様に表示することが可能です。

基本構文

ACCESS VBAでよく使用する構文は以下の2つです。
複雑に見えるVBAですが、この2つを組み合わせることでかなりの機能を作成することが可能です。

条件分岐

条件に応じて処理内容を変える構文です。

IF文やSelect Case文を使って実現できます。
以下のようなコードです。


Private Sub 削除_AfterUpdate()

    If Me!削除 = True Then
    
        If vbNo = MsgBox("削除します。よろしいですか?", vbYesNo + vbExclamation, "削除確認") Then

            Me!削除 = False
            Exit Sub

        End If

    End If
    
End Sub

繰り返し

一定回数同じ処理を繰り返す構文です。

For Next文や、Do Loop文で実現できます。
以下のようなコードです。


Public Sub nyukin_torikeshi(nyukin_id As Long)

'変数を定義
Dim cnn As ADODB.Connection
Dim rst1 As ADODB.Recordset

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient

'レコードセットを取得
rst1.Open "TRN_請求", cnn, adOpenKeyset, adLockOptimistic

'入金済で未削除の請求レコードのみを抽出
rst1.Filter = "入金済 = true and 入金ID =" & nyukin_id

If rst1.recordcount = 0 Then

    '対象レコードが無ければ処理終了
    Exit Sub

Else

    '入金済チェックを解除
    Do Until rst1.EOF
    
        rst1!入金済 = False
        rst1!入金ID = 0
        rst1.MoveNext

    Loop

End If

'終了処理
rst1.Close: Set rst1 = Nothing
cnn.Close: Set cnn = Nothing

End Sub

以上、ACCESS VBAについて紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。