Neste artigo, pretendo explicar como elaborar um sistema de atualização de um cronograma com muitos envolvidos de forma semi-automática, sem necessitar de uma licença do Project Server, uma solução web ou qualquer software instalado nas máquinas dos “atualizadores” de cronograma, exceto o Excel.
Para executar este procedimento, você precisará de uma máquina com o Project, que será a máquina que emitirá e receberá as planilhas Excel que você enviará aos responsáveis para o preenchimento das mesmas. Neste texto, utilizarei a cor azul para escrever pedaços de código VB que devem ser colocados no Project.
Minha intenção não é colocar a solução completa ou pronta, mas o básico para que uma pessoa com conhecimento mínimo de gerenciamento de projetos e Visual Basic (VB) possa implementar a solução conforme suas próprias necessidades e desejos. Para isso, criei este roteiro com vários passos. Tenho o Project em inglês na minha máquina, e se alguém se disponibilizar a fazer a mesma coisa na versão em português, eu terei o maior prazer de manter as duas versões aqui :
Fase 1 – Configurando o sistema
Antes de começar, é preciso indicar ao Project aonde encontrar as bibliotecas do Excel. Vá para o editor de Visual Basic (alt+F11) e entre em “Tools / Ferramentas?” , “References / Referências?”. Ache uma linha com “Microsoft Excel XX Object Library”, marque a opção e clique em OK.

Fase 2 – Criação da exportação das planilhas
Passo 1: Criar um Filtro
Crie um filtro (filtrando qualquer coisa, o Project não deixa criar um filtro sem regras) com um nome que sempre será usado pelo código. Pode ser um filtro “Excel”, ou qualquer outro nome, mas esteja certo que você nunca utilizará este filtro para tarefas normais de controle do projeto.
Passo 2: Criar um mapa de exportação para o Excel
File, Save as (Arquivo, Salvar como) -> salve o seu projeto como uma planilha de Excel. Antes do arquivo ser criado, você entrará em um wizard que vai te ajudar a salvar os dados necessários para a planilha. Crie um mapa novo conforme o colocado abaixo (você pode colocar as informações adicionais que julgar necessário na planilha, eu só coloquei o básico do básico). Atenção para colocar no mapa o filtro que você criou no passo 1. Da mesma maneira que no passo anterior, salve o mapa com um nome que signifique que ele está reservado ao uso do Visual Basic.
Passo 3: Alterar o “Text 1” para ser o nome do “Responsável pela atualização”
Inserir o campo “Text 1” e formatá-lo para conter o nome do responsável pelo preenchimento. Esta exportação só faz sentido se tivermos mais de um responsável, pois senão estaríamos mandando o arquivo .mpp inteiro. J.
Passo 4: Criar o Visual Basic de exportação da planilha
Bom, aqui começamos com o código. A primeira parte do código é responsável por “varrer” todas as tarefas e identificar todos os “responsáveis por preenchimento” – ou todos os Text 1 diferentes. Fiz uma matriz Lider() que irá registrar todos os diferentes responsáveis.
Esta maneira é meio queixo-duro, pois vai verificando uma a uma se o valor já não está na matriz. Mas funciona…e afinal, eu sou engenheiro, e não programador. Se alguém tiver um algoritmo melhor, me avisa que eu substituo.
No final, você terá uma matriz chamada Lider com n valores, sendo n o número de pessoas responsáveis pelo preenchimento (text 1) e cada valor da matriz sendo o nome.
Dim K, T, X As Long
Dim Lider() As String
Dim Vale As Boolean
ReDim Lider(0)
Lider(0) = ActiveProject.Tasks(1).Text1 A primeira é o nome do primeiro responsável
For T = 1 To ActiveProject.Tasks.Count Executa para todas as tarefas do cronograma ativo
Vale = False
For X = 0 To UBound(Lider)
If ActiveProject.Tasks(T).Text1 = Lider(X) Then
Vale = True
X = UBound(Lider)
End If
Next X
If Not Vale Then
ReDim Preserve Lider(UBound(Lider) + 1)
Lider(UBound(Lider)) = ActiveProject.Tasks(T).Text1
End If
Next T
Agora que sabemos quantos líderes existem, é preciso exportar as planilhas. Coloque no mesmo código VB:
Dim ExportName As String
For K = 0 To UBound(Lider) Para todos os líderes
ExportName = “C:\” & ActiveProject.Name & “-” & Lider(K) & “.xls” Dá nome a planilha que será salva
FilterApply “All Tasks” Retira o filtro atual
FilterEdit Name:=”Excel “, TaskFilter:=True, Create:=True, OverwriteExisting:=True, FieldName:=”Start”, Test:=”is less than or equal to”, Value:=CStr(Format(Now() + 7, “DD/MM/YYYY”)), ShowInMenu:=False, ShowSummaryTasks:=False Substituir o nome do filtro pelo nome que você colocou no passo 2; Esta linha apaga o filtro existente e cria uma regra de mostrar todas as tarefas iniciadas no dia agora+7 (próxima semana).
FilterEdit Name:=”Excel “, TaskFilter:=True, FieldName:=”", NewFieldName:=”% Complete”, Test:=”does not equal”, Value:=”100%”, Operation:=”And”, ShowSummaryTasks:=False Apenas tarefas não concluídas
FilterEdit Name:=”Excel “, TaskFilter:=True, FieldName:=”", NewFieldName:=”Text1″, Test:=”equals”, Value:=Lider(K), Operation:=”And”, ShowSummaryTasks:=True Do responsável Lider(k)
FilterEdit Name:=”Excel”, TaskFilter:=True, FieldName:=”", NewFieldName:=”ExternalTask”, Test:=”equals”, Value:=False, Operation:=”And”, ShowSummaryTasks:=True Monstrando as tarefas “sumário”
FilterApply Name:=”Excel” aplica o Filtro
FileSaveAs Name:=ExportName, FormatID:=”MSProject.XLS5″, map:=”Map 1″ Troque o nome do mapa para o mapa Desejado
Next K
Você pode, antes de finalizar o laço For/Next, colocar uma rotina para abrir a planilha e fazer algumas modificações de layout, cor e personalização que desejares. Assim as planilhas já saem prontas do forno! Também recomendo que as planilhas já saiam do Project bloqueadas da forma correta.
Fase 3 – Criação da importação
Uma vez que você tenha recebido as planilhas com os avanços atualizados, você irá querer importar as atualizações automaticamente. O código abaixo mostra como fazer isso.
O código escrito abaixo não tem tratamento de erros, como “o que fazer para atualizar uma tarefa que apagaram no Project” ou “como saber que uma tarefa estava ou não na planilha (pode ter sido apagada, ou criada posteriormente à exportação)”. Mas já é um início.
Dim Nome As String
Nome = ActiveProject.Name
ActiveProject.SaveAs ActiveProject.Path & “/” & ActiveProject.Name & “_backup em ” & Format(Now(), “yyyy mm dd hh mm”) & “.mpp” Faz um backup do Project JJJJ
Dim Planilha As Excel.Application
Set Planilha = New Excel.Application Abre uma instância do Excel e solicita para que você abra uma planilha (indique aonde está a planilha alterada)
Dim fd As FileDialog
Planilha.Visible = True
Set fd = Planilha.Application.FileDialog(msoFileDialogOpen)
fd.Show
Planilha.Workbooks.Open fd.SelectedItems.Item(1), False, False Abre a planilha
Dim T As Long
T = 2 Começa da segunda linha para ignorar o cabeçalho
With Planilha.ActiveSheet
While .Cells(T, 1) <> “” Corre toda a planilha Excel
If ((ActiveProject.Tasks.UniqueID(CLng(.Cells(T, 1))).Summary = False) And (ActiveProject.Tasks.UniqueID(CLng(.Cells(T, 1))).ExternalTask = False)) Then Ignora as tarefas “sumárias” (já que quem deve calcular isso é o Project) e “externas” – caso você tenha dependência de cronogramas externos, isto é de suma importância
ActiveProject.Tasks.UniqueID(CLng(.Cells(T, 1))).PercentComplete = CLng(.Cells(T, 3) * 100) Atualiza o andamento da tarefa. Como o valor percentual do Project é um inteiro de 1 a 100, você tem que multiplicar por 100. Levei horas para descobrir isso.
End If
T = T + 1 Próxima tarefa
Wend
Planilha.Quit
Set Planilha = Nothing
End With
ActiveProject.SaveAs ActiveProject.Path & “/” & Nome, pjMPP Sobreescreve o projeto original com as atualizações
Realmente espero que vocês consigam entender as mensagens que tentei passar. De qualquer maneira, estarei à disposição de vocês para críticas, comentários e sugestões.
Abraço,
Guilherme Silva, PMP.

(4.75 de 5)
(3 votos, média: 3.33 de 5)
5 responses so far ↓
1 Marcelo Cunha // out 9, 2008 at 9:50 pm
Prezado Guilherme
gostaria que você me explicasse melhor sobre este procedimento,pois encontrei dificuldade de fazer…Eu sou novo na àrea de planejamento e quero estar aprimorando meus conhecimentos neste àrea..
POde me explicar por e-mail?????
2 Alam Braga // ago 13, 2008 at 10:47 pm
Olá Guilherme a proposta é interessante sim. Inclusive me surgiu uma outra idéia para resolver um certo problema que tenho. Caso eu consiga coloco aqui a solução.
abraço e parabéns pela iniciativa.
3 Guilherme // ago 6, 2008 at 10:50 pm
George,
Te enviei um e-mail perguntando qual a dificuldade que estás encontrando. Me avisa se tu não recebeu.
Atenciosamente,
Guilherm
4 George // ago 2, 2008 at 9:41 pm
Gulherme,
Você pode disponibilizar esta planilha que você criou, pois estou tendo dificuldades em fazê-la.
Obrigado.
5 Antonio Carvalho // mai 11, 2008 at 6:31 pm
Prezado Guilherme,
Muito interessante e pretendo utilizar a tua criação na primeira oportunidade.
Obrigado e abraços.
Antonio Augusto C. de Carvalho
e-Plan
Leave a Comment