龙空技术网

头条文章——巧用日历控件轻松载入日期计算出差天数

跟我学Office高级办公 279

前言:

如今你们对“非空验证控件”都比较关注,我们都想要剖析一些“非空验证控件”的相关知识。那么小编同时在网上汇集了一些对于“非空验证控件””的相关内容,希望各位老铁们能喜欢,同学们一起来了解一下吧!

各位朋友,首先,今天向大家道一声“中秋快乐、团团圆圆、身体安康!今天我准备巧用日历控件的形式解决一个粉丝关于日期的快速输入问题。她说手工输入日期太累了,于是就私信请教了我。本来今天该休息的,出于热心,我还是帮这个美女粉丝弄好了,事后,她想发红包表达谢意,但是我委婉拒绝了,给她说大家互相帮助下没什么,她非常感动的,说会推荐更多朋友关注哦的!我当即表示感谢!

好了,直奔主题吧。日历控件这个东西就如同大家网上选择日期的那个东西一样,挺方便的,可惜的是,从Office2010开始就逐渐取消了这个控件了,只保留了个什么日期控件,说实在的,这个日期控件很烂,忒不好使用。还是原来那个日历控件好使用得多,于是乎,我老早就将这个2007得日历控件(12.0版本)保存出来了,以备不时之需。如果大家想要这个控件,可以去头条私信、留言给我哦。关于怎么注册这个控件,大家可参考我的这期头条视频。

下面,我来分享下我如果解决这位美女粉丝的问题吧!

一、准备Excel必要的数据

为了保护该粉丝的资料隐私,我模拟了下面这些数据。如下图所示

图1 进行出差计算的框架数据

二、插入日历控件,并设置其适当大小

从开发工具-->点击“控件”选项组的“插入”-->点击“ActiveX控件容器里的“其他控件”-->选择“日历控件 2007”。如下图所示

图2 选择日历控件

点击“确定”后,即可造成日历控件插入。如下图所示

图3 插入的日历控件

三、进入VBA后台环境进行编码设计

双击“Sheet1"工作表,进行如下功能代码编写。如下所示

Private Sub Calendar1_Click() '日历控件的日期值选择事件

ActiveCell.Value = Calendar1.Value '传递日期值给活动单元格

ActiveCell.Columns.AutoFit '同时,自动调整该活动单元格的列宽

ActiveCell.HorizontalAlignment = xlCenter '以及将其内容水平居中

Calendar1.Visible = False '一旦选择日历的日期值后,随即隐藏该日历

End Sub

'以下是工作表单元格(区域)选择改变触发行为事件

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'只允许从大于2行小于11行,且限定在3、4列区域时,让日历呈现;其他区域隐藏

If (Target.Row > 2 And Target.Row <= 11) And (Target.Column = 3 Or Target.Column = 4) Then

'若目标单元格值为空或日历控件日期小于当前日期,则让该日历控件必须指向当前日期

If Target.Value = "" Or Calendar1.Value < Date Then

'以下是设定日历控件在目标单元格的右下角

Calendar1.Left = Target.Left + Target.Width

Calendar1.Top = Target.Top + Target.Height

Calendar1.Value = Date '日历控件获取当前日期

Calendar1.Visible = True '同时,将该日历控件呈现出来

Else '否则目标单元格值非空或日历控件日期不小于当前日期,则直接呈现日历选择

'以下是设定日历控件在目标单元格的右下角

Calendar1.Left = Target.Left + Target.Width

Calendar1.Top = Target.Top + Target.Height

Calendar1.Visible = True '将该日历控件呈现出来

End If

Else '否则选择了非日历该呈现的区域,则直接隐藏日历

Calendar1.Visible = False

If Target.Column <> 5 Then MsgBox "不是日历该呈现的区域,日历禁止显示!", vbInformation, "警告"

End If

'以下是将计算出差天数计算的区域,作“有数字”则居中,否则居左的设定

For Each c In ActiveSheet.Range("e2:e" & WorksheetFunction.CountA(ActiveSheet.Range("e:e")) + 1)

If IsNumeric(c) Then '若该单元格为数字,则内容水平居中

c.HorizontalAlignment = xlCenter

Else '否则该单元格为非数字,则内容水平居左

c.HorizontalAlignment = xlLeft

End If

Next

End Sub

四、Excel前端必要的出差天数计算公式设定

用工作表了逻辑公式函数If()和逻辑条件组合函数And()实现正确计算的数字结果和异常的非数字计算结果的差异性呈现。我们将第一个人的出差天数公式设定为“=IF(AND(D3>C3,C3<>"",D3<>""),DATEDIF(C3,D3,"d"),"开始/结束日期有为空或开始日期大于结束日期的情况")”。

五、测试下解决方案的效果

(一)选择非日历呈现区域的警告提示。如下图所示

图4 选错日历呈现地方提示

(二)开始/结束日期没选全、开始日期大于等于结束日期或没选的效果。如下截图所示

图5 日期选择不全的效果

(三)正确选择开始/结束日期后的正常计算出差天数效果。如下图所示。

图6 正确选择开始结束日期的计算结果

好了,点点滴滴都分享给大家了,希望该作品也对其他遇到类似问题的Office办公朋友有所帮助哦,也更希望你们喜欢!

最后,还是特别感谢各位粉丝的长期关注(头条号:跟我学Office高级办公)、推广和点评哦!再次祝大家中秋团圆、快乐相伴!你们的支持即是我一如既往、勇于执着的动力!

标签: #非空验证控件