もう7月の半ばであり、暑い日が続いています。ここ数日は40度を越える所も出てきて、熱中症で倒れてしまった人も多いようです。そんな日はこまめな水分補給をとったり、涼しい室内に引きこもる方が安全です。
最近はAccessVBAベーシックの公式テキスト『VBAエキスパート公式テキスト AccessVBAベーシック』を読んでいました。AccessVBAとはマイクロソフトのOfficesoftであるAccessに搭載されているプログラミング言語です。
いろいろな目的からAccessVBAについて勉強してきましたが、もうそろそろきりが良さそうなので、本書について備忘録や自分が理解することも兼ねてまとめていってみたいと思います。
最初の150ページぐらいはExcelVBAの復習という感じ
『VBAエキスパート公式テキスト AccessVBAベーシック』は、最初の説明文のページを除いた全体のページ数は約320ページほどあります。ちなみに『VBAエキスパート公式テキスト ExcelVBAベーシック』だと約240ページ程のボリュームになります。
約80ページの差がありますが、この差はなんなのでしょうか?AccessVBAはExcelVBAよりも難しいイメージがあるので、難易度的にAccessVBAの方が難しいから、その分AccessVBA専用の難しい関数やステートメントが多くあるということなのでしょうか。
AccessVBAはAccessVBAの内容だけでこのページ数だけかというと、そんなことはありません。自分の見た感じだとAccessVBAベーシックのテキストのうちの最初の150ページ程は、ExcelVBAの公式テキストに記載されていた内容と結構重なります。ExcelVBAの復習と言ってもいいかもしれません。
例えば、本書の構成において第1章の「VBAの基礎知識」では「モジュール」や「プロシージャ」「オブジェクト」といった基礎的な内容が中心です。第2章の「データベースの基礎知識」はAccessVBAではなく、まだAccessの基本的な内容や操作方法といった感じです。
第3章が「変数・定数・配列」で第4章が「ステートメント」、第5章が「関数」です。全部が全部ExcelVBAの内容と重なるわけではなく、一部は本書の内容から初めて見る関数もあります。
例えばテーブルやクエリの、あるフィールドに対する合計値を返す「DSum関数」やNull値を指定した値に変換するNz関数など、他にもAccessVBAから初めて見る関数はいくつも出てきます。
また、ExcelVBAと重なる部分が多いと言っても、ExcelVBAとは若干違った角度から勉強できる感じなので、復習も兼ねられるし新たな気づきも得られました。
DoCmdオブジェクト
ここからやっとAccessVBAらしくなってきて、本書の第6章からDoCmdオブジェクトというものが出てきます。
Accessにはテーブルやクエリ、フォームやレポート、その他コントロールやリストボックス、コンボボックスなど様々なデータベースオブジェクトが存在します。そのようなデータベースオブジェクトをまとめて操作・制御できるオブジェクトが「DoCmdオブジェクト」になります。
DoCmdオブジェクトの書式は以下のような形になります。
DoCmd.メソッド 引数1,引数2・・・
自分は最初、ここで戸惑いました。一般的にオブジェクトというと、レポートとかコントロールとか目に見える「モノ」を指します。しかし、DoCmdオブジェクトはレポートやフォームを「操作・制御」するための「動作」のオブジェクトなので目に見えません。
もう少し別の形で表現すると、「モノのオブジェクトと動作を橋渡しするためのオブジェクト」といった言い方もできるかもしれません。これは自分なりに理解するための解釈なんですが、通常のオブジェクトとは別のオブジェクトと考えた方が理解しやすいと思います。
DoCmdオブジェクトのもうひとつの特徴としては「マクロ機能の代替」である、ということです。『これ一冊で完璧! AccessVBA即戦力講座』には次のように書かれています。
p.133
DoCmdオブジェクトの限界
DoCmdオブジェクトに用意されている命令は、あくまでマクロ機能をVBAで実行するためのものですから、それ以上のことはできません。例えば、クエリの結果で得られたデータ1つ1つに対して、更にチェックするとか、条件に合ったものの集計をするといった細かい処理はできません。
Accessにおけるマクロは、マクロビルダーなどを通してドロップダウンから必要なアクションを選択していくという形でプログラムをつくることができます。VBAのように英語の難しいコードを覚える必要はなく、ブロックを積み上げていくように直感的にプログラムを組み立てていけます。
デメリットとしてはレコード単位やデータ1つ1つに対してチェックができないなど、マクロだけでは細かい操作ができません。つまりマクロの代替機能であるDoCmdオブジェクトだけでは細かい操作は難しいということです。
そういったことから「データベースの接続」とか「DAO」「ADO」といった言葉が出てくるのですが、これはAccessVBAスタンダードの範囲になるので、また機会があったらこの部分に触れていきたいと思います。
フォーム・レポートの操作
Excelとは違ってAccessにはフォームやレポートといったオブジェクトが出てきます。このフォームやレポートに対する操作がAccessVBAでできるようになっており、本書の第7章の「フォーム・レポートの操作」においてその説明がされています。
この部分の特徴としては、例えば「A」というフォームがあったらA専用のフォームモジュール、「B」というレポートがあったらB専用のレポートモジュールが存在します。基本的にはフォームに対応するフォームモジュール、レポートに対応するレポートモジュールに対してVBAを記述していく必要があります。
自分が読んだ感じでは、基本はClickイベントを利用して様々なプロパティやメソッドを使っていくイベントプロシージャが多いと思いました。
例えば、RecordSourceプロパティを使ってフォームやレポートの元になるデータを設定することができます。フォーム上に何らかのボタンを設置して、そこにClickイベントを通してVBAを記述することで、データ元として特定のレポートやクエリを設定するといった感じです。
このようなプロパティやメソッドを利用することで、フォームやレポートで自分が見たい情報を抽出するといったことが可能になります。
SQL
Accessにはクエリというデータベースオブジェクトがあります。これによって指定のいくつかのテーブルからある一定の条件で特定のフィールドやレコードを抽出したり、テーブルを連結させることができます。
そういった操作をVBAとはまた違ったコードでできるようにしたのがSQL(Structured Query Language)であり、クエリの元となっているものでもあります。本書の第9章の「SQL」でこの部分の説明がされています。
SQLの最も基本的な操作はテーブルからレコードを抽出することです。そのための構文としてSELECTステートメントがありますが、以下のような形になっています。
SELECT フィールド名1,フィールド名2・・・FROM テーブル名;
上の構文は、ある特定のテーブルからフィール名1とフィールド名2を抽出するという意味になります。
以上のような操作をさらに細かくできるように、本書では「DISTINCT述語」や「Between…And演算子」「In演算子」など、多くの構文が記載されています。
「SQL」というものをある程度まとまって見るようになったのは過去記事でも書いたのですが、Accessを勉強するために一番最初に読んだ『マンがでわかるデータベース』からです。
これ以降、FOM出版の『よくわかる Microsoft Access 2013』の本とか『Accessのデータベースのツボとコツがゼッタイにわかる本』も読んだりしていきましたが、SQLに関しては出てきたとしてもクエリの操作で出てくる「Between…And演算子」など極一部だけです。
ですからデータベースのSQLに関してある程度まとめて勉強したいということになれば、AccessVBAベーシックの公式テキストから入るのが良いのではないでしょうか。
この部分を勉強していて、Accessを勉強していた時には出てこなかった構文や操作を見て、「あぁ、AccessVBAと併用したSQLだとこんなこともできるんだな」と関心しました。
一方で『これ一冊で完璧! AccessVBA即戦力講座』を読んで「SQLはこういった見方もできるんだな」といった気づきもありました。それは
- 動作チェック用
という見方です。
『これ一冊で完璧! AccessVBA即戦力講座』には次のように書かれています。
p.166
クエリと密接な関係があるSQLですが、なぜ既存のデータベースを扱う時に知っておかないといけないのでしょうか?
クエリと同じなら、クエリを使えばいいじゃないかと思うのは当然です。しかし、第3章でも触れましたが、先ほど紹介したサンプルのように、コードに単にクエリの名前が書いてあるだけだと、そのクエリがなにをやるのかコードだけをみてもわかりませんよね。
それに、データベースの規模が大きくなると、めったに使わないような処理のためにもクエリを作らなくてはならないなど、クエリだけで膨大な数になってしまうことが考えられます。そういったことを避けるために使うのが、SQLなのです。
この部分を読んで「あぁ、なるほど、確かにそうかもしれない」と思いました。例えばAccessVBAベーシックのテキストにおいて、SQLのサンプルとして次のようなものがあります。
p.280
Sub Test12()
Dim StrSQL As String
DoCmd.SetWarnings False
StrSQL="INSERT INTO T部署マスタ VALUES('B006','開発部');"
CurrentDb.QueryDefs("Qクエリ").SQL=StrSQL
DoCmd.OpenQuery"Qクエリ"
DoCmd.SetWarnings True
End Sub上のコードの意味は、T部署マスタテーブルの部署コードフィールドに「B006」、部署名フィールド「開発部」のレコードが一件追加される、というものです。
引用したコードはまだSQLが記述されているので「どんな操作がされるのか」がわかります。しかし以下のコードのようにSQLがなく、ただ単にナビゲーションウィンドウ上にあるクエリ名が指定されて実行されるだけのコードだったらどうでしょうか。
Sub Test13() DoCmd.OpenQuery"Q社員名簿" End Sub
一度VBEからAccessの画面に戻って処理を確認したりSQLビューでどんなSQLが書かれているか確認しないとどんなクエリなのかわかりません。以上のようなことからSQLの存在理由というか、使いどころがわかってきました。
そろそろ試験を受けてみる
ここまでAccessVBAベーシックの公式テキストの特徴について簡単にまとめてみました。本書を読む前は、AccessVBAというのは、Access専用のすごく難しいステートメントや関数がたくさんあるんだろうなぁと思っていました。
しかし、とある書店で最初に手にとってパラパラと中身を見てみた時は少し拍子抜けしました。というのもここまで書いてきたように、本書の3分の1はExcelVBAの内容と重なっていたからです。
でもよくよく考えてみると、ExcelVBAもAccessVBAも同じ開発言語が使われているのだから内容が似てくるのも当たり前と言えば当たり前です。
とはいっても、ExcelVBAにはExcelVBAの特徴がありますし、AccessVBAにはAccessVBAの特徴があって、その違いや使い道などいろいろと勉強になりました。
本書を読んで思ったことや、ここまで書いてきた内容から、AccessVBAから勉強するよりは、ExcelVBAから勉強した方が、いろいろと段階的に楽というかやりやすいのではないかと思います。
AccessVBAを勉強するためにAccessから始めて、さらに本書を読み始めてからある程度の回数になってきました。そろそろ試験を受けようかと思っており、ここまで書いてきた過去記事のように良い結果をまた書けるようにしたいです。





















コメント