AccessとVBA(VisualBasic For Application) | '99/06 |
Accessは従来にない平易でかつ奥深いデータベースソフトです。Accessの信奉者である編者は、この素晴らしい
ソフトが多くの人の身近にあって欲しいと念願しています。 「Accessお勉強会」は、Accessに興味を持ったサラリ−マンOB、シニア、家庭の主婦または職場の事務・業務改善を考えるサラリーマン・ウーマンを想定した「ノンプロ」のための教室です。 誰でもがAccessに身近で容易にアプローチできる着眼点が、プログラムレスとそれを後押しする業務・処理別パターン化を含む「マクロベース」の提起です。こちらを参照 端的にいえば、できるだけVBAなどのプログラム(ロシージャー)を使わないで、品質をおとすことなく、自分による・自分のためのアプリケーションをつくりあげよういうわけです。 ここで取り上げる事務系業務は画像処理、周辺機器、Webなど技術面ではそれほど高度な処理プログラムを必要としないレベルです。 この環境条件でプログラムレスは可能か、またそれはどこまで可能かを探求します。 個人的な経験によれば、一般的にAccessが”弱い”といわれているいくつかの機能は、Accessを極めれば自ずと道が開け、問題解決の達成射程距離に収まるのではないかと思うようになりました。もちろん、簡易言語の限界はあります。 以下、Access応援団の立場からAccessとVBAの係わりあいを事例を挙げ検討します。「的はずれ」があるかもしれません。 1.テーブルの直接更新 Accessではテーブルを直接操作することは確かにできません。レコードの参照はDLookup() で間に合いますが、更新はできません。 しかし、フォームをインターフェースにとれば、そのレコードソースにクエリ、テーブルが連なるから、フォームでデータ入力した結果はそのままテーブルに直結して保存されます。 今開いているMDBから他のMDBのテーブルのフィールドの更新もリンクテ−ブルによって自動的に達成されます。 2.レコード1件毎のループ処理 レコードを1件読んで、1件づつ必要な処理ができるか否かは重要なポイントです。いわゆるループ型のバッチ処理の対応です。 Accessではマクロのアクション:「マクロの実行」を活用し、最初の1件目からレコードが終了するまで「1件 処理」を繰り返します。 通常、終了条件を設定する「マクロの実行」と条件に従って具体的な処理を実行する付属の「マクロの実行」の2つのマクロの記述が必要です。 終了条件は「実行回数」または「繰り返し条件」が指定できます。繰返し条件はWhile構文により「レコードがある間」ループさせる方式で汎用化します。 3.条件により分岐する処理 条件式を評価し異なった処理を実行させます。いわゆる「If.....Then」型構文の対応です。 Accessでは、マクロの条件欄に条件式を記述し、条件ごとにアクション:「マクロの実行」を設定します。条件のなかにさらに条件が加わるネスト(入れ子)構造の場合は、該当するアクション:「マクロの実行」に従属するアクション:「マクロの実行」を追記します。 マクロでの記述は”見た目”がフラットで条件とマクロの階層がみえません。条件が複雑なとき、ネスト階層が深い(例えば、3層以上)ときはVBAを使用した方がよいと思います。 ただし、条件は2つ以上の条件を結合させることでネストの階層を減らせる工夫ができます。(例;A&A1 A&A2 B&B1 B&B2 ) 事務処理では条件分岐はデータの入力チェックで頻繁に使用されますが、あまり複雑な重層なケースはないようです。 4.レコード読み込み・書き込み時のエラー処理 ファイルを開いたときやレコードを検索したとき、該当レコードの有無のチェックは必須です。 Accessのマクロのアクション:「フォームを開く」はエラー処理がありません。異常なエラーは無視するとしても、存在しないレコードを無条件で検索を実行してはいけません。 ファイルの読み込みのときは必ず直前にDLookup() を条件欄に挿入し、エラーがあればアクション:「イベントのキャンセル」でメッセージをだし、無用なレコードの混入を阻止します。 「新規追加」のときは「なし(IsNull)」が正しく、「あり(IsNotNull)」はエラーです。また、「修正・削除」のときは「あり(IsNotNull)」が正しく、「なし(IsNull)」はエラーです。 なお、重複データの追加書き込みは「伝票番号」などメインキーがオートナンバ−でユーニク化されていれば更新は自動的に拒否されます。 マルチユース(LAN)環境で、既存する同一レコードの同時アクセスによる競合は、Accessのツール⇒オプションで「編集中のレコード」のロック機能を設定します。ただし、大規模なネットワーク下では不特定多数のPCからの競合や通信エラ ーが予想されるからAccessの境環ではムリでしょう。 5.表引き 事務処理では、出張旅費手当や原価表などテーブルで表引きするケースが珍しくありません。 配列技法(Array)のないAccessのマクロで2次元のテーブル操作は不可能とされていますが、工夫によって解決できます。 Accessのテーブルは、Excelのような「行列」の概念はありません。「行」に相当するはレコードはDLookup()で検出できますが、「列」はフィールド名が固有(名前が一つひとつ違う)のため特定できません。 対応;列に相当するテーブルのフィールド名を「固有名01」「固有名02」のように定義します。(例えば、1列目・・・「日当01」(200km以下)、2列目・・・「日当02」(201−400km)とし、行(役職区分とします)別に日戻日当額テーブルを決めます 利用例;300kmの出張は区分「02」を指定すれば、フィルードは「日当02」が選択されます。役職区分と日当区分の交点が求める「日戻日当手当」となります。ここではナンバリング化したフィールドの「区分」を結合した DLookup("日当" & [日当区分]を利用します。 この表引きの「行」;レコードは無限ですが、「列」は例えば実用の範囲として30区分程度におさえます。 3次元テーブルは、2次元テーブルを付属に追加しますが、事務処理ではそこまでの必要性はなさそうです。 6.文字列の個別操作 フィールドの文字を「1文字」づつ読み込む関数を探しています。left()、Mid()など標準関数を組み合わせればできないことはありません。関数()を自由に組んでキメの細かい文字列処理ができればそれに越したことはありません。 ただし、利用場面はあまりなさそうです。 宛名ラベル発行の町名〜番地を、ラベルの右端に揃えるVBAの例を見かけました。こういう細かな配慮ができる点はさすがと思いますが、ラベル発行で そこまで気を使う必要はないと思います。 7.オブジェクトのコピー処理 Accessの極めつけのひとつにアクション;「オブジェクトのコピー」機能があります。 連結フォームはレコードソースにクエリをもちます。同じフォーマットのフォームでも例えば、並べ替えや抽出条件が複数ある場合、Accessでは同じ数のフォームを作成しなければなりません。 フォームはしばしばデザインの変更を伴うので、このやり方はメインテナンスヲを考えると好ましくありません。フォームは唯一つでよいのです。 対応;唯一のフォーム(FX)は唯一の専用クエリ(QX)とします。A条件のときは、クエリ(QA)を(QX)に「オブジェクトのコピー」で複写します。同様に、B条件のときは、クエリ(QB)を(QX)に、C条件のときは、クエリ(QC)を(QX)に、「オブジェクトのコピー」で複写します。結果は同じフォームに異なった内容のコンテンツが表示されます。 処理の終了時にはそれぞれ逆コピーして(QX)の原状に復帰させます。 アクション;「オブジェクトのコピー」はパラメータ(引数)の指定を変更すれば、今作動しているMDBとは別のMDBにも複写できる機能があります。必要なら2つのMDBに同一のオブジェクトの同期化ができます。 なお、クエリとSQLの関連ですが、クライアント&サーバー型ではないLAN型のデータ加工は難解なSQL言語をまたず、Accessのクエリで充分充足できると思われます。クエリの豊富な機能、並べ替えや抽出条件など、ほとんどはパラメータを選択する方式で設定できるの実務的には不便を感じません。 ![]() Accessの入門書で、「初級・・・ウィザード、中級・・・マクロ、上級・・・VBA」と紹介されているのを見かけますが、これには若干異議があります。 言語の難易度に差はあっても業務に上下の区分はありません。言語はあくまで手段であり、アプリケーションの目的・必要性に応じて選択されるべきでしょう。 散見する限り、VBAで組まれたオブジェクトのなかにはマクロ等にとって代われるプロシージャも少なくありません。工夫すればマクロベースでも結構間に合うのです。 もとより、AccessとVBAに線引きがあるはずがありません。 VBAのなかでDoCmdステートメントを使用すれば、ほとんどのマクロのアクションを記述することができます。 また、マクロのなかでもアクション;プロシージャの実行やSQLの実行を使えば直接BVAやSQLの記述ができます。フォームやレポートのプロパティにプロシージャを直接組み込めます。 相互に利用し合うということでしょう。 強調したいことは、アプリケーションの開発を簡易かつ効率的に進めるためには、「AccessでできることはAccessに任せ、どうしてもいう場面では言語による支援をうける」というのが基本的なスタンスです。 蛇足ですが、データの操作を自在に操る技、きめの細かい表現力や見映え、操作性のよさ等々、VBAの優位性は間違いありません。ただ残念なことに、VBAを気軽に勉強できる機会は我々素人の周りにはありません。 VBAのAccessにないTips的なプロパティなどは部分的に利用していますが、本格的なプロシージャとなると、参考書をたよりに”見ようみまねで”試作するものの、応用が利かず、またメインテナンスにも苦労します。 その点、Accessはデザイン操作も定型化され範囲も限定されているので独学ができます。集中して半年も学習すればあれば、実用的なレベルの事務系統のアプリケーションに取り組める力がつくと思います。 |