Criando 1 planilha por linha com o MS Project

1

Gostaria de criar um script que cria um conjunto de planilhas, 1 para cada linha selecionada em um agendamento de projeto do MS. Isso é mais complexo do que eu já vi na "função de exportação", já que a função de exportação trata seu arquivo MS-Project como uma tabela e faz uma conversão de tabela para tabela.

Aqui está o que eu quero da funcionalidade:

  • para poder selecionar um conjunto de tarefas no MS-Project e acionar o função
  • para que a função leve de 3 a 5 itens selecionados das tarefas e coloque -los em locais específicos em um Planilha do Excel.
  • Idealmente, permitiria que eu fornecesse uma planilha modelo, com strings representando os locais para os quais os dados serão enviados.
  • A planilha terá várias guias e gostaria de definir dados em várias guias.
  • Cada tarefa recebe uma nova planilha em seu próprio arquivo.

Fico feliz em escrever uma função para fazer isso, mas não tenho familiaridade com quaisquer linguagens ou truques de programação de macros da MS. Eu posso facilmente visualizar o pseudocódigo que eu quero, só não sei se existem APIs por aí que farão o que eu quero.

Alguém tem um pensamento sobre se o que eu quero é possível, e se é, como melhor abordá-lo. Por favor, inclua referências a recursos de aprendizagem, se possível.

    
por bethlakshmi 19.11.2009 / 16:22

1 resposta

1

Sim, isso é possível, mas talvez muito para alguém novo em programação de macro. A complexidade é aumentada um pouco porque você está tentando trabalhar com o Excel e o projeto ao mesmo tempo - mas é tudo completamente capaz de fazer.

Não existem APIs que já o envolvam, mas o MS Office tem um muito rico Modelo de Objeto de Documento . Um dos melhores recursos que você tem é a sua chave 'F1'. Tente gravar o que você deseja fazer em etapas muito pequenas e modifique o código para torná-lo apropriadamente genérico. O gravador pode ajudá-lo a descobrir os objetos, métodos e propriedades que você precisará para se tornar familiar.

O principal objeto de laborioso no Project é o objeto Tarefa . No Excel, é o objeto Intervalo . Você precisará se tornar familiar com ambos para fazer o que quiser. Um esboço:

  1. Comece com suas tarefas selecionadas no projeto
  2. Para cada tarefa na sua seleção:
    uma. Criar uma nova pasta de trabalho
    b. Obtenha os valores desejados do projeto
    c. escrevê-los para o intervalo apropriado no excel

Eu estou um pouco confuso na parte do modelo da sua pergunta, então não se preocupe com isso no exemplo abaixo, mas você pode definir uma coisa chamada Intervalo Nomeado no excel. Então, esses nomes podem viver em seu modelo, você pode até mesmo reutilizar o mesmo nome em várias planilhas (abas) se quiser e usar esses nomes para definir onde gravar seus dados de taks. Por exemplo, eu escrevi o id da tarefa para Range("A2") , mas também poderia ter sido Range("Project_ID")

Além disso, recomendo dividir isso em várias funções, uma para cada etapa do esboço. Aqui está um ponto de partida básico muito muito . Para usar este exemplo, você precisará criar uma referência para as definições de objetos do Excel no Project. Abra o IDE do VBA do projeto e selecione Ferramentas - > Referências . Encontre a entrada Biblioteca de Objetos do Microsoft Excel XX.0 e marque a caixa de seleção. 'XX' é sua versão do excel. O meu é 10, o seu pode ser diferente. Qualquer um usando isso teria que fazer a mesma seleção.

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
    
por 19.11.2009 / 16:45