1

Я хотел бы создать сценарий, который создает набор электронных таблиц, по 1 на каждую выбранную строку в расписании проекта MS. Это более сложно, чем то, что я видел в "функции экспорта", так как функция экспорта обрабатывает ваш файл MS-Project как таблицу и выполняет преобразование таблицы в таблицу.

Вот что я хочу от функциональности:

  • чтобы иметь возможность выбрать набор задач в MS-Project и вызвать функцию
  • чтобы функция брала 3-5 выбранных элементов из задач и помещала их в определенные места в электронной таблице Excel.
  • В идеале это позволило бы мне дать ему шаблонную таблицу со строками, представляющими места, в которые я хочу поместить данные.
  • Электронная таблица будет иметь несколько вкладок, и я хотел бы установить данные на нескольких вкладках.
  • Каждая задача получает новую электронную таблицу в своем собственном файле.

Я рад написать функцию для этого, но я не знаком ни с какими языками программирования макросов MS или хитростями. Я могу легко визуализировать желаемый псевдокод, я просто не знаю, есть ли API, которые будут делать то, что я хочу.

У кого-нибудь есть мысли о том, возможно ли то, что я хочу, и если да, то как лучше к нему подойти. Пожалуйста, включите ссылки на учебные ресурсы, если это возможно.

1 ответ1

1

Да, это возможно, но, возможно, многое для новичка в макропрограммировании. Сложность немного увеличивается, потому что вы пытаетесь одновременно работать и с Excel, и с проектом - но это все полностью выполнимо.

Нет никаких API, которые уже сделали бы это сжатие, но MS Office имеет очень богатую модель Document Object. Один из лучших ресурсов, которые у вас есть, это ваш ключ «F1». Попробуйте записать то, что вы хотите сделать, очень маленькими шагами и измените код, чтобы сделать его соответствующим образом общим. Рекордер может помочь вам обнаружить объекты, методы и свойства, с которыми вам нужно познакомиться.

Основным рабочим объектом в Project является объект Task . В Excel это объект Range . Вам нужно познакомиться с обоими, чтобы делать то, что вы хотите. Грубый набросок:

  1. Начните с выбранных вами задач в проекте
  2. Для каждого задания на ваш выбор:
    а. Создать новую рабочую книгу
    б. Получить значения, которые вы хотите от проекта
    с. напишите их в соответствующий диапазон в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .