Microsoft Project (或 MSPROJ)是一個國際上享有盛譽的通用的項目管理工具軟件,凝集了許多成熟的項目管理現(xiàn)代理論和方法,可以幫助項目管理者實現(xiàn)時間、資源、成本計劃、控制。 用Project排定計劃時,通過簡單的升級和降級兩個操作就可以輕松地設(shè)置任務(wù)之間的層級關(guān)系,并且通過在【格式】菜單下勾選最右側(cè)的【大綱數(shù)字】,在任務(wù)名稱前面就會自動顯示任務(wù)的大綱數(shù)字了,這個功能非常實用,因為當(dāng)任務(wù)較多時,真的很難分辨任務(wù)在哪個層級上。 ![]() 圖1 最近在學(xué)員群里有同學(xué)提了一個有意思的問題,他想讓計劃中的第一級任務(wù)顯示為里程碑0,然后它下面的任務(wù)比如1.1顯示為0.1,如圖2所示。也就是說,要讓所有任務(wù)的大綱數(shù)字統(tǒng)一降一級,即原來的1.1要顯示為0.1,原來的2.1要顯示為1.1,原來的3.1.1顯示為2.1.1,諸如此類。
圖2 那這個在Project中能不能實現(xiàn)呢? Project中的所有列分成兩類:預(yù)置列、自定義列。預(yù)置列的功能和數(shù)據(jù)格式及算法都已經(jīng)被設(shè)定好了,我們?nèi)绻雽崿F(xiàn)一些特殊的需求,只能想辦法通過自定義列來實現(xiàn)。 比如,任務(wù)的大綱數(shù)字統(tǒng)一降一級,我們就可以通過自定義列來間接實現(xiàn)。 假如說第一級的任務(wù)不多,且少于10個,就是說,【大綱級別】是1的一級任務(wù)最多有9個,其他任務(wù)都是二級、三級、四級等任務(wù)。(注意,即使計劃中有上千個任務(wù),也有可能只有幾個一級任務(wù)) 由于只是降一級,所以我們只需要將【大綱數(shù)字】中的第一個字符降一級就解決了,比如原來有個任務(wù)的大綱數(shù)字是9.2.3.1,現(xiàn)在只需要將它的第一個字符減去1,變成8.2.3.1,就已經(jīng)實現(xiàn)我們的目的了。 這里我們用到兩個函數(shù)。 LEFT(text,[num_chars]) 比如取A1單元中的第1個字符,就可以用公式LEFT(A1,1) MID(text,start_num,num_chars) 比如取A1單元格第1個字符后面的字符,就可以用公式MID(A!,2,10000) 注意MID函數(shù)第三個字段是代表字符串的長度,這里寫的10000,是因為一般的字符串也不會超過10000個字符,所以能涵蓋。 好了,我們需要用一個自定義列。在工作表區(qū)域點擊任意一列,鼠標(biāo)右鍵選擇自定義字段,在彈出的自定義域窗口中,我們可以使用默認(rèn)域類型【文本】,如圖3所示。隨便找一個文本列,比如文本7,給它重命名為“大綱數(shù)字統(tǒng)一降一級”,然后在自定義屬性中點擊【公式】。 公式設(shè)置為Left([大綱數(shù)字],1)-1 & Mid([大綱數(shù)字],2,10000) 這個公式中,&前面的公式是將大綱數(shù)字中的第一個字符的數(shù)字減去1,比如將大綱數(shù)字9.2.3.1中第1個字符“9”減去1,就得出8。&后面的公式是從大綱數(shù)字的第二位開始抽取字符,比如從大綱數(shù)字9.2.3.1的第2位開始抽取字符,就得出.2.3.1。&本身的意思是將前后兩部分的文本合并,這樣就得出8.2.3.1。你看通過這個公式,原來的大綱數(shù)字9.2.3.1就變成了8.2.3.1。 然后在自定義域窗口的計算工作分配行中,也要勾選【使用公式】,即摘要任務(wù)也使用剛才的公式。最后點擊自定義域窗口下方的【確定】。
圖3 返回到Project工作表中,點擊任何一列插入列【大綱數(shù)字】,再插入剛才自定義的那一列【文本7】或者它的新名字【大綱數(shù)字統(tǒng)一降一級】,如圖4所示。我們可以看到,現(xiàn)在已經(jīng)將大綱數(shù)字的第一位減去1了,也就是給所有大綱數(shù)字降了一級。 ![]() 圖4 那么怎么讓任務(wù)名稱前顯示的大綱數(shù)字也像【文本7】列或者讓它降一級呢,我們再通過一個自定義列來實現(xiàn)。 點擊任何一列,鼠標(biāo)右鍵選擇自定義字段,域類型還是使用默認(rèn)的【文本】,隨便找一個文本列,比如文本8,給它重命名為“新任務(wù)名稱”,如圖5所示。然后在自定義屬性中,選擇使用公式,設(shè)置公式為 [文本7] & " " & [名稱]。 這個公式的意思是先顯示【文本7】的內(nèi)容,即【大綱數(shù)字統(tǒng)一降一級】那一列的文本內(nèi)容,然后顯示一個空格,再顯示【名稱】列的文本內(nèi)容。 然后在計算任務(wù)和分組摘要行中也選擇使用公式,最后點擊自定義域窗口下方的【確定】。
圖5 返回到工作表中,點擊任何一列插入列【文本8】或者它的新名字【新任務(wù)名稱】,如圖6所示,這樣任務(wù)就顯示為,任務(wù)名稱+大綱數(shù)字統(tǒng)一降一級了。 ![]() 圖6 這樣就基本大功告成了。 想了解更多Project高手的秘密,上【網(wǎng)易云課堂】搜索“10天精通Project項目管理”或者“張連永”,全網(wǎng)最暢銷的Project視頻課程等著你。 喜歡看書的朋友,也可以在各電商平臺搜索“10天精通Project項目管理”,同樣能找到電子工業(yè)出版社發(fā)行的同名書籍,作者張連永。 不過不要高興的太早,上面這種方法是有局限的,它的局限在于,如果一級任務(wù)超過9個,即大綱級別為1的任務(wù)超過了9個,它就不靈了。比如有個任務(wù)的大綱數(shù)字為10.1,那么通過上面的公式,它在【大綱數(shù)字統(tǒng)一降一級】這一列中將顯示為00.1,因為我們用的公式,是將大綱數(shù)字這一列中的第一個字符減去1,那么當(dāng)大綱數(shù)字為10.1時,它只將第一個字符1減去1,變成了00.1。 所以,如果一級任務(wù)超過9個的情況下,我們還需要另想辦法了。 比如我們可以在Project中,鼠標(biāo)點中【大綱數(shù)字】列,然后按CTRL+C復(fù)制一下。再打開一個空白的Excel文件,直接CTRL+V粘貼過來,如圖7所示。
圖7 然后,我們在B列用LEFT函數(shù)取A列的第一個字符,見圖8. 然后在C列設(shè)置公式,用B列的數(shù)值減去1,見圖9。 再在D列用MID函數(shù)從A列第2個字符開始提取字符串,見圖10。 然后在E列,將C列和D列的文本合并,見圖11。
圖8
圖9
圖10
圖11 但是這種方式其實還是不行,對于大綱數(shù)字為10或10以上的,還是存在原來同樣的局限。比如圖12所示,原來的10.1并沒有顯示為9.1,而是現(xiàn)實為00.1
圖12 如果任務(wù)數(shù)量少,我們手動改一下就行了,如果任務(wù)確實很多很多,又特別想用某種方法批量讓大綱數(shù)字統(tǒng)一降一級,就得再想別的辦法。 我們來看一下大綱數(shù)字的規(guī)律,如果是一級任務(wù),它將直接顯示為一個整數(shù),沒有小數(shù)點。那么我們?nèi)绻屗y(tǒng)一降一級的話,直接減去1就可以了,比如原來的9變成8,原來的10變成9。 如果不是一級任務(wù),那么大綱數(shù)字的字符中必然包含小數(shù)點“.”,比如1.2.1中就包含2個小數(shù)點“.”。 那么我們就可以總結(jié)如下規(guī)律
在Excel中有一個函數(shù),可以判斷字符串中某個字符所在的位置,比如1.2.1中第一個小數(shù)點位于該字符串的第2位,我們就可以用函數(shù)FIND函數(shù)。 FIND(find_text,within_text,start_num) 第一個字段find_text,是指要查找的字符串,即關(guān)鍵字 第二個字段within_text,是指要查找關(guān)鍵字所在的單元格 第三個字段start_num,是指從該單元格字符串的第幾位開始查找,如果不輸入該函數(shù)的第三個字段,默認(rèn)就是從第1位開始查找,即從最左側(cè)開始查找。 比如FIND(“.”,A1,1),就是從A1單元格第1個字符開始查找看小數(shù)點“.”在第幾位上。 我們在Excel的第F列輸入FIND函數(shù),如圖13所示。比如A3單元格中的字符1.1,小數(shù)點“.”位于第2位,所以在F3單元格中返回結(jié)果為2。比如A2單元格中的字符1,不包含小數(shù)點“.”,所以在F2單元格中返回錯誤提示。 也就是說,如果在A列是一級任務(wù)的,那么在F列返回的是錯誤提示。如果在A列不是一級任務(wù)的,在F列返回的結(jié)果就是第一個小數(shù)點“.”位于第幾位上,返回結(jié)果為數(shù)值。
圖13 現(xiàn)在我們要做的工作是區(qū)分A列中的字符是否包含小數(shù)點,其實通過F列就可以判斷出來了,只要F列的結(jié)果為數(shù)字,那么就代表A列的字符中包含小數(shù)點。如果F列的結(jié)果是錯誤提示,就代表A列的字符中不包含小數(shù)點,也就是說它是一級任務(wù)。 在Excel中有一個函數(shù),可以判斷字符是否為數(shù)字,這個函數(shù)是ISNUMBER。 ISNUMBER(value) 比如ISNUMBER(A1),如果A1單元格是數(shù)字,就返回TRUE,如果A1單元格不是數(shù)字,就返回FALSE。 我們在G列輸入ISNUMBER函數(shù),如圖14所示。我們直接把F列的FIND函數(shù)也嵌套進(jìn)去,即ISNUMBER(FIND(“.”,A2,1)),這個公式就可以判斷A列中是否包含小數(shù)點了。返回為TRUE的代表A列中包含小數(shù)點,比如G3單元格;返回為FALSE的代表A列中不包含小數(shù)點,比如G2單元格。
圖14 再次回顧之前總結(jié)的規(guī)律
就是兩種情形,一個帶小數(shù)點,一個不帶小數(shù)點,這樣我們就可以用一個IF函數(shù)來解決了。 我們現(xiàn)在將會用到以上所有提到的函數(shù),再加上IF函數(shù)。 我們在H列輸入這個函數(shù) =IF(ISNUMBER(FIND(".",A63,1))=FALSE,A63-1,LEFT(A63,FIND(".",A63,1)-1)-1&MID(A63,FIND(".",A63,1),10000)) 解釋為:如果A2單元格中不包含小數(shù)點“.”,那么直接用A2單元格的值減去1;如果A2單元格包含小數(shù)點,那么用A2單元格中第一個小數(shù)點“.”左側(cè)的數(shù)值減去1,再與第一個小數(shù)點“.”以及后面的字符進(jìn)行合并。 如圖15所示。
圖15 好,我們將H列從H2開始的數(shù)據(jù)用CTRL+C復(fù)制一下。 然后返回Project文件,隨便插入一個文本列,比如【文本10】,然后用CTRL+V粘貼到【文本10】列中,如圖16所示。 ![]() 圖16 然后剩下的操作就可以參照本文圖5了。 在最新版本的Project中,微軟提供了更佳的用戶體驗。 |
溫馨提示:喜歡本站的話,請收藏一下本站!