當使用Access VBA來開發程式後,你會發現,為何表單中的日期挑選功能還要外掛(設定引用項目)?怎麼當初沒有直接內建勒?我猜當時微軟可能不想重複造車,所以用引用的方式來使用這項功能,不過麻煩的是,當引用項目時,如果其他台電腦的版本有差異,或者無此引用項目,就無法使用了。Access新版的部份看似有改善這個功能,但如果讀者跟我一樣侷限於舊版程式中,以下的解決方案還蠻適合您的。
我們這建議使用Brendan Kidwell開發的DatePicker程式
Microsoft Access Date Picker
網頁: (http://www.glump.net/content/accessdatepicker/)
GitHub: (https://github.com/bkidwell/msaccess-datepicker)
由GitHub上我們可以查看操作方式以及下載原始.MDB檔,下載後,依照Day5的教學,將「DatePicker」表單與「mdlDatePicker」模組選擇起來,然後按「確定」匯入這兩個物件。
匯入後,可以於表單中看到「DatePicker」物件,直接點開時會出現無法開啟的錯誤,由於此程式僅能於VBA程式碼中呼叫,因此我們透過程式碼進行教學。
我們建立一個名為「F_Day09」的表單,並且建立一個名為「Text_Date」的文字方塊,以及一個名為「cmd_InputDate」的指令按鈕,另一個名為「cmd_InputDate2」的指令按鈕。
「Text_Date」的「On Click」事件:
Private Sub Text_Date_Click()
'語法:InputDateField 寫入物件, 標題內容
InputDateField Text_Date, "請輸入日期"
End Sub
「cmd_InputDate」的「On Click」事件:
Private Sub cmd_InputDate_Click()
'語法:InputDate(標題內容,[起始日期])
strDate = InputDate("請輸入日期")
MsgBox strDate
End Sub
「cmd_InputDate2」的「On Click」事件:
Private Sub cmd_InputDate2_Click()
'語法:InputDate(標題內容,[起始日期])
MsgBox "文字方塊日期:" & Text_Date
strDate = InputDate("請輸入日期", Text_Date)
MsgBox "修改日期為:" & strDate
Text_Date = strDate
End Sub
比較InputDateField 與InputDate差異,以參數而言InputDateField少了一個[起始日期]的參數,但多了一個[寫入物件]的參數,當寫入物件已含有日期時,開啟日期選擇視窗,就會是起始日期,而InputDate則是透過額外的參數來指定。
當預設日期為2016/12/9時,9的框會選起來,此為起始日期
我們可以看到,這個使用者界面為英文界面,不過因為程式為「表單」與「模組」的組合體,我們可以輕易的進行修改。
我們加入了以下幾個物件:
用來選擇語系的「Combo_lng」下拉式方塊,資料來源類型:下拉選擇「值清單」,資料來源輸入:「"ENG";"CHT";"ESN"」
用來輸入時間的「Text_Time」文字方塊,輸入遮罩:「00:00;0;_」,預設值:「"00:00"」,格式:下拉選擇成「簡短時間」
用來選取今日日期的「cmd_Today」指令按鈕
「Combo_lng」的AfterUpdate事件
Private Sub Combo_lng_AfterUpdate()
'切換語言後變更標籤名稱
Select Case combo_lng.Value
Case Is = "ENG"
cboMonth.RowSource = "1;January;2;February;3;March;4;April;5;May;6;June;7;July;8;August;9;September;10;October;11;November;12;December"
Label19.Caption = "Sun"
Label20.Caption = "Mon"
Label21.Caption = "Tue"
Label22.Caption = "Wed"
Label23.Caption = "Thu"
Label24.Caption = "Fri"
Label25.Caption = "Sat"
cmdCancel.Caption = "Cancel"
cmd_Today.Caption = "Today"
Case Is = "CHT"
cboMonth.RowSource = "1;一月;2;二月;3;三月;4;四月;5;五月;6;六月;7;七月;8;八月;9;九月;10;十月;11;十一月;12;十二月"
Label19.Caption = "週日"
Label20.Caption = "週一"
Label21.Caption = "週二"
Label22.Caption = "週三"
Label23.Caption = "週四"
Label24.Caption = "週五"
Label25.Caption = "週六"
cmdCancel.Caption = "取消"
cmd_Today.Caption = "今日"
Case Is = "ESN"
cboMonth.RowSource = "1;Enero;2;Febrero;3;Marzo;4;Abril;5;Mayo;6;Junio;7;Julio;8;Agosto;9;Septiembre;10;Octubre;11;Noviembre;12;Diciembre"
Label19.Caption = "Dom"
Label20.Caption = "Lun"
Label21.Caption = "Mar"
Label22.Caption = "Mie"
Label23.Caption = "Jue"
Label24.Caption = "Vie"
Label25.Caption = "Sab"
cmdCancel.Caption = "Cancelar"
cmd_Today.Caption = "Hoy"
End Select
Call ConfigSave("DatePicker.Lang", combo_lng.Value)
cboMonth.Requery
End Sub
「cmd_Today」的On Click事件
Private Sub cmd_Today_Click()
If myDate = DATE Then
Done
End If
myDate = DATE
DateToElements
If Not cmdCurrentDay Is Nothing Then cmdCurrentDay.SetFocus
End Sub
於Form_ DatePicker的最上層,「Private myDay As Integer ' current day of month」的下方,加入以下變數:
Private myTime As String
於Form_Open的最下面,加入以下程式碼
'MOD: 載入預設語言
Dim strDatePickerLang As String
strDatePickerLang = Config("DatePicker.Lang")
If strDatePickerLang <> "" Then
combo_lng.Value = strDatePickerLang
Call Combo_lng_AfterUpdate
End If
於DateToElements()的「myDay = Day(myDate)」下方,加入以下程式碼:
myTime = Format(CDate(myDate), "HH:MM") 'MOD: 轉出時間資料
於DateToElements()的「cboMonth = myMonth」下方加入以下程式碼:
Text_Time = myTime 'MOD: 放到Text_Time物件
於ElementsToDate()的「myDate = DateSerial(myYear, myMonth, myDay)」改為
「myDate = DateSerial(myYear, myMonth, myDay) & " " & Text_Time 'MOD: 加入時間」
之後開啟輸入視窗,即可即時切換語言,可點選今日,可包含時間,功能性整個提昇。若有需要新增語言者,可於程式碼中添加,但如果是需要多國語系的內容,可能不能直接寫入程式碼中,建議由Config資料表中添加資料,然後用Config()取出資料,因為VBE不支援Unicode。
填寫時間後,即可一同帶入
帶到欄位上顯示日期包含時間
希望以上教學對各位有所幫助。