この記事では、2019年10月25日に開催したイベント「VBA+SQLで作るAccessデータベースアプリケーション」をレポートします。
業務で使用することも多い、AccessVBAとSQL。今回のイベントでは、AccessVBAとSQLを組み合わせて、レコードセットの取得、展開、レコードの追加、更新、削除などの基本的な方法を、書籍『Access VBA 実践マスターガイド ~仕事の現場で即使える』の著者である今村ゆうこさんに解説いただきました。
・Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分を簡単に作成することができる
・「連結」のフォームは便利だがデメリットもあり、その対策として「非連結」のフォームとVBA+SQLを使ったテクニックも覚えておくと実装の幅が広がる
・テーブルやパーツの名前には、コントロール別に規則をつけるとコード上で識別しやすくなる。テーブル名は「T_」、フィールド名は「fld_」で始めるなど
【講師プロフィール】
今村 ゆうこさん
地方の非IT系企業に勤務し、Web担当と業務アプリケーション開発を手掛ける。小学生と保育園児の2人の子供を抱えるワーキングマザー。著書に『Access VBA 実践マスターガイド ~仕事の現場で即使える』『Access マクロ入門 ~仕事の現場で即使える』『Access レポート&フォーム 完全操作ガイド ~仕事の現場で即使える』『Access データベース本格作成入門 ~仕事の現場で即使える』『Excel & Access 連携実践ガイド ~仕事の現場で即使える』『スピードマスター 1時間でわかる Accessデータベース超入門』(すべて技術評論社)がある。
Accessの特徴
まずは、VBAについて学ぶうえで必要となるオブジェクトの確認からスタートしました。
Access VBAで使うオブジェクトには、次の4種類があります。
・クエリ:抽出して計算する(利用)
・レポート:印刷用テンプレを作る
・フォーム:データ入力フォーム
わかりやすく言うと、テーブルはExcelの表のようにデータが整理されているもので、これらが複数集まったものがデータベースというイメージだそうです。
そして「あっちのテーブルのここのデータ」「こっちのテーブルのここのデータ」という指示でデータを集めたり計算したりするのがクエリ、結果を印刷するための体裁を整えるのがレポートで、データベース(テーブル)にデータを入力するインターフェイスがフォームとのことです。

次にマクロとVBAの違いです。マクロは、VBAをベースに日本語でプログラムが作れるというイメージで「実は、マクロでだいたいのことはできる」そうですが、SQLを使うことはできません。
クエリとSQLは、どちらも似たような目的で利用できます。それもそのはずで、クエリはSQLがベースになっているからだそうです。

一般的なデータベースアプリケーションは、3層アーキテクチャの形をとります。ユーザインタフェースとデータベース、その間をつなぐビジネスロジックの3層です。一般的に3層アーキテクチャのアプリを一つ作るには、たくさんのファイルが必要となりますが、Accessの場合、1つのファイルでこの3層を実現できます。
ビジネスロジックの部分をマクロまたはVBA、クエリまたはSQLで作り込むことになりますが、VBAとSQLを使ったテクニックを覚えておくと、応用が効いて便利だそうです。
また、Accessで作成するアプリケーションは、データベースファイルの容量制限などから、小規模な会社や部署で使うのに向いていると、今村さんはお話しされました。

Accessファイルを共有サーバに置き複数名で使うことも可能ですが、使用者は少数に限られるべきと、説明されました。同時にレコード更新の際に排他的処理が必要な場合には、Accessは不適切だそうです。
また、Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分をとても簡単に作成することができますが、デメリットもあるそうです。

これらを踏まえ、今村さんはVBAとSQLでアプリケーションの実装に入り、一つひとつ丁寧に解説されました。
短い時間の中、完成まで分かりやすく解説してくださったのですが、このレポートではボリュームの都合により、テーブルの設計と、単一フォーム(一対多の関係を持たない構造)におけるデータの読み書きの実装までの内容をお伝えします。
テーブル設計
まずはテーブルを設計していきます。ここで例として扱ったのはマスターテーブルである「商品マスター」と、トランザクションテーブルである「販売データ」「販売データ詳細」の計3つ。
マスターテーブルは、新商品の追加など比較的更新頻度が低いテーブルですが、トランザクションテーブルは毎日の商取引に応じてデータが増えていきます。



テーブルやテーブルを構成するパーツには名前を付けますが、テーブル名は「T_」で、フィールド名は「fld_」で始めるというように、コントロール別に命名規則を定めておくと、あとからSQL文を書くときに便利だそうです。
フォーム設計
次にフォームを設計します。商品マスターのデータ入力用と、販売データの入力用がそれぞれ必要になります。詳細は次の通りです。


「ラベル」や「ボタン」などのコントロールでは、プログラム上で識別に使う「名前」(例:btn_ボタン)と、コントロール上に表示される文字列の「標題」(例:ボタン)があるので、混同しないように命名します。
販売データのフォームで「親レコード削除のチェックボックスがあると便利」ということや、「1~10までの数字を順につけておくと後でループを使って処理できる」などのポイントも教えていただきました。
VBA+SQLでアプリケーションの実装
いよいよVBAとSQLで実装していきます。
まず、単一フォームの初期化を行います。フォームを開いたときと、[新規]ボタンがクリックされたときに、初期化の処理を行います。どちらも同じ処理なので、InitializeForm()という処理にまとめて、呼び出すようにしています。

次に、テーブルからデータを読み込む処理を実装します。次のようにレコードセットを取得する部分のコードを作成します。


エラーが起きたときも、起きなかったときも、最後の処理(Finally)が必要です。続いて、SQLのSELECT文を実装します。SQL文を途中改行する際は、文末「_」を付ける点に注意してください。
変数名 = "SELECT フィールド名" & "FROM テーブル名" & "WHERE 条件;"
上記の文を見やすくするために改行するには、次のようになります。
変数名 = "SELECT フィールド名" & _
"FROM テーブル名" & _
"WHERE 条件;"
改行時に「_」を入れている箇所に注目です。ここに実際のコントロール名を当てはめると、次のようになります。

次に、データベースに変更を加える処理の実装です。まず、SQL文を実行する部分のコードを作成します。

次に、INSERT、UPDATE、DELETEの各SQL文の実行部分を実装していきます。

このほか、DELETE文の実装では「本当によろしいですか?」の確認機能を追加しました。複数レコードの展開とトランザクション(複数レコード取得/複数命令処理の実装)についても実装すると、きちんと動作するAccessのアプリケーションが完成しました。
今回のイベントでは、VBAを使えば、Accessで手軽に本格的なアプリケーションが作成できるという点が、とてもよく分かりました。参加者からは、「実際のコードを例にノウハウを解説いただいて、今後取り組む業務に役立つ内容でとてもためになった」「非連結状態での処理方法は初めてだったので、とても参考になりました」などの声をいただきました。
株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。