|
本帖最后由 roych 于 2015-8-30 20:38 编辑
年初,帮朋友写过一个帖子,关于工作日的计算,鉴于国内大多数小长假都是调休补班形成的,于是采用“分而治之”的思想进行解决,这里不再赘述,详情请留意以下帖子:【新手进阶】之二十三:工作日的计算
根据这个帖子,可以根据开始日期和结束日期,计算出工作日有多少天。
时隔半年多,他忽然发邮件给我,说想进行一个逆运算。也就是说,想知道起始日期的若干个工作日之后,日期是哪天。
准确点讲,这跟逆运算还是有所区别的。事实上,这种计算是不必考虑补班之类的问题,把所有双休日和假期(如果假期是双休日则后延)考虑进去就够了。不过,这样一来,就需要重新写一个函数。为此,可能还需要重新修改表结构。而对于向来比较懒的我来说,整个人都不好了。
所以,我决定不重新写函数,而尽可能调用已有的函数。——说来多少有些汗颜,这也是之前没考虑周全的问题。
现在的已知条件是:已知日期(sDate),工作日天数(理论Days)。从前面的介绍知道,我们已经写了一个函数计算两个日期之间的工作日天数(实际Days)。那么我们可以先用一个DateAdd来得到什么都没扣除的日期(eDate),显然由这两个日期得到的“实际Days”是比“理论Days”小的。那么我们再把两者的差异补到eDate上,再计算“实际Days”与“理论Days”的差异,直至两者相等为止。
于是,这就转化为一个循环函数的编写了:- Function getWorkdays(ByVal sDate As Date, ByVal lngDays As Long) As Date
- Dim lngDate As Long
- Dim eDate As Date
- '为避免过多的循环,建议使用初始值
- eDate = DateAdd("d", lngDays, sDate)
- lngDate = getHoliday(sDate, eDate)
- Do Until lngDate = lngDays
- '更新日期和天数
- eDate = DateAdd("d", lngDays - lngDate, eDate)
- lngDate = getHoliday(sDate, eDate)
- Loop
- getWorkdays = eDate
- End Function
复制代码
另外,大家也可以试试用递归算法来写。不过由于调用外部函数,个人觉得可能不太容易写,很容易导致堆栈溢出的错误。
最后还想说几句:写函数时必须考虑到函数的重用性,含有输入变量的函数比没有的更灵活。此外,出于函数可读性,函数变量最好不要超过5个。如果超过,看看多余的其它变量是否可以写成另一个函数,再传递进来。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|