Microsoft Project的任务列表一般情况下都会具有层级结构,即大任务分解为小任务,点击“收缩”按钮,就可以把觉得太长的子任务列表收缩起来。形如:
如果直接导出,那么这些大小任务都在一列展示,不仅看不出关系,而且还没有伸缩功能。这时就要用到 VBA 在 Excel 中实现类似的功能。
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言2。
首先我们需要任务之间的层级关系数据。Microsoft Project 中的“大纲级别”字段描述的就是任务之间的层级关系:
我们可以先将“大纲级别”字段与其他数据字段一并导出到 Excel 中:
接着按ALT+F11 进入VBA编辑器,选择插入模块:
输入如下代码:
Sub 分级显示()
Dim i
i = 2
On Error Resume Next
Do While Cells(i, 1).Value <> ""
Rows(i).OutlineLevel = Cells(i, 1).Value
Cells(i, 2).IndentLevel = Cells(i, 1) - 1
i = i + 1
Loop
End Sub
我们来分析一下这段代码:
首先使用Dim来声明变量和分配存储空间3;
On Error Resume Next 表示程序出现错误时,直接跳到下一条语句;
接着从 Excel的第二行开始,通过 Cells(i,1) 方法取出大纲级别数据。Cells(x,y) 表示取出第 x 行、第 y 列所对应单元格内的内容;
然后使用Rows(i).OutlineLevel 来指定本行的大纲层级4;
接着使用 Cells(i, 2).IndentLevel 来指定第二列单元格的缩进量5,如果是第一级则不进行缩进;
indent ɪnˈdent;
To start a line of print or writing further away from the edge of the page than the other lines.
接着点击左上角的绿色箭头按钮,然后在弹出的“宏”对方框中点击“运行”按钮:
然后关闭 VBA 编辑器。接着再点击“数据”标签内的“分级显示”设置图标:
取消勾选“明细数据的下方”:
这样就把“分级显示”框放到了明细数据的上方咯:
左上角还有一排的层级号,点击相应的层级号,可以按照该层级进行收缩操作:
参考资料:
【1】 VBA (Visual Basic宏语言)
【2】Dim 语句.
【3】Range.OutlineLevel 屬性 (Excel).
【4】IndentLevel 属性 (Excel).
【5】从PROJECT导出到EXCEL中的任务如何快速分级.