零基础学Excel VBA-WE014【项目人力投入曲线】

一、简单演示

零基础学Excel VBA-WE014【项目人力投入曲线】

零基础学Excel VBA-WE014【项目人力投入曲线】

注:VBA画图表的功能我用得不好,所以需要预先做好曲线框架,生成数据后,会同时生成曲线数据。

二、关键对象/方法的分析

Dictionary

一种比较常用的对象,储存数据的方式为:关键字(称为 Key) - 条目(称为 Item)。

常用的属性、方法包括:

  • Add,添加一对相对应的关键字和条目到 Dictionary 对象。
  • Exits,如果在 Dictionary 对象中指定的关键字存在,返回 True,若不存在,返回 False。
  • RemoveAll,删除所有关键字和条目对。
  • Count,返回 Dictionary 对象中的条目数。
  • Keys,返回一个数组,该数组包含一个 Dictionary 对象中的全部已有的关键字。
  • Key,重新设置一个 Key 的 Key 值。

三、执行思路及过程分析

【1】需求分析

这是一个简化了的项目人力投入表格,包括到位时间,释放时间,投入占比,还有人员的类别。

一般来说,这种人力表格,都需要获取每个人、每种类别在项目中的投入时间,然后画个曲线图之类的。

【2】确定每个人每个月的投入时间

Range(Cells(2, 7), Cells(rmax1, cmax)),转换到这张表,就是 G2~P9,这个区间就是填入每个人每个月的投入天数。

这条公式看起来有点复杂,理解了其实也很简单。

拿个具体的月份作为栗子,比如 2018 年 8 月份,如果人员 X 在项目的时期并不跨越 8 月份,也就是他的 到位时间 晚于 2018 年 8 月,或者他的 释放时间 早于 2018 年 8 月,那么他在 2018 年 8 月份的投入天数就肯定是 0 。

我们看 IF 的条件判断,用了一个 OR 函数——只要满足任一条件,直接取 0 。

我们再看看,如果同时不满足这两个条件,那就代表着该人员在 8 月份是有投入的,总共会有 4 种情况:

1. 2018 年 8 月到位,并且当月释放,那么投入时间就是 释放时间 - 到位时间 + 1。

2. 2018 年 8 月刚到,本月不释放,那么本月的投入时间就是 2018/8/31 - 到位时间 + 1。

3. 2018 年 8 月之前到位,本月释放,那么本月的投入时间就是 释放时间 - 2018/8/1 + 1。

4. 2018 年 8 月之前到位,2018 年 8 月之后再释放,那么本月投入时间就是 8 月份的所有天数。

具体属于那种情况,我们不需要逐一判断,实际的投入天数,肯定是上面 4 种情况中的最小值。

也就得到 IF 函数条件为 False 时,取值为 MIN($C3-$B3+1,EOMONTH(H$1,0)-$B3+1,$C3-H$1+1,DAY(EOMONTH(H$1,0))),MIN里面的 4 个值,分别对应上面所说的 4 种情况。

最后,再乘上一个投入占比,就得到本月的投入天数。

【3】生成汇总行,包括总的人天,以及每个月的人天。

【4】统计每种类别的人员,所投入的总人天,以及每个月的人天。

第一步,创建一个 字典 d,获取 类别 的清单,填在 E 列 rmax1+3 行,跟汇总行间隔一行。

字典的这种用法,在 E009 那期有相对详细的介绍,这里就不再重复。

第二步,用一个 SUMIF 公式,对各种类别进行统计,公式不难,难的是要把几个变量融合进去,并且转换为 R1C1 的样式。建议先在 Excel 对应的位置,先把 A1 样式的公式写出来,再慢慢琢磨变量以及 R1C1 如何转换——孰能生巧兮?熟能生巧也!

这样,一个比较完整的项目投入数据就出来了。

关于曲线图,虽然宏也有插入图表的功能,但我研究了一段时间,找不到满意的效果,还不如手动插入来得简单(图片我没截,麻烦——

选择 E12~E17,然后按住 Ctrl,复选 G12~P17,然后来到 插入 菜单,折线图,先随便选一个,生成。

选中刚生成的图表,有个笔的图标,点击,有 样式 和 颜色,任君选择。

样式满意了,发现横坐标不满意。

在图表这里点右键,选择数据,在右边 轴标签(分类)这里,有个编辑的图标,点击,弹出的窗口这里选择我们想要的坐标标签区域,回车,确定。

横坐标标签就一下子改好了,剩下的,标题、显示数据标签什么的,稍微调整一下就完事了。

零基础学Excel VBA-WE014【项目人力投入曲线】


分享到:


相關文章: