Avanço Previsto no MS Project: como inserir a fórmula, passo a passo

Por que isso não vem pronto

O MS Project traz os campos % Concluída, % Trabalho Concluída e % Física Concluída — todos medem o que já foi realizado. Não existe, nativamente, uma coluna "Avanço Previsto" que responda à pergunta que todo gerente de obra faz na reunião mensal: "nesta data, quanto do projeto eu deveria ter concluído?"

Sem essa coluna não há como calcular o desvio de avanço (realizado − previsto), o indicador básico de controle de prazo. A boa notícia: o Project já guarda toda a informação necessária na linha de base; falta apenas montar um campo personalizado que a use.

Este artigo apresenta cinco opções, da mais simples à mais precisa, com os caminhos de menu e os campos a preencher em cada uma.


Pré-requisitos: sem isso, nenhuma opção funciona

Três configurações precisam estar corretas antes de qualquer fórmula. Se o resultado der zero em todas as linhas, quase sempre a causa está aqui.

1. Linha de base salva

Item Preenchimento
Caminho Guia Projeto → grupo Agenda → Definir Linha de Base → Definir Linha de Base
Campo "Definir linha de base" Linha de base (a original, não Linha de base 1..10)
Campo "Para" Projeto inteiro
Conferência Insira a coluna Duração da Linha de Base e verifique que não está vazia

Sem linha de base, Início da Linha de Base e Duração da Linha de Base ficam vazios e a fórmula devolve zero.

2. Data de status definida

Item Preenchimento
Caminho Guia Projeto → grupo Propriedades → Informações do Projeto
Campo "Data de status" A data-corte da medição (ex.: 31/07/2026). Não deixe em "ND"
Observação Com "ND", o Project usa a data atual em alguns cálculos e "ND" em outros — fonte clássica de inconsistência

Atualize esse campo a cada medição. É ele que define o "hoje" do cálculo.

3. Critério de ponderação decidido

Antes de escolher a fórmula, decida como o avanço é medido na sua obra:

  • Por duração — cada tarefa avança linearmente no tempo. Simples, mas assume que uma tarefa de 30 dias está 50% pronta no dia 15, o que raramente é verdade em serviços com mobilização pesada.
  • Por custo — o avanço acompanha o desembolso planejado. Reproduz a curva S real e é o critério contratual usual em medições físico-financeiras.
  • Por trabalho (homens-hora) — o avanço acompanha o esforço planejado. Adequado quando a mão de obra domina o escopo.

A Opção 1 usa duração; as Opções 2 e 3 usam custo e trabalho.


Opção 1 — Fórmula linear por duração

A mais rápida de implementar e suficiente para a maioria dos cronogramas de porte médio.

Caminho completo

  1. Guia Projeto → grupo Propriedades → Campos Personalizados
  2. No topo do diálogo:
    • Campo: Tarefa
    • Tipo: Número
  3. Na lista, selecione Número1
  4. Renomear... → digite Avanço Previsto (%) → OK
  5. Em Atributos personalizados, marque Fórmula... → monte a fórmula abaixo
  6. Em Cálculo para linhas de resumo de tarefa e de grupo, marque Usar fórmula
  7. Em Valores a serem exibidos, deixe Dados
  8. OK → OK

A fórmula

IIf([Duração da Linha de Base]=0;
    IIf([Custo da Linha de Base]=0 E [Trabalho da Linha de Base]=0; 0;
        IIf([Data de Status]>=[Término da Linha de Base]; 100; 0));
    IIf([Data de Status]>=[Término da Linha de Base]; 100;
    IIf([Data de Status]<=[Início da Linha de Base]; 0;
    100*ProjDateDiff([Início da Linha de Base];[Data de Status])/[Duração da Linha de Base])))

Se a sua instalação não aceitar o operador E, use And. O Project não traduz operadores lógicos de forma consistente entre versões — teste com And primeiro.

Como a fórmula funciona, ramo por ramo

Trecho O que faz
[Duração da Linha de Base]=0 Captura dois casos de uma vez: tarefas sem linha de base e marcos (duração zero)
[Custo da Linha de Base]=0 And [Trabalho da Linha de Base]=0 Distingue os dois: sem linha de base salva, tudo é zero → retorna 0. Um marco real tem data de linha de base válida e cai no ramo seguinte
[Data de Status]>=[Término da Linha de Base] → 100 Tarefa (ou marco) que já deveria ter terminado → 100% previsto
[Data de Status]<=[Início da Linha de Base] → 0 Tarefa que ainda não deveria ter começado → 0% previsto
ProjDateDiff(início; status) Tempo útil decorrido, em minutos, respeitando o calendário do projeto
/[Duração da Linha de Base] Divide pela duração planejada (também em minutos) — a razão é adimensional
100* Converte fração em percentual: campos do tipo Número não têm formato "%"

Repare que a ordem dos testes importa. Os dois testes de extremos vêm antes da divisão, o que garante que o resultado nunca ultrapasse 100 nem fique negativo, e que a divisão nunca ocorra com denominador zero.

Por que não usar ProjDateValue("ND") para testar campos vazios

É o padrão que mais circula na internet, mas depende do idioma da instalação ("NA" em inglês, "ND" em português) e falha silenciosamente quando a abreviação não bate. O teste por [Duração da Linha de Base]=0 é independente de idioma e cobre o mesmo caso.

Duas armadilhas de digitação

Não digite os nomes dos campos. Dentro do diálogo Fórmula, use o botão Campo → Data → Início da Linha de Base. Os nomes de campo são traduzidos conforme o idioma da instalação, e um nome em inglês numa instalação em português produz erro. Os nomes de função (IIf, ProjDateDiff) não mudam.

Confira o separador de argumentos. Instalações em português usam ponto e vírgula; em inglês, vírgula. Fórmula rejeitada sem motivo aparente costuma ser isso.

Inserir a coluna

Clique com o botão direito no cabeçalho de qualquer coluna → Inserir Coluna → digite Avanço Previsto (%).


Opção 2 — Ponderada por custo (COTA / BCWS) — a mais fiel

Tecnicamente superior. Em vez de assumir avanço linear, usa o COTA (Custo Orçado do Trabalho Agendado, BCWS em inglês), que o Project já distribui ao longo do tempo conforme a alocação real de recursos — ou seja, reproduz a curva S do cronograma.

Configuração prévia obrigatória

Item Preenchimento
Caminho Arquivo → Opções → Avançado → seção Opções de valor agregado para este projeto
"Método padrão de valor agregado da tarefa" % Concluída (ou % Física Concluída, se você mede fisicamente)
"Linha de base para cálculos de valor agregado" Linha de base — precisa ser a mesma que você salvou

A fórmula

Repita os passos 1 a 8 da Opção 1, usando Número2 renomeado para Avanço Previsto Custo (%):

IIf([Custo da Linha de Base]=0; 0; 100*[COTA]/[Custo da Linha de Base])

Insira [COTA] pelo botão Campo → categoria Custo → COTA. Se a sua instalação usar outra abreviação, ela aparecerá nessa lista.

Por que esta é melhor

  • Rola para cima corretamente. Em linhas de resumo, tanto o COTA quanto o Custo da Linha de Base são somas exatas das subtarefas.
  • Respeita a distribuição real do esforço. Uma tarefa com mobilização lenta no início tem COTA baixo nas primeiras semanas, refletindo a realidade.
  • É o critério contratual usual. Cronogramas físico-financeiros no Brasil normalmente são ponderados por valor.
  • Trata marcos naturalmente. Um marco com custo associado entra na conta pelo valor; sem custo, não distorce nada.

Requisito: o cronograma precisa ter custos ou recursos alocados. Cronograma só de datas tem Custo da Linha de Base zero e a fórmula retorna zero — nesse caso, use a Opção 1 ou 3.


Opção 3 — Ponderada por trabalho (homens-hora)

Existe uma limitação estrutural que vale conhecer: fórmulas de campo personalizado não acessam dados distribuídos no tempo (timephased). Existe o campo COTA, que é custo acumulado até a data de status, mas não existe um equivalente para trabalho.

Há dois caminhos legítimos:

Caminho A — Proxy por taxa uniforme (só fórmula)

  1. Aloque todos os recursos com a mesma taxa horária (ex.: R$ 1,00/h para todos)
  2. Salve a linha de base
  3. Use a fórmula da Opção 2

Com taxa uniforme, custo e trabalho ficam proporcionais e o COTA passa a medir exatamente o avanço por homens-hora.

Caminho B — VBA lendo o trabalho distribuído no tempo

É o caminho correto quando o cronograma já tem custos reais e você não pode falsear as taxas. Veja a Opção 5, trocando a constante de custo pela de trabalho.


Opção 4 — Sem fórmula: tabela Valor Agregado

Se você só precisa ver os números uma vez, sem criar campos:

Item Preenchimento
Caminho Guia Exibir → grupo Dados → Tabelas → Mais Tabelas...
Selecione Valor Agregado → Aplicar
Leia a coluna COTA — custo previsto acumulado até a data de status
Avanço previsto COTA ÷ Custo da Linha de Base

Vale também inserir IDP (Índice de Desempenho de Prazo, SPI) e VPR (Variação de Prazo, SV): IDP abaixo de 1,00 já indica atraso sem precisar de fórmula nenhuma.


Opção 5 — VBA, quando a fórmula não basta

Fórmulas têm um limite real: não enxergam dados distribuídos no tempo. Se você precisa do avanço previsto em uma data que não é a data de status atual — por exemplo, reconstruir a curva S mês a mês — só o VBA resolve.

Caminho: guia Desenvolvedor → Visual Basic. Se a guia não aparecer: Arquivo → Opções → Personalizar Faixa de Opções → marque Desenvolvedor. No editor: Inserir → Módulo, e cole o código.

Macro 1 — Avanço previsto em uma data qualquer

Option Explicit

Sub AvancoPrevistoNaData()
    Dim t As Task
    Dim tsv As TimeScaleValues
    Dim v As TimeScaleValue
    Dim sEntrada As String
    Dim dCorte As Date
    Dim cotaAcum As Double
    Dim baseTotal As Double

    sEntrada = InputBox("Data de corte:", "Avanço previsto", Format(Date, "Short Date"))
    If Len(Trim(sEntrada)) = 0 Then Exit Sub
    If Not IsDate(sEntrada) Then
        MsgBox "Data inválida.", vbExclamation
        Exit Sub
    End If
    dCorte = CDate(sEntrada)

    If dCorte < ActiveProject.ProjectStart Then
        MsgBox "Avanço previsto em " & Format(dCorte, "Short Date") & ": 0,0%", vbInformation
        Exit Sub
    End If

    For Each t In ActiveProject.Tasks
        If Not t Is Nothing Then
            If Not t.Summary Then
                If t.BaselineCost > 0 Then
                    baseTotal = baseTotal + t.BaselineCost
                    Set tsv = t.TimeScaleData(ActiveProject.ProjectStart, dCorte, _
                                              pjTaskTimescaledBaselineCost, pjTimescaleDays)
                    For Each v In tsv
                        If Not IsNull(v.Value) Then
                            If v.Value <> "" Then cotaAcum = cotaAcum + CDbl(v.Value)
                        End If
                    Next v
                End If
            End If
        End If
    Next t

    If baseTotal > 0 Then
        MsgBox "Avanço previsto em " & Format(dCorte, "Short Date") & ": " & _
               Format(cotaAcum / baseTotal, "0.0%"), vbInformation
    Else
        MsgBox "Nenhum custo de linha de base encontrado. " & _
               "Salve a linha de base com recursos ou custos alocados.", vbExclamation
    End If
End Sub

Para ponderar por trabalho em vez de custo, faça duas trocas:

  • pjTaskTimescaledBaselineCost → pjTaskTimescaledBaselineWork
  • t.BaselineCost → t.BaselineWork (nas duas ocorrências)

Macro 2 — Curva S prevista, mês a mês

Gera a série acumulada para colar no Excel. O resultado sai na janela Verificação Imediata (Ctrl+G no editor VBA).

Option Explicit

Sub CurvaSPrevistaMensal()
    Dim t As Task
    Dim tsv As TimeScaleValues
    Dim v As TimeScaleValue
    Dim periodo() As Double
    Dim i As Long, n As Long
    Dim baseTotal As Double, acum As Double
    Dim dIni As Date, dFim As Date

    dIni = ActiveProject.ProjectStart
    dFim = ActiveProject.ProjectFinish
    n = DateDiff("m", dIni, dFim) + 2
    ReDim periodo(1 To n)

    For Each t In ActiveProject.Tasks
        If Not t Is Nothing Then
            If Not t.Summary Then
                If t.BaselineCost > 0 Then
                    baseTotal = baseTotal + t.BaselineCost
                    Set tsv = t.TimeScaleData(dIni, dFim, _
                                              pjTaskTimescaledBaselineCost, pjTimescaleMonths)
                    i = 0
                    For Each v In tsv
                        i = i + 1
                        If i <= n Then
                            If Not IsNull(v.Value) Then
                                If v.Value <> "" Then periodo(i) = periodo(i) + CDbl(v.Value)
                            End If
                        End If
                    Next v
                End If
            End If
        End If
    Next t

    If baseTotal <= 0 Then
        MsgBox "Nenhum custo de linha de base encontrado.", vbExclamation
        Exit Sub
    End If

    Debug.Print "Mês" & vbTab & "COTA do mês" & vbTab & "COTA acumulado" & vbTab & "Avanço previsto"
    acum = 0
    For i = 1 To n
        acum = acum + periodo(i)
        Debug.Print Format(DateAdd("m", i - 1, dIni), "mmm/yy") & vbTab & _
                    Format(periodo(i), "0.00") & vbTab & _
                    Format(acum, "0.00") & vbTab & _
                    Format(acum / baseTotal, "0.0%")
    Next i
    MsgBox "Curva S gerada na janela Verificação Imediata (Ctrl+G).", vbInformation
End Sub

Detalhe importante: as duas macros passam a mesma janela de datas (dIni, dFim) para todas as tarefas. Isso garante que TimeScaleData devolva o mesmo número de períodos por tarefa, permitindo somá-los posição a posição.


Campo complementar: o desvio de avanço

O avanço previsto sozinho não decide nada. Crie Número5 como Desvio de Avanço (p.p.):

[% Concluída]-[Número1]

Valor negativo = atraso, em pontos percentuais. Depois, no mesmo diálogo Campos Personalizados, clique em Indicadores Gráficos e configure, na aba Linhas não resumo:

Teste Valor Imagem
é maior ou igual a 0 Círculo verde
é maior ou igual a -5 Círculo amarelo
é menor que -5 Círculo vermelho

A ordem importa: o Project avalia os testes de cima para baixo e para no primeiro que for verdadeiro.


Armadilhas comuns

Sintoma Causa provável Correção
Coluna toda zerada Linha de base não salva Projeto → Definir Linha de Base
Coluna zerada com linha de base salva Data de status em "ND" Projeto → Informações do Projeto
Fórmula rejeitada ao colar Separador errado (, vs ;), operador E/And, ou nome de campo em outro idioma Use o botão Campo para inserir os nomes
Valores acima de 100 Faltou o teste [Data de Status]>=[Término da Linha de Base] antes da divisão Reinsira a fórmula completa
Divisão por zero Marco (duração zero) sem o ramo de proteção Use a fórmula completa da Opção 1
Linhas de resumo vazias Cálculo de resumo em Nenhum Marque Usar fórmula no diálogo
COTA todo zerado Linha de base do valor agregado apontando para outra linha de base Arquivo → Opções → Avançado
Valor não atualiza Cálculo manual Arquivo → Opções → Cronograma → Calcular projeto = Automático, ou tecle F9

Como validar que ficou certo

  1. Coloque a data de status um dia antes do início do projeto → todas as linhas devem marcar 0%.
  2. Coloque a data de status um dia depois do término da linha de base → todas devem marcar 100%.
  3. Coloque a data de status exatamente no meio da linha de base de uma tarefa longa e simples → a Opção 1 deve marcar ~50%.
  4. Crie um marco de teste com linha de base e verifique que ele alterna de 0% para 100% na data certa.
  5. Compare o avanço previsto da linha de resumo do projeto com a curva S do seu cronograma físico-financeiro.

Caminhos de menu referentes ao MS Project 2016 até o Microsoft Project Online Desktop Client. Em versões anteriores a 2010, Campos Personalizados fica em Ferramentas → Personalizar → Campos.