iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0
自我挑戰組

Access VBA的眉眉角角系列 第 9

Access VBA 的眉眉角角Day9: 關於日期挑選這檔事

  • 分享至 

  • xImage
  •  

當使用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」模組選擇起來,然後按「確定」匯入這兩個物件。
http://ithelp.ithome.com.tw/upload/images/20161210/20007221odv58gBgFX.png
http://ithelp.ithome.com.tw/upload/images/20161210/20007221W0nFXC19d3.png

匯入後,可以於表單中看到「DatePicker」物件,直接點開時會出現無法開啟的錯誤,由於此程式僅能於VBA程式碼中呼叫,因此我們透過程式碼進行教學。
http://ithelp.ithome.com.tw/upload/images/20161210/20007221vNO6ebqrlL.png

我們建立一個名為「F_Day09」的表單,並且建立一個名為「Text_Date」的文字方塊,以及一個名為「cmd_InputDate」的指令按鈕,另一個名為「cmd_InputDate2」的指令按鈕。
http://ithelp.ithome.com.tw/upload/images/20161210/200072210WsXd8fovX.png

「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的框會選起來,此為起始日期
http://ithelp.ithome.com.tw/upload/images/20161210/20007221eQq3eEDjyn.png

我們可以看到,這個使用者界面為英文界面,不過因為程式為「表單」與「模組」的組合體,我們可以輕易的進行修改。
http://ithelp.ithome.com.tw/upload/images/20161210/20007221JQ2wbDpilK.png

我們加入了以下幾個物件:

用來選擇語系的「Combo_lng」下拉式方塊,資料來源類型:下拉選擇「值清單」,資料來源輸入:「"ENG";"CHT";"ESN"」

用來輸入時間的「Text_Time」文字方塊,輸入遮罩:「00:00;0;_」,預設值:「"00:00"」,格式:下拉選擇成「簡短時間」

用來選取今日日期的「cmd_Today」指令按鈕
http://ithelp.ithome.com.tw/upload/images/20161210/20007221r1kiifSBzp.png

「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。
http://ithelp.ithome.com.tw/upload/images/20161210/20007221dnyyPJzEn5.png

http://ithelp.ithome.com.tw/upload/images/20161210/20007221huYuwYceAs.png

http://ithelp.ithome.com.tw/upload/images/20161210/20007221CeJ1nW0q9m.png
http://ithelp.ithome.com.tw/upload/images/20161210/20007221gRwuvwu277.png

填寫時間後,即可一同帶入

http://ithelp.ithome.com.tw/upload/images/20161210/20007221ic9wD8Cl9l.png

帶到欄位上顯示日期包含時間
http://ithelp.ithome.com.tw/upload/images/20161210/20007221kehLy8Luid.png

希望以上教學對各位有所幫助。


上一篇
Access VBA 的眉眉角角Day8: 於VBA中的設定值存取方法
下一篇
Access VBA 的眉眉角角Day10: 自製多語切換表單
系列文
Access VBA的眉眉角角30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言