2017-08-07 352 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

公平,可能不会。预编译器指令在分析和处理代码之前应用*预编译器指令中使用的预编译器常量不能包含仅在运行时可能已知的值。 –