2017-05-27 66 views
0

我創建了一個數據庫使用MS Access,它允許用戶選擇一個人和一個星期,並查看該人將要做的班次。VBA Dlookup不從表中選擇某些日期從下拉列表中選擇項目

這裏是我的問題,我已經得到了代碼工作使用使用DLookup使用pid搜索的工作人員,並尋找一個特殊的日子如下:正在使用的形式

'Look up shifts 
If IsNull(DLookup("Monday", "tblShifts", "[SPID]= " & SPID)) Then 
    MsgBox "Sorry missing shifts", vbCritical, "Error" 
Else 
    selectedDate = Form_frmMain.cboWeekCommencing.Value 
    'MsgBox selectedDate 'shows selected date 
    MonShift = DLookup("Monday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
    TueShift = DLookup("Tuesday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
    WedShift = DLookup("Wednesday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
    ThurShift = DLookup("Thursday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
    FriShift = DLookup("Friday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
    SatShift = DLookup("Saturday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#") 
End If 

圖片數據庫:
Image of form being used in the database

在使用DLookup使用的表的選擇: Selection of table used in DLookup

從上述圖像,日期下拉從接通形式負載以下代碼填充:

thisWeek = Date - Weekday(Date, vbMonday) + 1 
nextWeek = Date - Weekday(Date, vbMonday) + 8 
weekAfter = Date - Weekday(Date, vbMonday) + 15 

cboWeekCommencing.AddItem (thisWeek) 
cboWeekCommencing.AddItem (nextWeek) 
cboWeekCommencing.AddItem (weekAfter) 

這些各自涉及周開始22/05/201729/05/201705/06/2017。當列表框或下拉框被改變時,調用頂層函數來填充輪班,但是當我選擇22/05/201729/05/2017的周時,它可以正常工作,但是當選擇05/06/2017時,DLookup會返回NULL值。

有幾件事情我已經試過正在改變星期後幾周,如果日期設置爲​​,或26/06/2017但時再12/06/2017用作日期不工作再正常工作。

當只使用員工ID時,一切正常。

有沒有人知道爲什麼會發生這種情況?

回答

1

這是因爲Access錯誤地解釋了你的日期。 Access SQL中的日期(因此DLookUp)應該是美國格式。由於22/05/2017在美國將是第22個月,並且不存在,Access猜測是歐洲日期格式。但它應該總是美國格式,所以05/06/2017將被解釋爲5月6日(參見Allen Browne's documentation)。

所以更改此設置:

selectedDate = Form_frmMain.cboWeekCommencing.Value 

這樣:

selectedDate = Format$(Form_frmMain.cboWeekCommencing.Value, "\#mm\/dd\/yyyy\#") 

假設cboWeekCommencing是日期/時間類型。

+0

是的cboWeekCommencing是日期/時間。我明白你說的話,但在選擇查詢確定表中的搜索將作爲我得到的問題是從05/06/2017。是的,我在英國格式化日期爲dd/mm/yyyy –

+0

我不明白你說的是什麼。在SELECT查詢中,如果您傳遞其他字段,則行爲會有所不同。任何時候您使用DLOOKUP時,都需要格式化日期#MM/DD/YYYY#。如果你這樣做,你還有問題嗎? –

+0

對不起,我打算在DLookup中說不是SELECT。它現在拋出一個類型不匹配的錯誤,這是在格式化日期之後,你建議的方式是因爲需要更新表格以使#MM/DD/YYY#格式的日期更新? –

1

當您在MS Access SQL查詢中編寫#XX/YY/ZZZZ#表達式時。 MS Access試圖識別一個日期。起初,MS Access試圖識別#MM/DD/YYYY#格式的日期。只有在嘗試失敗時纔會嘗試識別#DD/MM/YYYY#格式的日期。

在你的榜樣19/06/2017被認定爲2017年6月19日,但2017年5月6日被公認爲06五月2017

我建議你使用#MM/DD/YYYY#格式每次都在MS Access SQL查詢中。