设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2350|回复: 3
打印 上一主题 下一主题

[模块/函数] 浅谈函数的重用——再谈“工作日”的计算

[复制链接]
跳转到指定楼层
1#
发表于 2015-8-30 20:16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roych 于 2015-8-30 20:38 编辑

       年初,帮朋友写过一个帖子,关于工作日的计算,鉴于国内大多数小长假都是调休补班形成的,于是采用“分而治之”的思想进行解决,这里不再赘述,详情请留意以下帖子:【新手进阶】之二十三:工作日的计算



       根据这个帖子,可以根据开始日期和结束日期,计算出工作日有多少天。
       时隔半年多,他忽然发邮件给我,说想进行一个逆运算。也就是说,想知道起始日期的若干个工作日之后,日期是哪天。
       准确点讲,这跟逆运算还是有所区别的。事实上,这种计算是不必考虑补班之类的问题,把所有双休日和假期(如果假期是双休日则后延)考虑进去就够了。不过,这样一来,就需要重新写一个函数。为此,可能还需要重新修改表结构。而对于向来比较懒的我来说,整个人都不好了。
       所以,我决定不重新写函数,而尽可能调用已有的函数。——说来多少有些汗颜,这也是之前没考虑周全的问题。


        现在的已知条件是:已知日期(sDate),工作日天数(理论Days)。从前面的介绍知道,我们已经写了一个函数计算两个日期之间的工作日天数(实际Days)。那么我们可以先用一个DateAdd来得到什么都没扣除的日期(eDate),显然由这两个日期得到的“实际Days”是比“理论Days”小的。那么我们再把两者的差异补到eDate上,再计算“实际Days”与“理论Days”的差异,直至两者相等为止。
       于是,这就转化为一个循环函数的编写了:
  1. Function getWorkdays(ByVal sDate As Date, ByVal lngDays As Long) As Date
  2. Dim lngDate As Long
  3. Dim eDate As Date
  4. '为避免过多的循环,建议使用初始值
  5. eDate = DateAdd("d", lngDays, sDate)
  6. lngDate = getHoliday(sDate, eDate)

  7. Do Until lngDate = lngDays
  8. '更新日期和天数
  9.     eDate = DateAdd("d", lngDays - lngDate, eDate)
  10.     lngDate = getHoliday(sDate, eDate)
  11. Loop
  12. getWorkdays = eDate
  13. End Function
复制代码

      另外,大家也可以试试用递归算法来写。不过由于调用外部函数,个人觉得可能不太容易写,很容易导致堆栈溢出的错误。
      最后还想说几句:写函数时必须考虑到函数的重用性,含有输入变量的函数比没有的更灵活。此外,出于函数可读性,函数变量最好不要超过5个。如果超过,看看多余的其它变量是否可以写成另一个函数,再传递进来。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2015-8-30 20:23:24 | 只看该作者
顶一个  {:soso_e113:}
3#
发表于 2015-8-31 18:14:54 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
发表于 2016-4-16 13:00:11 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-1 11:43 , Processed in 0.198939 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表