学习Excel技术,关注微信公众号:
excelperfect
在使用Excel时,我们经常需要输入日期,典型的工作表是在某列中输入日期,其他列中再输入别的数据,例如下图1所示。
图1
方法1:使用数据有效性
为方便日期输入,我们可以制作一个下拉列表,让用户直接选择要输入的日期,如下图2所示。
图2
首先,在一个工作表的某列中输入所有日期数据,然后将日期数据区域命名。如下图3所示,在工作表Sheet2的列A中输入日期数据并命名为“year2019”
图3
在要输入日期的工作表列,设置数据有效性。选择列,单击功能区“数据”选项卡中的“数据工具——数据验证”,在“”中进行设置,如下图4所示。
图4
方法2:使用ActiveX日历控件
使用ActiveX日历控件,配合少量的VBA代码,能够实现方便地在单元格中输入日期,如下图5所示。
图5
首先,在功能区“开发工具”选项卡“控件”组中,单击“插入——其他控件”,如下图6所示。
图6
在“其他控件”对话框中,选取“日历控件12.0”,单击“确定”,如下图7所示。
图7
在工作表中放置日历控件,如下图8所示。
图8
在该工作表代码模块中,输入下面的代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 2 Then '要插入日期的列
With Me.Calendar1
'显示日历控件
.Visible = True
'日历控件出现的位置
'在当前单元格的右下方
.Top = Target.Top + Target.Height
.Left = Target.Left + Target.Width
End With
Else
'隐藏日历控件
Me.Calendar1.Visible = False
End If
End Sub
Private Sub Calendar1_Click()
'将日历控件中的值输入当前单元格
ActiveCell = Me.Calendar1.Value
'隐藏日历控件
Me.Calendar1.Visible = False
End Sub
代码中,Calendar1是日历控件的名称。
方法3:动态添加ActiveX日历控件
方法2中,我们是先在工作表中放置日历控件,然后使用该控件。所谓动态添加ActiveX日历控件,是在需要输入日期的地方使用代码添加日历控件,用户在选取日期后删除该控件。
在工作表代码模块中的代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ole As OLEObject
Dim ctl As MSACAL.Calendar
Dim lLine As Long
Dim oCodeModule As Object
Application.ScreenUpdating = False
If Intersect(ActiveCell,Columns("A")) Is Nothing Then Exit Sub
With ActiveCell
Set ole = ActiveSheet.OLEObjects.Add _
(ClassType:="MSCAL.Calendar.7", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=.Left + .Width, _
Top:=.Top + .Height)
End With
ole.Name = "Calendar"
Set oCodeModule = ThisWorkbook.VBProject.VBComponents(Me.CodeName).CodeModule
With oCodeModule
lLine =.CreateEventProc("Click", "Calendar")
.ReplaceLine lLine + 1,"ProcessCalendarClick"
End With
Application.Visible = False
Application.Visible = True
End Sub
Sub ProcessCalendarClick()
Dim lLine As Long
Dim lCount As Long
Dim oCodeModule As Object
With Me.OLEObjects("Calendar")
ActiveCell = .Object.Value
.Delete
End With
Set oCodeModule =ThisWorkbook.VBProject.VBComponents(Me.CodeName).CodeModule
With oCodeModule
lLine =.ProcStartLine("Calendar_Click", 0)
lCount =.ProcCountLines("Calendar_Click", 0)
.DeleteLines lLine, lCount
End With
End Sub
遗憾的是,上述代码在添加日历控件后,需要手动点一下功能区中的“设计模式”,然后再取消“设计模式”,才能实现在当前单元格中输入选取的日期。我也不知道为什么,有人能告诉我吗?
上述方法2和方法3的程序代码的图片版如下: