MS Access Tips/Sample and VBA and Blog customize etc...

標準モジュールで「Meキーワードの使用方法が不正です」

今回は、VBAのプチTipsです。

Accessのシステムを開発していて、フォームやレポートも増えてくると、それぞれのフォームやレポートのモジュールに記述していた処理を、複数のフォームやレポートで共通で使うために、標準モジュールに移動させたいということはよくありますね。

で、フォームに記述してあったコードをそのまま標準モジュールにコピーして、コンパイルすると下記のようなエラーがでます。

コンパイルエラーメッセージ

難易度:

Me は自分自身という意味ですので、コードが記述してあるオブジェクトを参照しますが、標準モジュールはオブジェクトではないので使用できません。

標準モジュールからフォームを参照する場合は、 Forms!フォーム名 とすればいいですが、それでは複数のフォームで共通化するという目的にはかないません。

フォームなら Screen.ActiveForm で参照するという方法が使えます。

標準モジュール

フォームから呼び出す時

が、コードが実行されているフォームが必ずアクティブとは限りません。タイマ時イベントで実行される場合とか、実行中に非アクティブになったりすることもありえます。

また、レポートの場合、プレビューせずに印刷した場合はアクティブになりませんので、その場合、Screen.ActiveReport は使えません。

プロシージャの引数でフォーム(レポート)オブジェクトを渡すという方法があります。

標準モジュール

フォームから呼び出す時

Sub ではなく Function にすると、

標準モジュール

フォームから呼び出す時、イベントプロシージャを記述せずに、クリック時などのプロパティ欄に

=SetCaption([Forms]![フォーム1])

と直接、記述することで呼び出すことができます。

ただ、対象が自分自身のフォームと分かっているのに、引数に [Forms]![フォーム1] をわざわざ記述するのは、hatenaとしては、納得がいきませんですね。

=SetCaption()

と記述できたら楽ですね。そういうときは、

標準モジュール

とします。CodeContextObject はコードを実行中のオブジェクトを参照します。実行中のオブジェクトがフォームでもレポートでも使用できます。

フォームの「タイマ時」のプロパティ欄に

=SetCaption()

と設定して、タイマ間隔を 1000 とするとフォームのタイトルバーに時刻が表示されます。フォームがアクティブでなくても更新されます。

このブログで紹介したサンプルでも CodeContextObject は多用してますので、右上の検索ボックスで CodeContextObject と入力して検索すると使用例が出てきますので、参考にしてください。


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/297-494ffd56
該当の記事は見つかりませんでした。