vba
  • ms-access
  • 2017-07-11 100 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]是表單上的一個控件。 –

    相關問題