2017-08-07 184 views
1

我試圖在Access中設置vba代碼中的「with」語句,但「With」引用的表單可能會更改。有沒有辦法做到這一點,而不重寫兩次「with」語句中的代碼? 好像我可以做這樣的事情:在「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

您是否嘗試過在其他位置設置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 

很可能不是你所追求的,但好還是知道。一旦編譯,VBA只看到這一點,如果FooVariableTrue

Sub Test() 

    With Forms!Form1 
     'with block contents 
    End With 

End Sub 

而這一點,如果FooVariableFalse

Sub Test() 

    With Forms!Form2 
     'with block contents 
    End With 

End Sub 

注意,編譯器永遠不會看到一個不完整的With塊。

+0

這與我正在嘗試做的最接近,但我應該一直沿着Scott Craner的答案中所示的方式嘗試一些東西。 – Quark

+0

公平,可能不會。預編譯器指令在分析和處理代碼之前應用*預編譯器指令中使用的預編譯器常量不能包含僅在運行時可能已知的值。 –