2017-11-21 32 views
1

プロシージャのリストを持つリストボックスを持つMS Accessフォームがあります。手続きコードはフォームに保存されます。ボタンもあります。ボタンをクリックすると、リストボックスをループして、選択した項目からプロシージャを実行します。 CallとApplication.Runを使用してプロシージャを呼び出していますが、両方のメソッドでエラーが発生しています。MS Accessコール/ Application.Runプロシージャが変数として動作しない

コール「コンパイルエラー:予想されるサブ、関数、またはProeprty
Application.Run」あなたはApplication.Runを使用してサブを呼び出したい場合は、MS Accessの

Private Sub button_Click() 

With Me.listbox1 
    For Each varItem In .ItemsSelected 
     currSub = .ItemData(varItem) 
     If Not IsNull(varItem) Then 
      Call currSub 'Compile Error: Expected Sub, Function, or Proeprty     
      Application.Run currSub 'MS Access cannot find the procedure 'Name of Procedure' 
     End If 
    Next 
End With 

Sub NameOfcurrSub1() 
    'some code 
End Sub 

Sub NameOfcurrSub2() 
    'some code 
End Sub 
etc. 

答えて

2

プロシージャ 『プロシージャの名前』を見つけることができません、別の標準モジュール(.bas、.clsではなく)に格納する必要があります。サブモジュールを別のモジュールに移動すると、機能します。

Callキーワードは廃止され、文字列に基づく関数は呼び出されません。 Application.Runオブジェクトをオフ動作しない:

+0

これは完璧に機能しました!ありがとうございました。 – user6762734

2

形態はクラスモジュールている場合、その実行中のインスタンスは、オブジェクトあります。オブジェクトのメソッドを呼び出すには、Meに直接Meを渡すことができないという点を除いて、CallByNameを使用し、オブジェクトインスタンスを指定する必要があります。つまり、ローカル変数を呼び出してプロキシ呼び出しを行うことができます:

Dim localMe As Object 
Set localMe = Me 
CallByName localMe, currSub, vbMethod ', arguments would go here 

それとも、あなたはErik's answerのように、独立した、標準モジュールに呼び出したい手続きを移動します。

Call DoSomething

DoSomethingから100パーセント同一である:前者は廃止明示的な呼び出し構文であり、後者はより一般的に使用暗黙呼び出し構文あります。どちらもコンパイル時に検証されます。Call NonExistingProcedureを実行すると、NonExistingProcedureと同じようにコンパイルエラーが発生します。