是的,这是可能的,但对于新的宏编程人员来说可能很多。由于您正在尝试同时使用excel和项目,因此复杂性有所增加 - 但它完全可以完成。
没有API已经为你做了这个收缩包装,但是MS Office非常丰富 文档对象模型 。您拥有的最佳资源之一就是“F1”键。尝试以非常小的步骤记录您想要执行的操作,并修改代码以使其适当通用。录音机可以帮助您发现您熟悉的对象,方法和属性。
Project中的主要工作对象是 任务 宾语。在Excel中它是 范围 宾语。你需要熟悉两者来做你想做的事。粗略轮廓:
- 从项目中选定的任务开始
- 对于您选择的每项任务:
一个。创建一个新的工作簿
湾从项目中获取所需的值
C。将它们写入excel中的适当范围
我在你的问题的模板部分有点模糊,所以在下面的例子中没有担心,但你可以定义一个名为a的东西 命名范围 在excel中。因此,这些名称可以存在于您的模板中,如果您愿意,您甚至可以在多个工作表(选项卡)上重复使用相同的名称,并使用这些名称来定义写入您的taks数据的位置。例如,我写了任务ID Range("A2")
,但也可能 Range("Project_ID")
另外,我建议将其分解为几个函数,一个用于大纲中的每一步。这里有一个 非常 基本出发点。要使用此示例,您需要从Project创建对Excel对象定义的引用。打开项目VBA IDE并选择 工具 - >参考 。找到条目 Microsoft Excel XX.0对象库 并勾选复选框。 'XX'是你的excel版本。我是10,你的miight会有所不同。使用它的任何人都必须做出相同的选择。
Option Explicit
Sub CopyTasksToExcel()
Dim xlApp As Excel.Application
Dim t As Task
Dim wb As Excel.Workbook
Set xlApp = New Excel.Application
For Each t In ActiveSelection.Tasks
Set wb = CreateWorkbook(xlApp, t.Name, t.ID)
WriteSheetHeadingOn wb
WriteTaskOn t, wb
wb.Close SaveChanges:=True
Next t
xlApp.Quit
Set xlApp = Nothing
End Sub
Function CreateWorkbook(ByVal xlApp As Excel.Application, _
ByVal TaskName As String, _
ByVal TaskID As Long) As Excel.Workbook
Dim wb As Excel.Workbook
Dim fName As String
Set wb = xlApp.Workbooks.Add 'You could specify a template here
fName = ActiveProject.Path & "\" _
& TaskID & "-" _
& TaskName & ".xls"
wb.SaveAs FileName:=fName
Set CreateWorkbook = wb
Set wb = Nothing
End Function
'Writes date from a Project Task to the provided workbook.
Sub WriteTaskOn(ByVal prjTask As Task, _
ByVal xlWb As Excel.Workbook)
With xlWb.Sheets(1)
.Range("A2").Value = prjTask.ID
.Range("B2").Value = prjTask.Name
.Range("C2").Value = prjTask.Duration
End With
End Sub
Sub WriteSheetHeadingOn(ByVal xlWb As Excel.Workbook)
With xlWb.Sheets(1)
.Range("A1").Value = "ID"
.Range("B1").Value = "Name"
.Range("C1").Value = "Duration"
End With
End Sub