2014-01-20 46 views
1

我有一個窗體,其中輸入了我的零件號和零件版本號。我正在嘗試編寫一些VBA,因此如果單擊窗體上的按鈕,它將搜索查詢,該查詢包含所有零件的所有歷史記錄,以查找零件號以及零件rev匹配。一旦找到匹配的部件號和部分轉速,它會自動爲我填入一些信息。在窗體中使用帶有多個條件的Dlookup

現在我有一個匹配的部件號返回數據,但它給找到的第一個數據,而不管部分轉的,即返回與另一部分數字,但不同的是轉速值。

Sub FindPartNumber_Click() 
DoCmd.OpenQuery "SavedQuotesQuery" 'runs query to find any matching part numbers 

'confirms if part previously exists 
If IsNull(DLookup("PartNumber", "SavedQuotesQuery", "'[PartNumber]=" & Me.PartNumber _ 
& " AND [PartRev]=" & Me.PartRev & "'")) Then 
MsgBox "Part does not previously exist. Please manually enter its characteristics", _ 
vbOK 'and alerts user 
DoCmd.Close 'close query 
Exit Sub 
End If 

[PartName] = DLookup("PartName", "SavedQuotesQuery", "PartNumber='" & Me.PartNumber _ 
& "'") 
[Length] = DLookup("Length", "SavedQuotesQuery", "PartNumber='" & Me.PartNumber & _ 
" And PartRev = " & Me.PartRev & "'") 

DoCmd.Close 'close query 
End Sub 

我只是用兩條匹配標準,語法掙扎,還是有別的東西怎麼回事呢?

回答

3

這裏有很多問題。首先,DoCmd.OpenQueryDoCmd.Close沒有達到你期望的水平。閱讀幫助文件以瞭解如何使用它們,但對於我們的目的而言,僅僅說在這裏不需要它們就足夠了。

您所遇到的問題是,你只在零件名稱使用DLookup通話提供您的標準的一半。因此,您不是使用匹配的PartNumber和PartRev返回PartName,而是告訴Access使用匹配的PartNumber返回它找到的第一條記錄的PartName。如果有多個匹配項,它將返回哪一個實際上沒有定義。

嘗試以下操作來代替:

Sub FindPartNumber_Click()  
Dim MyPartName As Variant, Criteria As String 

    Criteria = "PartNumber=""" & Me.PartNumber & """ AND " & _ 
       "PartRev= """ & Me.PartRev & """" 

    'confirms if part previously exists 
    MyPartName = DLookup("PartName", "SavedQuotesQuery", Criteria) 
    If IsNull(MyPartName) Then 
     MsgBox "Part does not previously exist. Please manually enter its characteristics", vbOK 'and alerts user 
    Else 
     [PartName] = MyPartName 
     [Length] = DLookup("Length", "SavedQuotesQuery", Criteria) 
    End If 
End Sub 
+0

這是一個完美的修復。非常感謝,但是我有一個跟進問題:如果有兩個匹配零件號和rev的實例,但它們有不同的長度,哪一個Access會返回? – user3216418

+0

無法知道,因爲您無法使用「DLookup」指定排序順序。如果這是一個問題,一種方法是使用艾倫布朗的DLookup替代:[擴展DLookup()](http://allenbrowne.com/ser-42.html)。他的功能允許您指定自定義排序順序來處理您所描述的情況。 – mwolfe02

相關問題