Да, это возможно, но, возможно, многое для новичка в макропрограммировании. Сложность немного увеличивается, потому что вы пытаетесь одновременно работать и с Excel, и с проектом - но это все полностью выполнимо.
Нет никаких API, которые уже сделали бы это сжатие, но MS Office имеет очень богатую модель Document Object . Один из лучших ресурсов, которые у вас есть, это ваш ключ «F1». Попробуйте записать то, что вы хотите сделать, очень маленькими шагами и измените код, чтобы сделать его соответствующим образом общим. Рекордер может помочь вам обнаружить объекты, методы и свойства, с которыми вам нужно познакомиться.
Основным рабочим объектом в Project является объект Task . В Excel это объект Range . Вам нужно познакомиться с обоими, чтобы делать то, что вы хотите. Грубый набросок:
- Начните с выбранных вами задач в проекте
- Для каждой задачи вашего выбора:
а. Создать новую рабочую книгу
б. Получить значения, которые вы хотите от проекта
c. напишите их в соответствующий диапазон в 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