Да, это возможно, но, возможно, многое для новичка в макропрограммировании. Сложность немного увеличивается, потому что вы пытаетесь одновременно работать и с Excel, и с проектом - но это все полностью выполнимо.
Нет никаких API, которые уже сделали бы это сжатие, но MS Office имеет очень богатую модель Document Object. Один из лучших ресурсов, которые у вас есть, это ваш ключ «F1». Попробуйте записать то, что вы хотите сделать, очень маленькими шагами и измените код, чтобы сделать его соответствующим образом общим. Рекордер может помочь вам обнаружить объекты, методы и свойства, с которыми вам нужно познакомиться.
Основным рабочим объектом в Project является объект Task . В Excel это объект Range . Вам нужно познакомиться с обоими, чтобы делать то, что вы хотите. Грубый набросок:
- Начните с выбранных вами задач в проекте
- Для каждого задания на ваш выбор:
а. Создать новую рабочую книгу
б. Получить значения, которые вы хотите от проекта
с. напишите их в соответствующий диапазон в Excel
Я немного нечетко отношусь к шаблонной части вашего вопроса, так что не беспокойтесь об этом в приведенном ниже примере, но вы можете определить вещь под названием Named Range в Excel. Таким образом, эти имена могут находиться в вашем шаблоне, вы можете даже использовать одно и то же имя на нескольких листах (вкладках), если хотите, и использовать эти имена, чтобы определить, куда записывать ваши данные taks. Например, я записал идентификатор задачи в Range("A2")
, но это также мог быть Range("Project_ID")
Кроме того, я бы рекомендовал разбить это на несколько функций, по одной для каждого шага в вашей схеме. Вот очень простая отправная точка. Чтобы использовать этот пример, вам нужно создать ссылку на определения объектов Excel из Project. Откройте проект VBA IDE и выберите Сервис -> Ссылки. Найдите запись Microsoft Excel XX.0 Object Library и установите флажок. «XX» - это ваша версия Excel. Моему 10, твое чудо будет другим. Любой, кто использует это, должен будет сделать такой же выбор.
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