2009-07-07 15 views
2

私は、Accessフォームで、パブリック機能を持っているMS-アクセスVBA Eval関数の振る舞い

Public Function PopupProcess() as long 
    MsgBox Me.ActiveControl 
    PopupProcess = 1 
End Function 

私は

eval("forms('MyForm').popupprocess") 

を呼び出すと、メッセージボックスを2回を示しています。それはなぜ誰が知っていますか?

私はSP3でAccess 2003を持っています。

編集:主なアイデアは、カスタムコマンドバーコントロールOnActionのフォームから関数を呼び出すことです。 コマンドラインコントロールのフォームから関数を呼び出す方が良いかもしれません。

+1

この関数を呼び出す可能性のある他の関数がありますか? たとえば、フォームに空の関数(「Public Function DoesNothing」など)を追加し、eval( "forms( 'MyForm')。DoesNothing」)を呼び出すと、メッセージボックスが表示されますか? – anschauung

答えて

8

これは、アクセス97の日以来の周りされています非常に長年のバグである:それは一度だけあなたの機能を発射する必要があり、それはまだあなたがフォームの名前と機能またはサブ名をパラメータ化することができます(約4-5バージョンのアクセス)。

ここソリューションは、単にあなたの行動に関するイベントに次の置き、あなたは=と、それに先行しなければならないだけで罰金

=PopUpProcess() 

注意をすること、そしてだろう、フォーム修飾子を使用しないようにです接尾辞には角括弧()が必要です。

実際に行動を利用することができます。実行される関数は、現在スクリーン上でフォーカスを持っているフォームからのものになります。これは、関数の同じ名前を持つ異なるフォームを持つことができることを意味し、どのフォームにもフォーカスがある場合、その名前を持つ関数はそのフォームコードモジュールから実行されます。

さらに、フォームの1つがフォームコードモジュールでpublicとしてその関数を持たない場合は、標準コードモジュールの関数が使用されます。だから、あなたは9つのフォームを持っているかもしれません。それらはすべて、標準の標準コードモジュールで標準の関数を使います。しかし、10番目のフォームは特別なコードを実行する必要があるかもしれません。そのため、関数コードをpublicとしてフォームのコードモジュールに置き、標準コードモジュールのpublicの代わりに実行します。

このアプローチでは、多くの異なるフォームに適用される単一のカスタムメニューバーを作成できますが、多くのフォームではそのカスタムメニューバーから異なるコードが実行されます。これは、メニューコードを所属するフォームに配置することも奨励します。

問題を解決するには、フォームの修飾子を使用せず、上記の形式を使用してください。あなたは、たとえば、また、それらの機能から

=PopUpProcess(‘hello’) 

をパラメータを渡し、のように関数を宣言することができます

注:

Public Function PopUpProcess(strParm as string) 

を覚えておいてください、その関数や構文と何の全て上記の私は、アクセス2007のリボンでonアクションを使用する場合にも当てはまります。

+0

+1。素敵な答え –

+0

本当に素敵です!しかし、私は、Access 2007の動作が変更されていることや、フォームのパブリック関数がVBAの外部では使用できなくなっていることを認識しています(たとえば、計算されたコントロールのソース)。誰かが確認できますか? –

+0

2007年のこの動作の変更は認識していません。mytestと呼ばれるフォームのpublic関数の場合、then = mytest()はそのフォームのコントロールのソースになります。それでもパブリックキーワードを使用する必要があります。現在フォーカスを持っているフォームについて取り上げています。私が言う限りでは、2003年や2007年のこの作品の仕組みには何も違う振る舞いは見られません。 –

1

いいえ、わかりません。このように呼び出すとどうなりますか?

Call Forms("MyForm").PopupProcess 

evalの代わりにCallByName関数を使用して関数を呼び出してみてください。 、

CallByName Forms("MyForm"), "PopupProcess", VbMethod 
+0

この場合、上記は動作しません。このポスターは、フォームのボタンではなく、カスタムメニューバーについて話しています。カスタムメニューバーにはonAction設定しかありません。コードを呼び出すには、 "Call subname"ではなく、式を使用する必要があります。 –

+0

フォーム上の関数を呼び出すpublic関数を呼び出すことができます。 –