excel 日历控件_Excel实战技巧46: 使用日历选择日期并直接输入到单元格

学习Excel技术,关注微信公众号:

excelperfect

在使用Excel时,我们经常需要输入日期,典型的工作表是在某列中输入日期,其他列中再输入别的数据,例如下图1所示。

b3d31079f8a2b4316e9b1fdd17eef5eb.png

图1

方法1:使用数据有效性

为方便日期输入,我们可以制作一个下拉列表,让用户直接选择要输入的日期,如下图2所示。

4962e75d91d382e847c4058479a59f1a.png

图2

首先,在一个工作表的某列中输入所有日期数据,然后将日期数据区域命名。如下图3所示,在工作表Sheet2的列A中输入日期数据并命名为“year2019”

bcf88cad60cecaf9e1f7ea26dc6c2aec.png

图3

在要输入日期的工作表列,设置数据有效性。选择列,单击功能区“数据”选项卡中的“数据工具——数据验证”,在“”中进行设置,如下图4所示。

a00b6092c7b06b4c4f3e42dc04c9e5be.png

图4

方法2:使用ActiveX日历控件

使用ActiveX日历控件,配合少量的VBA代码,能够实现方便地在单元格中输入日期,如下图5所示。

b6e006382482d73e3241ec03fc17481e.gif

图5

首先,在功能区“开发工具”选项卡“控件”组中,单击“插入——其他控件”,如下图6所示。

74186ed753c67a112e3a543827639a2d.png

图6

在“其他控件”对话框中,选取“日历控件12.0”,单击“确定”,如下图7所示。

30765e42fd6a79260f110c28a25d6324.png

图7

在工作表中放置日历控件,如下图8所示。

b3193fa8f68d631427dc8e3d985e7b3e.png

图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的程序代码的图片版如下:

8445781f6f8ac571e699f925713c94ce.png

8fd5e8f938e5bcb200b7c3fa1a3ae1ef.png

47d6793af526baf68fccaa1a5b3dfd58.png


版权声明:本文为weixin_39574065原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。