MS Access VBAプロシージャの呼び出し
今回は、VBAプロシージャをMS Accessのクエリから呼び出してみるのである。
SQLポケリでは、AccessではCREATE PROCEDUREやCREATE FUNCTIONは使えないことになっている。このことに間違いはないのだが、ストアドプロシージャが使用できないかのような誤解を招いているようなので、本ブログで訂正したいのである。
そもそも
Accessは、Office製品のひとつなので、VBAが使用できる。VBAはVisual Basic for Applicationだったかしら。Visual Basic言語でOfficeアプリケーションでの業務を自動化するようなプログラムを作成できます。っていうのがVBAのウリなわけです。
SQLは、リレーショナルデータベースへの命令が可能な言語である。Accessはもちろんのこと、SQL ServerやOracleといった大規模システム用のデータベースでも使用できる。
SQLの特徴として「非手続き型言語である」というものがある。一般的なプログラミング言語は、手続き型である。VBAも手続き型言語である。いくつものステートメントが順番に実行されていき、すべての手続きが終了しないと、処理が終了しない。
SQLでは、ひとつのステートメント(命令文)で1回の処理は終了するようにできている。
また、SQLの基本命令には、一般的な手続き型のプログラミング言語には"必ず"と言ってよいほど存在する、IF文のような場合分けの命令や、WHILE文のような繰り返し処理を行う命令文が存在しない。
ムズカシイ話になってきてしまった。簡単にいってしまえば、
SQL基本命令の特徴
非手続き型
1ステートメントで1処理が完結
IFやFORなどの制御命令がない
ということなのである。
SQL拡張命令
SQLの基本命令には、IFやWHILEが存在しないのであるが、拡張命令には存在する。データベースベンダが各社の製品をより使いやすくするために、言語の拡張を行ってきた結果である。
SQL Serverでは、TransactSQLと呼ばれる拡張されたSQLが使用できる。Oracleでは、PL/SQLと呼ばれるものがある。どちらもIFやWHILEといった制御命令が使用できる。
でもって、Accessはどうかというと、もともとVBAやマクロでユーザが機能を拡張できるようになっていたので、わざわざ新しくSQLを拡張しなくても"いいじゃん"的な発想であったのであろう。SQLを拡張することでデータベースエンジンを複雑にするよりも、既存のVBAというしくみを使って、なんとかやりくりしてしまおう、という道を選んだのである。
ストアドプロシージャ
ストアドプロシージャとファンクションは、データベースの中に作成されるプロシージャやファンクションのことである。
SQL基本命令ではなく、SQL拡張命令に分類される。
SQL ServerやOracleでは、CREATE PROCEDUREでプロシージャを作成できるし、CREATE FUNCTIONでファンクションを作成できる。処理の内容は、拡張されたSQL命令で記述する。SQLの基本命令から作成したプロシージャやファンクションを呼び出すことが可能である。
Accessではというと、CREATE PROCEDURE、CREATE FUNCTIONを使用することができない。しかし、VBA Editorを使ってPublic Functionを作成しておけば、SQLからVBAのファンクションを呼び出すことが可能である。
ちょっと作ってみよう。
VBAのコードは、作成タブの「Visual Basic」ボタンをクリックして、Visual Basic for Applicationsの別ウインドウを開いて作成していく。
このウインドウは、いつまで経っても操作性が変化しない。.NETじゃない昔のVBを操作しているようなデジャブ感を味わいつつ、操作性が変わらないのは「いいことだ」としみじみ思いながら、標準モジュールに、ModuleTestを作成して、Public Functionでf_fooを作成してみた。
.NETじゃなくVBAなので、Return命令は使えない。ファンクションと同じ名前の変数で戻り値を返す。
f_fooファンクションは、引数を倍にして戻すだけ。
当然ながら、VBの文法で処理内容を書くわけです。
f_fooを呼び出すクエリを作成してみる。
SQLビューにしたらこんな感じ。
実行するとこうなる。
ちゃんと計算されている。
さて、VBAファンクションを作成して、SQLから呼び出すことができた。
VBAファンクションはストアドファンクションと呼ぶべきかどうか...
VBAファンクションはVBAで書かれているものだからなぁ... SQLじゃないし。
ということで、SQLポケリでは、Accessでは、ストアドプロシージャを扱えない、ということになっているのであった。どこかに、書いておくべきかなぁ...
えーと、長い言い訳でした。すみません。

Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
投稿者プロフィール

最新の投稿
コンピューター関係の記事2025年4月26日アイキャッチ画像にSQLアイコンとJSONアイコンが欲しい
コンピューター関係の記事2025年4月23日AdSense審査に無事パス
コンピューター関係の記事2025年4月22日SSブログ復活
コンピューター関係の記事2025年4月22日SSブログが無くなった余波は大きい