フォームからフォームを開く時、値を引き渡したい時があります。
例えば、商品選択フォームは色々なフォームから開きますが、どのフォームから開いたか知らなければなりません。そうしないと開いたフォームに選択した商品CDをセットすることができません。
その場合、当初はpublic変数を使用していました。しかし、さらに続けて3番目のフォーム開くことがあります。3番目に開いたフォームでも2番目に開いたフォーム名が必要な場合、1番目と2番目の間で使用している同一のpublic変数を使用すると値が失われてしまうので、2番目と3番目では、別のpublic変数を使用することになります。ややこしくなります。
結局、うまくいかないので、Docmd.OpenのOpenArgsを使うことにしました。OpenArgsにフォーム名を指定します。OpenArgsは開いたフォーム名の指定にしか使用していないので、開かれた全てのフォームでMe. OpenArgsは開いたフォーム名を表しています。これでうまくいっています。

また、開いたフォームに値を渡す場合は、public変数を使用しないで、フォームに貼り付けたテキストボックスに値を入れるようにします。例えば、Form_m_cmd18.txtA といった具合です。表示の必要がなければ、「可視」を「いいえ」にしておきます。

コントロールの指定の仕方ですが、最初はForms!m_cmd18!txtAなどとしていましたが、最近はForm_m_cmd18.txtAというふうに「!」を使用しないで「.」を使用するようにしています。この書き方だと、「.」を押した時にインテリセンスで候補が表示されます。こちらの方が楽です。

なるべく使用しないようにしているpublic変数ですが、多少は使用しています。例えばaをpublic変数としてメッセージボックスの戻り値の入力に使用しています。VisualBasicのTry文の戻り値に ex を使用しますが、同じ感覚で a をメッセージボックスの戻り値に使用しています。いちいちプロシージャーごとにDim a as Longと書かなくても良いので割と便利です。同じ要領で i もpublic変数にしています。これもDim i as Longで、For Next文でしか使用しません。

ついでに書くと、メッセージボックスのタイトルですが、表示メッセージは用途がハッキリしているので、特に考えることはないのですが、タイトルを統一的にどういうふうに設定するか最初はよくわかりませんでした。最近はモジュールごとに同じ表示に統一することにしています。特に意味はありません。例えばモジュールの最初の行に
Const strTitle as String = "売上明細一覧"
などと書いておいて、メッセージボックスのタイトルはいつもstrTitleと指定しています。