ARTICLE · 1085959
EXCEL VBA日期选择器设计经验分享
EXCEL VBA日期选择器设计经验分享


A-下图:EXCEL VBA日期选择器 












B-全过程
一、新建窗体 frmDatePicker
名称= frmDatePicker
Caption = 选择日期
放 6 个控件:
控件 名称 Caption
Label lblTitle 默认空
CommandButton btnPrevMonth ◀ 上月
CommandButton btnNextMonth 下月 ▶
ListBox lstDays —
CommandButton btnToday 今天
CommandButton btnOK 确定(Default = True)
CommandButton btnCancel 取消(Cancel = True)


二、窗体代码
Option ExplicitPrivate mYear As IntegerPrivate mMonth As IntegerPrivate mSelectedDate As Date'============================================================' 初始化'============================================================Private Sub UserForm_Initialize()Dim wsD As WorksheetDim v As VariantMe.Caption = "选择日期"Set wsD = ThisWorkbook.Worksheets("营业日报")v = wsD.Range("D5").ValueIf IsDate(v) ThenmYear = Year(CDate(v))mMonth = Month(CDate(v))mSelectedDate = CDate(v)ElsemYear = Year(Date)mMonth = Month(Date)mSelectedDate = DateEnd IfRefreshListEnd Sub'============================================================' 刷新日期列表'============================================================Private Sub RefreshList()Me.lblTitle.Caption = mYear & "年" & mMonth & "月"Me.lstDays.ClearDim d As Date, lastDay As DateDim idx As LongDim wk As Stringd = DateSerial(mYear, mMonth, 1)lastDay = DateSerial(mYear, mMonth + 1, 0)idx = -1Do While d <= lastDaySelect Case Weekday(d, vbMonday)Case 1: wk = "星期一"Case 2: wk = "星期二"Case 3: wk = "星期三"Case 4: wk = "星期四"Case 5: wk = "星期五"Case 6: wk = "星期六"Case 7: wk = "星期日"End SelectMe.lstDays.AddItem Format(d, "yyyy-mm-dd") & " " & wkIf d = mSelectedDate Then idx = Me.lstDays.ListCount - 1d = d + 1LoopIf idx >= 0 ThenMe.lstDays.ListIndex = idxElseIf Me.lstDays.ListCount > 0 ThenMe.lstDays.ListIndex = 0End IfEnd Sub'============================================================' 上一月 / 下一月'============================================================Private Sub btnPrevMonth_Click()mMonth = mMonth - 1If mMonth < 1 ThenmMonth = 12mYear = mYear - 1End IfRefreshListEnd SubPrivate Sub btnNextMonth_Click()mMonth = mMonth + 1If mMonth > 12 ThenmMonth = 1mYear = mYear + 1End IfRefreshListEnd Sub'============================================================' 今天'============================================================Private Sub btnToday_Click()mYear = Year(Date)mMonth = Month(Date)mSelectedDate = DateRefreshListEnd Sub'============================================================' 列表双击 / 回车'============================================================Private Sub lstDays_DblClick(ByVal Cancel As MSForms.ReturnBoolean)ConfirmSelectEnd SubPrivate Sub lstDays_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _ByVal Shift As Integer)If KeyCode = vbKeyReturn ThenConfirmSelectKeyCode = 0End IfEnd Sub'============================================================' 按钮'============================================================Private Sub btnOK_Click()ConfirmSelectEnd SubPrivate Sub btnCancel_Click()Unload MeEnd Sub'============================================================' 确认:写入 D5'============================================================Private Sub ConfirmSelect()Dim li As LongDim wsD As WorksheetDim cell As Rangeli = Me.lstDays.ListIndexIf li < 0 ThenMsgBox "请选择一个日期。", vbExclamation, "提示"Exit SubEnd IfmSelectedDate = DateSerial(mYear, mMonth, li + 1)Set wsD = ThisWorkbook.Worksheets("营业日报")Set cell = wsD.Range("D5")If cell.MergeCells Thencell.MergeArea.Cells(1, 1).Value = mSelectedDatecell.MergeArea.Cells(1, 1).NumberFormatLocal = "yyyy年m月d日"Elsecell.Value = mSelectedDatecell.NumberFormatLocal = "yyyy年m月d日"End IfUnload MeEnd Sub
三、营业日报 工作表事件
双击 营业日报 工作表,把下面代码加进去
(若已有 Worksheet_BeforeDoubleClick,合并即可):
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)If Intersect(Target, Me.Range("D5")) Is Nothing Then Exit SubCancel = TruefrmDatePicker.Show vbModalEnd Sub


关注
重播 分享 赞

我的朋友,我们渴望与您同行~