2017-08-07 26 views
1

Accessでvbaコードに "with"ステートメントを設定しようとしていますが、 "With"が参照しているフォームが変更される可能性があります。 "with"ステートメントのコードを2度書き直すことなくこれを行う方法はありますか? WithステートメントでIFステートメントを使用する

If FooVarible = true then 
    with forms!form1 
else 
    with forms!form2!subForm1 
endif 
    'have code here 
end with 

が、コンパイルう方法はありません: 私はこのような何かを行うことができますように思えます。

+1

*コンパイルする方法はありません* - なぜですか?適切な 'With .. End With'を使用し、適切な構文でフォームを参照すると動作します。変数フォームの場合は、Subプロシージャを作成し、そのフォームをオブジェクトとして渡します。 –

答えて

5

使用変数は:

Dim frm as Object 
If FooVarible = true then 
    Set frm = forms!form1 
else 
    set frm = forms!form2!subform1.form 
endif 
With frm 
    'have code here 
end with 
+0

これはいいですが、フォームをサブフォームとして参照する必要があります。私はこれを示すために私の質問を編集しました – Quark

+2

Elseで 'Set frm = forms!form2!subForm1'を試しましたか?それは動作しませんでしたか? –

+0

ありがとう!フォーム変数でサブフォームを参照できることはわかりませんでした。私はそれを少し修正し、 'set frm = forms!form2!subform1.form'を使用しなければなりませんでした。 – Quark

3

FooVariable場合は一定のプリコンパイラは、あなたがこれを行うことができますすることができます:まだ知って

#Const FooVariable = False 

Sub Test() 

#If FooVariable Then 
    With Forms!Form1 
#Else 
    With Forms!Form2 
#End If 
     'with block contents 
    End With 

End Sub 

あなたは後何であったかそうではないが、良いです。コンパイルされたらFooVariableTrueであれば、VBAは、これだけを見ている:

Sub Test() 

    With Forms!Form1 
     'with block contents 
    End With 

End Sub 

そして、これを、FooVariableFalseの場合:コンパイラは決して不完全Withブロックを見て

Sub Test() 

    With Forms!Form2 
     'with block contents 
    End With 

End Sub 

ていることに注意してください。

+0

これは私がやろうとしていたことに最も近いものでしたが、Scott Cranerの答え。 – Quark

+0

公正で、そうでない可能性があります。プリコンパイラ・ディレクティブは、コードが解析されて処理される前に適用されます。プリコンパイラ・ディレクティブで使用されるプリコンパイラ定数には、実行時にのみ既知の値を含めることはできません。 –

関連する問題