Access講座 マクロ・モジュール編

本文へジャンプ

1.マクロとは?


マクロとは、手操作で行う一連の作業などの命令を並べたもので、そのマクロを実行する事により、それらの命令が順次、実行されます。

その命令も、一覧から選択し、その命令によって必要な引数を入力していくだけですので、そんなに難しいものではありません。

簡単なものから作っていく事によって、慣れてきますし、マクロに慣れてくると、モジュールにも入りやすいので、とりあえず、出来るものから作っていきましょう。

例えば、
「F_test」というフォームを開き、そのフォームを最大化するマクロを作ってみます。
※前もって、「F_test」というフォームを作っておきましょう。内容は空で構いません。

@「オブジェクト」の「マクロ」を「クリック」し、「新規作成」をクリックします。

マクロとは?



A最初の行の「アクション」の▼をクリックし、「フォームを開く」を選択します。

マクロとは?


B「フォームを開く」を選択すると、下の「アクションの引数」に「フォーム名」の項目が現れるので、「F_test」を選択します。

マクロとは?


C続いて、「アクション」の2行目に「最大化」を選択します。(この命令には引数はありません。)

Dマクロ名を「M_マクロtest」としてを保存して閉じます。

E「M_マクロtest」を選択し、「実行」ボタンをクリックします。(「M_マクロtest」をダブルクリックしても構いません)

マクロとは?

F「F_test」フォームが開き、最大化されました。


以上です。

どうでしょう?予想以上に簡単だったのではないでしょうか?

「マクロ」や「モジュール」というと抵抗がある方も多いと思いますし、実際、奥が深くて、難しいところもありますが、
「千里の道も一歩から」
いっきに難しいところまで勉強する
というよりも、
簡単なところから勉強し、勉強したところから実践に取り入れて活用していく事をお勧めします。




目次


2.Accessの起動時に動作するマクロ


マクロの中でも、Accessのデータベースファイルを起動した時に動作してくれる特殊なマクロがあります。

とは、いいましても、そんなに難しいものではなく、ただ、マクロの名前を
「Autoexec」にするだけです。

名前の変更は、Windows上でのファイル名の変更と同じで、
目的のマクロを選択し、
・更にクリック(ダブルクリックとならないようにワンテンポ置いてから)
・右クリックで、「名前の変更」を選択
・F2キーを押す
どれでも構いません。

マクロとは?」で作った「M_マクロtest」の名前を「Autoexec」に変更し、一旦、このファイルを閉じてみましょう。
そして、再度、ファイルを起動すると、このマクロが実行されるのが確認できるはずです。




目次


3.キーボードに連動するマクロ(Autokeys)


「Autoexec」とならんで、特殊な特殊なマクロとして、
「AutoKeys」というマクロがあります。

これは、キーボードが押された時に、そのキーに連動して動作するマクロです。

@「オブジェクト」の「マクロ」を「クリック」し、「新規作成」をクリックします。

Aこの時、「アクション」と「コメント」の列しか表示されていなかったら、「メニュー」→「表示」→「マクロ名」をクリックします。マクロ名の列が表示されます。

キーボードに連動するマクロ(Autokeys)


例えば、次のように設定しておきます。

キーボードに連動するマクロ(Autokeys)

マクロ名に{F12}、アクションに「閉じる」
としておけば、
「ファンクションキーのF12を押した時に、現在開いているウィンドウが閉じる」
という動作をするようになります。

また、
マクロ名に^a、アクションに「フォームを開く」、フォーム名に「F_社員名簿」としておけば、
「コントロールキーを押しながらaを押すと、社員名簿が開く」
という動作になります。

ファンクションキーの場合は、{F1}や{F2}のようにマクロ名をつけます。
英数字キーの場合は、そのままaやb、
また、Ctrlキーを押しながら英数字キーを押す場合は、^aや^b、
Shiftキーを押しながら英数字キーを押す場合は、+aや+b、
Altキーを押しながら英数字キーを押す場合は、%aや%b
とします。

最後に、かならず、このマクロを「Autokeys」という名前で保存して下さい。

尚、この際の注意点として、
Autokeysでキーを設定すると、WindowsやAccessで設定しているキーよりも優先して機能する
とう事で、割り当てても差支えが無いかどうか確認してから設定しましょう。




目次


4.イベントとは?


過去に、MS-DOS以前のBasicやCOBOL・FORTRANなどのプログラムを作成した事のある人は、
プログラムを実行する場合、

先頭の行から順番に命令を実行し、条件式によって別の番地に飛んだり、
画面からの入力命令で、一時的にストップし、キーボードから文字が入力されると、そこから、また、プログラムが実行される

そういった手順を学んだと思います。

しかし、Accessの場合、
「フォームを開いた時」「フォームの中の、あるコントロールのデータが変更された時」「フォームのコマンドボタンをクリックした時」「レポートを開いた時」
など、それぞれの操作をした時ごとに、マクロやモジュールを設定します。

従来の
「先頭行から順次実行」
という方法は、キーボードからの入力だけなら、

入力待ちの状態から、「Enterキーを押された時に、次のステップに進む」

という事で、問題ないのですが、
OSがWindowsになり、マウスの操作が当たり前になると、自由に画面の好きな項目に移動する事が可能で、
「いつ、どのタイミングで、どのような操作がされるか?」
プログラムで、すべて監視・制御しようとすると、大変複雑な事になってしまいます。

その点、
「それぞれの操作をした時ごと」
なら、その時に必要な命令を書くだけで済みます。
その「それぞれの操作をした時」の事を「イベント」といい、イベント毎にマクロやモジュールを設定できます。

マクロやモジュールは、各イベント毎で完結しているので、各マクロやモジュールが極端に長くなる事がなく、その分、見やすいというメリットもあります。

ただし、様々なイベントに分散している為、全体を完全に把握する事が難しいところもあります。

自由度が高いからといって、適当に、マクロやモジュールを分散させると、後々のメンテナンスが大変になり複雑怪奇なシステムとなってしまうので気を付ける必要がありますが、それは「クラスモジュールと標準モジュール」など、順次、理解する事で解決しますが、いきなり難しい事を頭に詰め込むよりも、まずは、実際に1つずつやってみて、確認して慣れていく事が第一です。

マクロとは?」で作成した「M_マクロtest」をイベントに設定してみましょう。

このマクロは、
「F_testフォームを開いて最大化する」
というものです。

新規に「F_menu」というフォームを作成し、
「ツールボックス」から「コマンドボタン」をフォーム上にドラックします。

イベントとは?



その「コマンドボタン」のプロパティーで、「名前」と「標題」を「F_testを開く」に変更します。

「イベント」の「クリック時」に「M_マクロtest」を選択します。

イベントとは?

このフォームを保存し、開きます。

「F_testを開く」ボタンをクリックして下さい。
「F_test」フォームが開き、最大化されます。




目次


5.モジュールとは?


「マクロまでなら勉強しようと思うけど、モジュールまでは・・・」
と、しりごみされる方も多いようですが、基本的な考え方は、マクロもモジュールも同じで、
イベントとは?」で説明したように、
「各イベントが発生した時に記述する命令」
です。

その命令が、
具体的なアクションの一覧の中から、「フォームを開く」とか「最大化」等と、選択していくのがマクロ、
VisualBasicというプログラム言語で記述していくのがモジュールです。


ただし、その応用範囲には大きな差があり、
マクロで出来る事は、ほとんどモジュールで出来ますが、
モジュールで出来ても、マクロで出来ない事は沢山ありますし、
条件によって処理が変わったり、複雑な手順もモジュールの方が得意です。

私の個人的な見解としては、
「極力、マクロで出来るところはマクロで作成し、マクロで出来ないところをモジュールで作る」
よりも
「極力、モジュールで出来るところはモジュールで作成し、マクロ特有の機能のみマクロでする」
方が、後々のシステムのメンテナンスを考慮した上でも、いいと思います。
(マクロ特有の機能とは、AutoexecマクロやAutokeysマクロなどの事です。)


それでは、「イベントとは?」で作成した、
「F_testを開く」ボタンをクリックした時、「F_test」フォームを開き、画面を最大化する。」
というマクロをモジュールに作り替えてみます。


「F_menu」のデザイン画面を開き、コマンドボタンをクリックします。

プロパティの「クリック時」は「M_マクロtest」となっていますが、この左の をクリックし、
[イベントプロシジャー]を選択します。


モジュールとは?




さらに をクリックすると、モジュールを作成する為の画面、「コードウィンドウ」が開きます。

初期画面として、

モジュールとは?



このように表示されます。

Private Sub F_testを開く_Click()

End Sub
の間に、命令を記述します。

今回の場合は、このように記述します。


Private Sub F_testを開く_Click()

DoCmd.OpenForm "F_test" '「F_test」というフォームを開くという命令です。
DoCmd.Maximize '現在、開いている画面を最大化する命令です。

End Sub


モジュールとは?

なお、「'」(シングルコーテーション)を付けると、それ以降は、何を書いてもプログラムとして認知しません。
注釈行として、メモや説明文を書いておくと、後で見たときに分かりやすくなります。


このように、よく使う命令から、1つずつ覚えていくうちに、徐々に、高度なプログラムも作れるようになっていきます。
とりあえず、簡単な所から作って、活用していくと良いでしょう。

この「コードウィンドウ」そしてフォームを保存して閉じます。

そして、実行してみて下さい。
マクロで作成した時と同様に、コマンドボタンをクリックすると、
「F_test」フォームを開いて最大化する
という動作を確認する事ができます。





目次


6.イベントプロシージャとジェネラルプロシージャ


モジュールは、「プロシージャ」と呼ばれるプログラムが集まって出来ています。

モジュールとは?」で説明した、

Private Sub F_testを開く_Click()

DoCmd.OpenForm "F_test" '「F_test」というフォームを開くという命令です。
DoCmd.Maximize '現在、開いている画面を最大化する命令です。

End Sub

この「Private Sub〜End Sub」まで、これが、1つのプロシージャです。

このようにフォームやレポートの各イベントのプロパティで、「イベントプロシージャ」を選択して作成されるプロシージャをイベントプロシージャと言います。

では、イベントプロシージャ以外に何かあるのか?
という事ですが、イベントプロシージャに対して、ジェネラルプロシージャというものがあります。

イベントプロシージャは、フォームやレポートで、各イベントが発生した時に実行されるプロシージャです。

上記の例なら、
「F_test」というコマンドボタンをクリックした時に実行する
プロシージャです。

イベントプロシージャだけでプログラムを作成する事も不可能ではありませんが、そうなりますと、各イベント毎に全てプログラムを記述しなければならず、膨大な量になってしまいます。

フォームとかコントロール、発生するイベントが違っていても、
実行したい内容は同じ
記述したい内容は同じ


という事は、よくあります。

イベントプロシージャの場合は、
そのフォームの、そのコントロールの、そのイベント
毎に作られますが、そういった枠にとらわれず、他のプロシージャから呼び出して実行できるプロシージャが
ジェネラルプロシージャ
です。

このジェネラルプロシージャをうまく利用し、様々なプロシージャで共有する事によって、生産効率の高いシステムを作る事が出来るようになります。




目次


7.クラスモジュールと標準モジュール


モジュールは、「プロシージャ」と呼ばれるプログラムが集まって出来ている。
という事は、 「イベントプロシージャとジェネラルプロシージャ」で説明しました。

このモジュールには、保存される場所の違いによって、クラスモジュールと、標準モジュールに分類できます。


クラスモジュールは、各フォームやレポート毎に保存されるモジュール、
標準モジュールは、各フォームやレポートモジュールとは独立して保存されるモジュールです。


イベントプロシージャは、
各フォーム・レポートのイベント毎に実行されるプロシージャですから、当然、各フォームやレポート、要するにクラスモジュールに保存されます。

ジェネラルプロシージャは、
そのフォームやレポートだけで使用する場合はクラスモジュールとして、そのフォームやレポートに保存します。

複数のフォームやレポートで共用したい場合は、標準モジュールに保存します。

Accessの基本構成」で説明した、「テーブル・クエリ・フォーム・マクロ・モジュール」の中の「モジュール」をクリックした時に表示されるモジュールが標準モジュールです。

クラスモジュールと標準モジュール



そででは、具体的に、
「画面を最大化する」というモジュールを作成し、フォームを開いた時に実行する
という例を使って説明します。

画面を最大化するのは、「マクロとは?」で説明したようにマクロでも作る事は可能ですが、モジュールでも作れます。

DoCmd.Maximize

という1行を書き込むだけです。この1行をどのように記述するか?見ていきましょう。

クラスモジュールにイベントプロシージャとして保存する場合

まず最初に、目的のフォームのデザイン画面を開きます。
「フォームを開いた時に最大化する」という事なので、フォームのイベントの「開く時」に「イベントプロシージャ」を選択し、をクリックします。


クラスモジュールと標準モジュール

コードウィンドウが開きます。
これは、このフォームのモジュールを記述するウィンドウです。


Private Sub Form_Open(Cancel As Integer)

End Sub

と表示されるので、その間に、
DoCmd.Maximize
を記述します。

次のようになります。

これで、完成です。フォームを保存した後、このフォームを開いて下さい。
開くと同時に、先程のモジュールが働いて、画面が最大化されます。


標準モジュールにジェネラルプロシージャとして保存する場合

モジュールの「新規作成」ボタンをクリックします。

クラスモジュールと標準モジュール


モジュールを作成する為の「コードウィンドウ」が開きます。

メニューバーの「挿入→プロシージャ」をクリックすると、

クラスモジュールと標準モジュール

「プロシージャの追加」ウィンドウが開くので、名前を「最大化」にして、「Functionプロシージャ」を選択し、「OK」ボタンをクリックします。

クラスモジュールと標準モジュール


Public Function 最大化()

End Function

と表示されるので、その間に、
DoCmd.Maximize

と記述し、このモジュールを保存します。

次に、目的のフォームのデザイン画面を開き、フォームのイベントの「開く時」のをクリックします。
※クラスモジュールの時は、「イベントプロシージャ」を選択してからをクリックしましたが、この場合は、「イベントプロシージャ」を選択してはいけません。「イベントプロシージャ」を選択してからをクリックすると、このフォームのモジュール(クラスモジュール)が開いてしまいます。

「式ビルダ」を選択し、「OK」ボタンをクリックします。

クラスモジュールと標準モジュール

「関数」から、先程、作成した「最大化」プロシージャを選択し、「OK」ボタンをクリックすると、

クラスモジュールと標準モジュール

「開く時」に「=最大化()」と記述されます。

※式ビルダを使わなくても、直接、「=最大化()」と入力しても構いません。


クラスモジュールと標準モジュール

後は、このフォームを保存して完成です。


クラスモジュールと標準モジュールの違い、分かって頂けたでしょうか?

クラスモジュールでは、フォーム毎にモジュールを記述しなければなりませんが、標準モジュールなら、一度、プロシージャを作成すれば、フォームのプロパティに、そのプロシージャ名を記述するだけで何度でも使えます。
この例の場合は、1行だけのモジュールなので、フォームごとにモジュールを記述する事も苦にならないかも知れませんが、何行・何十行にもなる場合は共通で使えるかどうかで、効率も大きく変わります。

共通で使うプロシージャは、標準モジュールに記述するようにしましょう。




目次


8.PublicプロシージャとPrivateプロシージャ


共通で使うプロシージャは標準モジュールに
という事は、「クラスモジュールと標準モジュール」で説明しました。

ただし、この場合に、注意する事があります。

プロシージャを追加する時、
適用範囲で、
PublicプロシージャPrivateプロシージャのどちらかを選択します。




Publicプロシージャは、そのデータベース、全てから使えるプロシージャ、
Privateプロシージャは、そのモジュールだけで使えるプロシージャ、
です。

ですから、
各フォームやレポートのクラスモジュールに記述するプロシージャはPrivateプロシージャでも構いませんが、
標準モジュールで作成し、複数のフォームやレポートから使う場合は、Privateプロシージャでは使用できません。

標準モジュールに作成する場合は、Publicプロシージャを選択しましょう。




目次


9.モジュールの引数


クラスモジュールと標準モジュール」で説明したように、モジュールは出来るだけ、共通に使えるモジュールは共通に使用して標準モジュールに記述した方が効率よく作成する事が出来ます。

画面を最大化する

DoCmd.Maximize

といった命令だけなら、普通に標準化する事が出来ますが、
「フォームを開く」といった命令をモジュールにする場合は、どうでしょう?

フォームを開く命令は、
DoCmd.OpenForm "F_test"
といった記述をします。この場合は、「F_test」というフォームを開く事になります。

これを、このまま標準モジュールに記述すると、

Public Function フォーム開く()
DoCmd.OpenForm "F_test"
End Function

といった具合になりますが、この場合のモジュールは、
「F_testというフォームを開く」
というモジュール(プロシージャ)になりますから、別のフォームを開く場合は、また別のモジュールを記述しなければなりません。

そこで、次のように記述しなおします。

Public Function フォーム開く(F_name)
DoCmd.OpenForm F_name
End Function

これは、
「F_nameというフォームを開く」
という意味ではありません。"(ダブルクォーテーション)でくくっていないところがポイントです。
F_nameは変数、記憶を格納する箱のようなものです。ここに格納されている名前のフォームが開くのです。


コマンドボタンの「クリック時」のイベントに

=フォーム開く("F_test")

のように、()の中にフォーム名を記述します。

そうすると、
フォームを開く(F_name)のF_nameに「F_test」という文字が格納され、このフォームが開きます。

モジュールの引数


この( )の中を引数といいます。この引数をうまく利用すると、共通で使えるモジュールを効率よく作る事が出来るようになります。




目次


10.SubプロシージャとFunctionプロシージャ


プロシージャは、「PublicプロシージャとPrivateプロシージャ」の違いがあるのとは別に、
SubプロシージャFunctionプロシージャに分類できます。

具体的には、その組み合わせによって、

Public Sub
Public Function
Private Sub
Private Function


の4種類になります。

では、このSubプロシージャFunctionプロシージャの違いについて説明します。

プロシージャを作る目的の中には、
ある目的の動作を示すだけ
の場合と、
その結果を戻したい
場合があります。

具体的には、
画面を最大化する
とか
フォームを開く
といった場合は前者にあたり、Subプロシージャで作成する事ができます

それに対して、
2つの引数の掛け算の結果を戻す
といった場合は、Functionプロシージャを使わないと作成できません。

具体的には、このように記述します。

Public Function 掛け算(A, B)
掛け算 = A * B
End Function

このプロシージャを標準モジュールに作成します。
使い方については、今後、順次、説明していきます。




目次


11.作成したプロシージャをプロパティに記述して使うには


イベントプロシージャは、フォームやレポート、また、その中の各コントロールのプロパティのイベントが発生した時に実行されるプロシージャです。

さて、それでは、イベントプロシージャ以外のプロシージャ、要するにジェネラルプロシージャは、どのようにして使用するのでしょうか?

いくつかのパターンで使う事が出来ますが、まず、
フォームやレポート、もしくは各コントロールのイベントのプロパティにプロシージャ名を記述する
方法について説明します。


クラスモジュールと標準モジュール」でも参照した、
フォームを開くためのプロシージャを例に説明します。

まず、標準モジュールに、次のように記述します。

Public Function フォーム開く(F_name)
DoCmd.OpenForm F_name
End Function

引き続き、コマンドボタンのプロパティに次のように記述します。


作成したプロシージャを実行するには

これで、このコマンドボタンをクリックした時に、「F_test」というフォームが開きます。

ただし、この場合、
Subプロシージャでは無く、Functionプロシージャでなくてはなりません。

SubプロシージャとFunctionプロシージャ」の違いは、
戻り値を返すか返さないか
という事は説明しましたが、実は、このような違いもあるのです。

また、このような使い方をする場合は、通常、
標準モジュールPublicプロシージャ
で記述します。




目次