vba
  • ms-access
  • 2017-07-11 51 views 0 likes 
    0

    我有一个主窗体“fmEmpHWList2”里面有两个子窗体。在子窗体“frmSWList2”中,我有使用Dlookup函数从表中获取值的文本框。 当我在子表单上测试这一切时,一切正常。但是当我将子窗体带入主窗体时,我得到了“#Name?”错误。DLookup函数不工作在子窗体,MS Access VBA

    这是给我的错误中的MainForm中我当前的代码,我需要解决:

    =DLookUp("Version","EmpSWSum","Software = '7-Zip' AND EmpID=" & [Forms]![fmEmpHWList2]![frmSWList2].[Form]![EmpID]) 
    

    在子窗体仅此代码工作

    =DLookUp("Version","EmpSWSum","Software = 'ADG R4i CSDB Client' AND EmpID=" & [Forms]![frmSWList2]![EmpID]) 
    

    注意事项:的EmpID是一个号码

    我很感谢你抽空帮我解决这个问题

    +0

    嗨。此链接可能会有所帮助。 http://access.mvps.org/access/forms/frm0031.htm。这听起来像你需要做到以下几点:'我!Subform1.Form!ControlName' –

    +0

    我试过了,它没有工作。我也多次引用这种形式,并尝试人类不同的组合而没有成功。 –

    +0

    @RyanWildry'Me'不是控件源属性中的有效引用......至少Access总是自动将它包装为[[Me]'],然后返回一个错误。您链接到的表是用于在VBA模块中引用的表吗? –

    回答

    0

    建议命名与其保存的对象不同的子窗体容器控件,例如ctrSWList。然后代码在主窗体控件:

    =DLookUp("Version","EmpSWSum","Software = '7-Zip' AND EmpID=" & [ctrSWList]![EmpID])

    然而,如果这种表达是子窗体控件,并要引用子窗体上的另一个控件,无需格式的名称和类的前缀。

    =DLookUp("Version","EmpSWSum","Software = '7-Zip' AND EmpID=" & [EmpID])

    如果子窗体被打开作为一个独立这也应该工作。

    +0

    我将我的子表单重命名为ctrSWList并将您的代码复制进来。它没有工作。在子表单中有一个名为“EmpID”的EmpID文本框,我从中绘制EmpID。所以这应该工作。就像我说的那样,它独立地作为一个子表单/表单独立工作。 这是当我嵌入子表单问题出现。 我没有想到的东西,软件列表是在一个标签“SWpg1”,这可能是一个问题。 但出于测试目的,我将其中一个字段移出了标签并进入了主子表单,以查看您的代码是否可以工作,而不是。谢谢@ June7 –

    +0

    @MaxineHammett你是什么意思“重命名我的子表单”?换句话说,有两种可能的重命名方式:1)访问导航窗格中列出的实际子窗体对象(实际上只是一个正常窗体),以及2)主窗体上的子窗体控件。它有一个名称属性和一个源对象属性。 June7表示重命名_子窗体**控件**(以使其名称和源对象属性不同),而不是重命名这两个。 DLookUp表达式应引用控件名称而不是实际的子表单名称。 –

    +0

    @CPerkins我改变了你喜欢的DLookUp = DLookUp(“版本”,“EmpSWSum”,“Software ='7-Zip'AND EmpID =”&[frmSWList2]![Employee]),但仍然收到名称?错误。 Employee是文本框的名称,EmpID是文本框的值。它们的格式是frmSWList2。我指的是对的吗? –

    0

    我采取了不同的方法,并做了一个功能,而不是做一个DLookUp。我认为这是一个更好的方法。我以甚至打开的形式加载函数。

    1 Function RunParameterQuery_DAO(Asset As String, Software As String, sTextBox As String) As String 
    2 ' Comments: Runs a query containing parameters 
    3 Const cstrQueryName As String = "qrySWVers" 
    4 Dim dbs As DAO.Database 
    5 Dim qdf As DAO.QueryDef 
    6 Dim rst As DAO.Recordset 
    7 
    8 Set dbs = CurrentDb() 
    9 Set qdf = dbs.QueryDefs(cstrQueryName) 
    10 qdf.Parameters("asset") = Asset 
    11 qdf.Parameters("name") = Software 
    12 ' Open recordset on the query 
    13 Set rst = qdf.OpenRecordset() 
    14 Do While Not rst.EOF 
    15  Me.Controls(sTextBox).Value = rst![SWVer] 
    16  rst.MoveNext 
    17 Loop 
    18 MsgBox (Me.Controls(sTextBox).Value) 
    19 rst.Close 
    20 qdf.Close 
    21 dbs.Close 
    22 End Function 
    

    要运行它

    Call RunParameterQuery_DAO("L52651", "TortoiseSVN", "TortoiseSVN") 
    
    +0

    等等,这是行不通的。我的文本框没有绑定,我在控制源调用我的函数为= RunParameterQuery_DAO(“我。[AssetID]”,“7-Zip”,“txt7Zip”)没有出现,我不明白为什么。 您的帮助真的很感激。 –

    +1

    为什么自定义函数比内在函数更好?问题仍然是如何正确引用对象和控件。哪个Open事件 - 主窗体或子窗体?您在函数参数中将TortoiseSVN作为文本框的名称。 – June7

    +0

    您正在传递一个字符串''我。[AssetID]“',但没有什么会奇迹般地将明确的字符串值转换为有效的引用。是的,Access会为特定的情况和功能做到这一点,但不仅限于任何地方。我同意6月7日的评论,但至少尝试删除引号和我引用:'= RunParameterQuery_DAO([AssetID],“7-Zip”,“txt7Zip”)''我假设[AssetID]是表单上的一个控件。 –

    相关问题