本文于2023年3月13日首发于本人同名公众号:Excel活学活用,敬请关注!
我们在excel表中输入日期的时候,结果可能是:
“2023-1-3”,“2023/1/3”,“2023.1.3",“1月3日",“1月3号",“1.3”,“1-3”......
真是五花八门,各显神通,给我们的数据处理增加了不少挑战,而且,在输入过程中,特别是要保持统一格式的时候,感觉特别费劲。
以前Excel里有一个日期控件可以轻松选择输入日期的,但现在没有了,不知是何原因。没办法,那只能一个字一个字地输入喽?非也!
今天给大家分享一个使用VBA制作的日期控件,可以便捷地输入日期:
使用方法,把下图所示窗体、类模块拖到你的文件里,再把sheet1的代码复制到相应的表格代码窗里:
代码比较多,这里就不贴了,感兴趣的看示例文件吧。
代码简析:
一、建立一个类模块DateControl,以下是各个子程序的作用:
Property Get myDate() As Date:
获取当前日期值。
Public Sub ReceiveLabel(ByVal reLabel As MSForms.Label):
接收并保存标签对象。
Public Sub ReceiveComboBox(ByVal reComboBox As MSForms.ComboBox):
接收并保存组合框对象。
Public Sub ReceiveCommandButton(ByVal reCommandButton As MSForms.CommandButton):
接收并保存命令按钮对象。
Private Sub clsComboBox_Change():
当组合框的选项发生变化时,将新日期添加到标签中。
Private Sub clsCommandButton_Click():
处理命令按钮的点击事件,根据点击的按钮改变当前选定的年份和月份,并更新标签的显示内容。
Private Sub clsLabel_Click():
处理标签的点击事件,将标签内容转换为日期格式并输出到当前单元格。
Private Sub clsLabel_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single):
处理标签的鼠标按下事件,改变标签的外观效果。
Function IsFormActive(UsfName As String) As Boolean:
检查是否存在指定名称的用户窗体。
二、新建一个窗体,Usf_DateSelect,用来选择输入日期。
在窗体启动时,动态添加年、月、日等控件
设置控件格式
设置控件名称、Caption等属性。
三、单元格 Worksheet_SelectionChange事件代码:
启动日期控件的条件:第一行,单元格包含“日期",第二行及以下选中一个单元格
日期控件初始值(Caption):
(1)空单元格,且上个单元格非空且为日期:上个单元格日期
(2)空单元格,且上个单元格为空或非日期:当前系统日期(Date)
(3)非空单元格,且非日期,同上
(4)非空单元格,且日期,当前单元格日期
日期控件的背景色:
(1)控件Caption的月份=当前月份:紫色
(2)控件Caption的月份>当前月份:绿色
(3)控件Caption的月份<当前月份:深红色
根据当前点击的单元格来移动日期控件到当前单元格右侧,Top相等
四、如果要在很多表格中使用,可以把sheet1的代码复制到相应的表的代码窗,或者,如果这样有点麻烦,并且代码重复看不去不够“专业”,我们可以把在sheet1的代码全部剪切到模块1:
(一)修改程名称:
把
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
改为
Sub ShowDate(ByVal Target As Range)
(二)在需要输入日期的表的代码窗输入以下代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ShowDate Target
End Sub
注意事项:
(一)在使用中如果发现窗体显示大小不正常,可以调整以下语句:
MoveWindow lHwnd, lngLeft, lngTop, .Width * 1.8, .Height * 1.69, True
调整.Width * 1.8, .Height * 1.69乘号后面的数字。
这里有个问题:就是移动窗体的时候,重设控件大小,如果按照原来的宽和高则显示出来的窗体要小很多,试了很多方法都不能有效解决,只好手工来调整,勉强能用。哪位高手知道怎么搞的,还请不吝指教,先行谢过!
(二)在窗体缩放的时候,控件位置显示可能不正常:
1、如果A1单元格可见,则基本没有问题
2、如果单元格行值较大,A1单元格不可见的时候,则可能误差较大,甚至看不到控件,这时,把显示比例调整为100%即可。
3、这里也尝试调整,希望在表格缩放的情况下也能精准定位,但未能成功,想想也算了,太纠结于小细节似乎有点得不偿失(太费时间)!
本文于2023年3月13日首发于本人同名公众号:Excel活学活用,敬请关注!