用Project排定计划时,通过简单的升级和降级两个操作就可以轻松地设置任务之间的层级关系,并且通过在【格式】菜单下勾选最右侧的【大纲数字】,在任务名称前面就会自动显示任务的大纲数字了,这个功能非常实用,因为当任务较多时,真的很难分辨任务在哪个层级上。
图1
最近在学员群里有同学提了一个有意思的问题,他想让计划中的第一级任务显示为里程碑0,然后它下面的任务比如1.1显示为0.1,如图2所示。也就是说,要让所有任务的大纲数字统一降一级,即原来的1.1要显示为0.1,原来的2.1要显示为1.1,原来的3.1.1显示为2.1.1,诸如此类。
?
图2
那这个在Project中能不能实现呢?
Project中的所有列分成两类:预置列、自定义列。预置列的功能和数据格式及算法都已经被设定好了,我们如果想实现一些特殊的需求,只能想办法通过自定义列来实现。
比如,任务的大纲数字统一降一级,我们就可以通过自定义列来间接实现。
假如说第一级的任务不多,且少于10个,就是说,【大纲级别】是1的一级任务最多有9个,其他任务都是二级、三级、四级等任务。(注意,即使计划中有上千个任务,也有可能只有几个一级任务)
由于只是降一级,所以我们只需要将【大纲数字】中的第一个字符降一级就解决了,比如原来有个任务的大纲数字是9.2.3.1,现在只需要将它的第一个字符减去1,变成8.2.3.1,就已经实现我们的目的了。
这里我们用到两个函数。
LEFT(text,[num_chars])
比如取A1单元中的第1个字符,就可以用公式LEFT(A1,1)
MID(text,start_num,num_chars)
比如取A1单元格第1个字符后面的字符,就可以用公式MID(A!,2,10000)
注意MID函数第三个字段是代表字符串的长度,这里写的10000,是因为一般的字符串也不会超过10000个字符,所以能涵盖。
好了,我们需要用一个自定义列。在工作表区域点击任意一列,鼠标右键选择自定义字段,在弹出的自定义域窗口中,我们可以使用默认域类型【文本】,如图3所示。随便找一个文本列,比如文本7,给它重命名为“大纲数字统一降一级”,然后在自定义属性中点击【公式】。
公式设置为Left([大纲数字],1)-1 & Mid([大纲数字],2,10000)
这个公式中,&前面的公式是将大纲数字中的第一个字符的数字减去1,比如将大纲数字9.2.3.1中第1个字符“9”减去1,就得出8。&后面的公式是从大纲数字的第二位开始抽取字符,比如从大纲数字9.2.3.1的第2位开始抽取字符,就得出.2.3.1。&本身的意思是将前后两部分的文本合并,这样就得出8.2.3.1。你看通过这个公式,原来的大纲数字9.2.3.1就变成了8.2.3.1。
然后在自定义域窗口的计算工作分配行中,也要勾选【使用公式】,即摘要任务也使用刚才的公式。最后点击自定义域窗口下方的【确定】。
?
图3
返回到Project工作表中,点击任何一列插入列【大纲数字】,再插入刚才自定义的那一列【文本7】或者它的新名字【大纲数字统一降一级】,如图4所示。我们可以看到,现在已经将大纲数字的第一位减去1了,也就是给所有大纲数字降了一级。
图4
那么怎么让任务名称前显示的大纲数字也像【文本7】列或者让它降一级呢,我们再通过一个自定义列来实现。
点击任何一列,鼠标右键选择自定义字段,域类型还是使用默认的【文本】,随便找一个文本列,比如文本8,给它重命名为“新任务名称”,如图5所示。然后在自定义属性中,选择使用公式,设置公式为 [文本7] & " " & [名称]。
这个公式的意思是先显示【文本7】的内容,即【大纲数字统一降一级】那一列的文本内容,然后显示一个空格,再显示【名称】列的文本内容。
然后在计算任务和分组摘要行中也选择使用公式,最后点击自定义域窗口下方的【确定】。
?
图5
返回到工作表中,点击任何一列插入列【文本8】或者它的新名字【新任务名称】,如图6所示,这样任务就显示为,任务名称+大纲数字统一降一级了。
图6
这样就基本大功告成了。
想了解更多Project高手的秘密,上【网易云课堂】搜索“10天精通Project项目管理”或者“张连永”,全网最畅销的Project视频课程等着你。
喜欢看书的朋友,也可以在各电商平台搜索“10天精通Project项目管理”,同样能找到电子工业出版社发行的同名书籍,作者张连永。
不过不要高兴的太早,上面这种方法是有局限的,它的局限在于,如果一级任务超过9个,即大纲级别为1的任务超过了9个,它就不灵了。比如有个任务的大纲数字为10.1,那么通过上面的公式,它在【大纲数字统一降一级】这一列中将显示为00.1,因为我们用的公式,是将大纲数字这一列中的第一个字符减去1,那么当大纲数字为10.1时,它只将第一个字符1减去1,变成了00.1。
所以,如果一级任务超过9个的情况下,我们还需要另想办法了。
比如我们可以在Project中,鼠标点中【大纲数字】列,然后按CTRL+C复制一下。再打开一个空白的Excel文件,直接CTRL+V粘贴过来,如图7所示。
?
图7
然后,我们在B列用LEFT函数取A列的第一个字符,见图8.
然后在C列设置公式,用B列的数值减去1,见图9。
再在D列用MID函数从A列第2个字符开始提取字符串,见图10。
然后在E列,将C列和D列的文本合并,见图11。
?
图8
?
图9
?
图10
?
图11
但是这种方式其实还是不行,对于大纲数字为10或10以上的,还是存在原来同样的局限。比如图12所示,原来的10.1并没有显示为9.1,而是现实为00.1
?
图12
如果任务数量少,我们手动改一下就行了,如果任务确实很多很多,又特别想用某种方法批量让大纲数字统一降一级,就得再想别的办法。
我们来看一下大纲数字的规律,如果是一级任务,它将直接显示为一个整数,没有小数点。那么我们如果让它统一降一级的话,直接减去1就可以了,比如原来的9变成8,原来的10变成9。
如果不是一级任务,那么大纲数字的字符中必然包含小数点“.”,比如1.2.1中就包含2个小数点“.”。
那么我们就可以总结如下规律
在Excel中有一个函数,可以判断字符串中某个字符所在的位置,比如1.2.1中第一个小数点位于该字符串的第2位,我们就可以用函数FIND函数。
FIND(find_text,within_text,start_num)
第一个字段find_text,是指要查找的字符串,即关键字
第二个字段within_text,是指要查找关键字所在的单元格
第三个字段start_num,是指从该单元格字符串的第几位开始查找,如果不输入该函数的第三个字段,默认就是从第1位开始查找,即从最左侧开始查找。
比如FIND(“.”,A1,1),就是从A1单元格第1个字符开始查找看小数点“.”在第几位上。
我们在Excel的第F列输入FIND函数,如图13所示。比如A3单元格中的字符1.1,小数点“.”位于第2位,所以在F3单元格中返回结果为2。比如A2单元格中的字符1,不包含小数点“.”,所以在F2单元格中返回错误提示。
也就是说,如果在A列是一级任务的,那么在F列返回的是错误提示。如果在A列不是一级任务的,在F列返回的结果就是第一个小数点“.”位于第几位上,返回结果为数值。
?
图13
现在我们要做的工作是区分A列中的字符是否包含小数点,其实通过F列就可以判断出来了,只要F列的结果为数字,那么就代表A列的字符中包含小数点。如果F列的结果是错误提示,就代表A列的字符中不包含小数点,也就是说它是一级任务。
在Excel中有一个函数,可以判断字符是否为数字,这个函数是ISNUMBER。
ISNUMBER(value)
比如ISNUMBER(A1),如果A1单元格是数字,就返回TRUE,如果A1单元格不是数字,就返回FALSE。
我们在G列输入ISNUMBER函数,如图14所示。我们直接把F列的FIND函数也嵌套进去,即ISNUMBER(FIND(“.”,A2,1)),这个公式就可以判断A列中是否包含小数点了。返回为TRUE的代表A列中包含小数点,比如G3单元格;返回为FALSE的代表A列中不包含小数点,比如G2单元格。
?
图14
再次回顾之前总结的规律
就是两种情形,一个带小数点,一个不带小数点,这样我们就可以用一个IF函数来解决了。
我们现在将会用到以上所有提到的函数,再加上IF函数。
我们在H列输入这个函数
=IF(ISNUMBER(FIND(".",A63,1))=FALSE,A63-1,LEFT(A63,FIND(".",A63,1)-1)-1&MID(A63,FIND(".",A63,1),10000))
解释为:如果A2单元格中不包含小数点“.”,那么直接用A2单元格的值减去1;如果A2单元格包含小数点,那么用A2单元格中第一个小数点“.”左侧的数值减去1,再与第一个小数点“.”以及后面的字符进行合并。
如图15所示。
?
图15
好,我们将H列从H2开始的数据用CTRL+C复制一下。
然后返回Project文件,随便插入一个文本列,比如【文本10】,然后用CTRL+V粘贴到【文本10】列中,如图16所示。
图16
然后剩下的操作就可以参照本文图5了。
……