Excel Intermédio
Fórmulas, Referências e Tabelas Dinâmicas
Curso prático orientado para gestão de projetos e obra — exemplos reais com dados de controlo de custos, prazos e equipas.
Referência
PROCV, ÍNDICE+CORRESP, PROCX
Lógica
SE, SES, E, OU, SEERRO
Contagem
CONTAR, CONTARA, CONTAR.SE, CONTAR.SES
Soma Condicional
SOMASE, SOMASES
Texto
ESQUERDA, DIREITA, MED, CONCATENAR, TEXTO
Datas
HOJE, DIAS, DATEDIF, DIAS.ÚTEIS, FIMMÊS
Fórmulas Mistas
Combinações práticas e cenários reais
Tabelas Dinâmicas
Análise rápida de dados de obra
📋 Estrutura de dados de referência — usada nos exemplos
▾Todos os exemplos deste curso usam uma estrutura de dados típica de uma empresa de fiscalização/gestão de obra:
| Folha | Conteúdo | Colunas exemplo |
|---|---|---|
| Obras | Tabela de obras em curso | Código, Nome, Dono de Obra, Responsável, Estado, Prazo, Contrato (€) |
| Tarefas | Tarefas por obra | Código Obra, Tarefa, Responsável, Data Início, Data Fim Prevista, Data Fim Real, % Conclui |
| Custos | Lançamentos de custos | Data, Código Obra, Categoria, Descrição, Valor, Aprovado |
| Equipa | Tabela de colaboradores | ID, Nome, Cargo, Custo/Hora, Disponível |
PROCV — Procura Vertical
Procura um valor na primeira coluna de um intervalo e devolve um valor de outra coluna na mesma linha.
Sintaxe
▾| Argumento | Tipo | Descrição |
|---|---|---|
| valor_proc | Obrigatório | O valor a procurar — célula, texto ou número |
| matriz_tabela | Obrigatório | O intervalo onde procurar — a 1ª coluna é onde procura |
| núm_índice_col | Obrigatório | Nº da coluna a devolver (1 = primeira coluna da matriz) |
| correspon_intervalo | Opcional | 0 ou FALSO = correspondência exata (quase sempre o correto) |
Exemplos práticos — contexto obra
▾Na folha Tarefas, célula A2 tem o código OBR-042. Quero buscar o nome da obra da folha Obras.
=PROCV(A2; Obras!$A:$F; 2; 0)
=PROCV(C5; Equipa!$B:$D; 3; 0)
C5 = nome do técnico; coluna 3 da tabela Equipa = Custo/Hora
Quando transformas o intervalo em Tabela Excel (Ctrl+T), podes referenciar pelo nome:
=PROCV(A2; tbObras; 3; 0)
tbObras = nome da tabela Excel; muito mais legível e robusto
- Só procura da esquerda para a direita — não consegue devolver colunas à esquerda do valor procurado
- Devolve apenas o primeiro resultado encontrado
- É sensível à posição da coluna — se inserires colunas na tabela, o índice muda
- Alternativa mais robusta: ÍNDICE + CORRESP ou PROCX
Erros frequentes do PROCV
▾| Erro | Causa | Solução |
|---|---|---|
| #N/D | Valor não encontrado na tabela | Verificar espaços extra; usar SEERRO; confirmar tipos de dados |
| #REF! | Índice de coluna maior que o nº de colunas da matriz | Contar colunas corretamente; usar tabela nomeada |
| Resultado errado | Correspon_intervalo = VERDADEIRO e tabela não ordenada | Usar sempre 0 ou FALSO |
| Resultado errado | Número armazenado como texto (ou vice-versa) | Converter com VALOR() ou formatar células |
ÍNDICE + CORRESP
Combinação mais poderosa e flexível que o PROCV — procura em qualquer direção e não depende da posição das colunas.
Como funciona a combinação
▾CORRESP devolve a posição (nº de linha/coluna) de um valor num intervalo.
ÍNDICE devolve o valor numa posição específica de um intervalo.
=ÍNDICE(matriz; núm_linha; [núm_coluna])
Exemplos práticos
▾=ÍNDICE(Obras!$F:$F; CORRESP(A2; Obras!$B:$B; 0))
Obras!$F:$F = coluna Contrato; Obras!$B:$B = coluna Nome da Obra
A2 = nome da obra a procurar
A coluna Código está à direita do Nome — impossível com PROCV. Com ÍNDICE+CORRESP é trivial:
=ÍNDICE(Obras!$A:$A; CORRESP(D2; Obras!$B:$B; 0))
Devolve o Código (col A) procurando pelo Nome (col B)
D2 = nome da obra → devolve o código correspondente
Buscar o custo de uma categoria específica para uma obra específica, numa tabela cruzada:
=ÍNDICE($B$2:$G$20;
CORRESP($A24; $A$2:$A$20; 0);
CORRESP(B$23; $B$1:$G$1; 0))
A24 = obra a procurar (linha)
B23 = categoria a procurar (coluna)
Devolve o valor no cruzamento
PROCV vs ÍNDICE+CORRESP
▾| Critério | PROCV | ÍNDICE+CORRESP |
|---|---|---|
| Direção de procura | Só esquerda→direita | Qualquer direção |
| Robustez ao inserir colunas | Quebra o índice | Não afeta |
| Velocidade | Ligeiramente mais rápido | Mais lento em tabelas enormes |
| Facilidade de leitura | Mais simples | Mais verboso |
| Dupla correspondência | Não | Sim |
| Recomendação | Procuras simples | Procuras complexas ou críticas |
PROCX — O substituto moderno
Disponível no Excel 365 / Excel 2021. Une as vantagens do PROCV e ÍNDICE+CORRESP numa função mais simples e poderosa.
Sintaxe
▾Exemplos práticos
▾=PROCX(A2; Obras!$A:$A; Obras!$B:$B; "Obra não encontrada")
Procura A2 na coluna A de Obras, devolve coluna B
Se não encontrar, mostra "Obra não encontrada" em vez de #N/D
=PROCX(A2; Obras!$A:$A; Obras!$B:$F; "")
Devolve as colunas B a F (Nome, Dono, Responsável, Estado, Prazo)
de uma só vez — derrama para as colunas seguintes automaticamente
=PROCX(D2; Custos!$B:$B; Custos!$E:$E; ""; 0; -1)
Devolve o ÚLTIMO custo lançado para a obra D2
Modo -1 = procura do fim para o início
SE e SE Aninhados
A função mais usada no Excel — avalia uma condição e devolve um valor para VERDADEIRO e outro para FALSO.
Sintaxe e variações
▾| Operadores de comparação | Significado | Exemplo |
|---|---|---|
| = | Igual a | A2="Concluída" |
| <> | Diferente de | B2<>"" |
| > / < | Maior / Menor que | C2>HOJE() |
| >= / <= | Maior ou igual / Menor ou igual | D2>=0,9 |
Exemplos práticos
▾=SE(F2>HOJE(); "Em Prazo"; "Atrasada")
F2 = data fim prevista; se for futura → Em Prazo, senão → Atrasada
=SE(G2=""; "Em Curso";
SE(G2<=F2; "Concluída s/ Desvio";
"Concluída c/ Desvio"))
G2 = data fim real; F2 = data fim prevista
Se G2 vazio → em curso; se G2 <= F2 → sem desvio; senão → com desvio
=SE(H2=1; "🟢 Concluída";
SE(H2>=0.75; "🟡 Avançada";
SE(H2>=0.25; "🟠 Em Curso";
"🔴 Inicial")))
H2 = % de conclusão (valor entre 0 e 1)
SES, E e OU
Alternativas mais legíveis ao SE aninhado e para combinar múltiplas condições.
SES — múltiplas condições sem aninhamento
▾=SES(H2=1; "🟢 Concluída";
H2>=0.75; "🟡 Avançada";
H2>=0.25; "🟠 Em Curso";
H2<0.25; "🔴 Inicial")
Muito mais legível que os SE aninhados
E e OU — combinar condições
▾| Função | Resultado VERDADEIRO quando |
|---|---|
| E(cond1; cond2; ...) | TODAS as condições são verdadeiras |
| OU(cond1; cond2; ...) | PELO MENOS UMA condição é verdadeira |
=SE(E(F2<HOJE(); I2="Alta");
"🚨 CRÍTICA"; "Normal")
F2 = prazo; I2 = prioridade
Só é crítica se estiver atrasada E tiver prioridade Alta
=SE(OU(F2<HOJE();
HOJE()-E2>30);
"Rever"; "OK")
E2 = data de início; se passou o prazo OU está aberta há mais de 30 dias
SEERRO e SENÃO
Gerir erros elegantemente — evitar que #N/D ou #VALOR! apareçam no relatório.
SEERRO
▾=SEERRO(PROCV(A2; Obras!$A:$F; 2; 0); "Não encontrado")
Se PROCV falhar (obra não existe) → mostra "Não encontrado"
Em vez de mostrar #N/D no relatório
=SEERRO(ÍNDICE(Equipa!$D:$D; CORRESP(C2; Equipa!$B:$B; 0)); "")
Se não encontrar o técnico → célula fica em branco, não mostra erro
SENÃO — tratar apenas #N/D
▾SEERRO captura qualquer erro. SENÃO captura apenas #N/D — útil quando queres que outros erros como #DIV/0! sejam visíveis.
=SENÃO(PROCV(A2; Obras!$A:$F; 2; 0); "—")
Só trata #N/D; outros erros continuam visíveis (bom para debug)
CONTAR, CONTARA, CONTAR.VAZIO
Funções base de contagem — antes de usar CONTAR.SE, domina estas.
As 3 funções base
▾| Função | Conta | Exemplo |
|---|---|---|
| CONTAR() | Apenas células com números | =CONTAR(Custos!E:E) |
| CONTARA() | Células não vazias (qualquer tipo) | =CONTARA(Tarefas!A:A)-1 |
| CONTAR.VAZIO() | Células vazias | =CONTAR.VAZIO(Tarefas!G:G) |
Nº total de tarefas registadas (descontar cabeçalho)
=CONTARA(Tarefas!A:A)-1
Nº de tarefas ainda sem data de conclusão real (em aberto)
=CONTAR.VAZIO(Tarefas!G:G)-1
Nº de lançamentos de custo com valor (numérico)
=CONTAR(Custos!E:E)
CONTAR.SE e CONTAR.SES
Contagem condicional — uma das ferramentas mais poderosas para análise de dados de obra.
Sintaxes
▾=CONTAR.SES(interv_critério1; critério1; [interv_critério2]; [critério2]; ...)
Exemplos práticos
▾ Nº de obras no estado "Em Curso"
=CONTAR.SE(Obras!D:D; "Em Curso")
Nº de obras do responsável em A2
=CONTAR.SE(Obras!C:C; A2)
Nº de custos superiores a 5000€
=CONTAR.SE(Custos!E:E; ">5000")
Nº de tarefas cujo nome contém "betonagem" (curingas)
=CONTAR.SE(Tarefas!B:B; "*betonagem*")
Nº de tarefas atrasadas na obra OBR-042
=CONTAR.SES(Tarefas!A:A; "OBR-042";
Tarefas!F:F; "<"&HOJE();
Tarefas!G:G; "")
Cond 1: obra = OBR-042
Cond 2: data fim prevista já passou
Cond 3: data fim real está vazia (ainda não concluída)
Nº de tarefas do técnico João em obras "Em Curso"
=CONTAR.SES(Tarefas!C:C; "João Silva";
Obras!D:D; "Em Curso")
Nº de custos aprovados em Março 2025
=CONTAR.SES(Custos!F:F; "Sim";
Custos!A:A; ">=01/03/2025";
Custos!A:A; "<=31/03/2025")
SOMASE e SOMASES
Somar apenas os valores que cumprem critérios — essencial para análise de custos e orçamentos de obra.
Sintaxes — ATENÇÃO à ordem dos argumentos
▾=SOMASES(intervalo_soma; interv_critério1; critério1; ...)
Exemplos práticos
▾ Total de custos da obra OBR-042
=SOMASE(Custos!B:B; "OBR-042"; Custos!E:E)
Total de custos com valor > 1000€
=SOMASE(Custos!E:E; ">1000"; Custos!E:E)
Total de custos da categoria "Mão de Obra"
=SOMASE(Custos!C:C; "Mão de Obra"; Custos!E:E)
Total de custos aprovados da obra OBR-042 em "Materiais"
=SOMASES(Custos!E:E;
Custos!B:B; "OBR-042";
Custos!C:C; "Materiais";
Custos!F:F; "Sim")
Total de custos do 1º trimestre 2025 para obras em curso
=SOMASES(Custos!E:E;
Custos!A:A; ">=01/01/2025";
Custos!A:A; "<=31/03/2025";
Custos!F:F; "Sim")
Custo total por obra (referência de célula em vez de texto fixo)
=SOMASES(Custos!E:E; Custos!B:B; $A2)
$A2 = código da obra; copia para baixo para cada obra
Desvio = realizado - previsto, para a obra em A2
=SOMASES(Custos!E:E; Custos!B:B; A2)
- PROCV(A2; Obras!$A:$G; 7; 0)
Se positivo → obra a custar mais que o previsto
Funções de Texto
Manipular, extrair, combinar e formatar texto — muito útil para tratar códigos de obra, referências e relatórios.
Funções essenciais de texto
▾| Função | O que faz | Exemplo |
|---|---|---|
| ESQUERDA(texto;n) | Extrai n caracteres do início | =ESQUERDA(A2;3) → "OBR" |
| DIREITA(texto;n) | Extrai n caracteres do fim | =DIREITA(A2;3) → "042" |
| MED(texto;início;n) | Extrai n caracteres a partir de posição | =MED(A2;5;3) → "042" |
| NÚM.CARACT(texto) | Nº de caracteres | =NÚM.CARACT("OBR-042") → 7 |
| LOCALIZAR(proc;texto) | Posição de um texto noutro (não sensível) | =LOCALIZAR("-";A2) → 4 |
| LOCALIZAR.B | Sensível a maiúsculas/minúsculas | – |
| SUBSTITUIR(texto;antigo;novo) | Substitui texto | =SUBSTITUIR(A2;"-";"/") |
| COMPACTAR(texto) | Remove espaços extra | =COMPACTAR(A2) |
| MAIÚSCULAS / MINÚSCULAS | Converter capitalização | =MAIÚSCULAS("obra") → "OBRA" |
| TEXTO(valor;formato) | Formata número/data como texto | =TEXTO(B2;"€ #.##0,00") |
| VALOR(texto) | Converte texto em número | =VALOR("1234") → 1234 |
| UNIRTEXTO(sep;ignorar;textos) | Concatena com separador, opção ignorar vazias | =UNIRTEXTO("; ";VERDADEIRO;A2:A10) |
Exemplos práticos — contexto obra
▾ Prefixo (antes do 1º traço)
=ESQUERDA(A2; LOCALIZAR("-"; A2)-1)
→ "OBR"
Nº de obra (entre os dois traços)
=MED(A2; LOCALIZAR("-";A2)+1; 3)
→ "042"
Tipo (após o 2º traço)
=DIREITA(A2; NÚM.CARACT(A2)-LOCALIZAR("-";A2;LOCALIZAR("-";A2)+1))
→ "FISC"
"REL-OBR042-2025/04" a partir de dados separados
="REL-"&SUBSTITUIR(A2;"-";"")&"-"&TEXTO(HOJE();"AAAA/MM")
A2 = "OBR-042"; resultado: "REL-OBR042-2025/04"
="Custo total: "&TEXTO(SOMASE(Custos!B:B;A2;Custos!E:E);"#.##0,00 €")
→ "Custo total: 47.820,50 €"
Funções de Data
Calcular prazos, atrasos, dias úteis e períodos — fundamentais no controlo de obra.
Funções de data essenciais
▾| Função | O que devolve | Exemplo |
|---|---|---|
| HOJE() | Data atual (atualiza automaticamente) | =HOJE() |
| AGORA() | Data e hora atuais | =AGORA() |
| DIA(data) / MÊS(data) / ANO(data) | Extrai componente da data | =ANO(A2) → 2025 |
| DATA(ano;mês;dia) | Cria uma data a partir de componentes | =DATA(2025;4;30) |
| DIAS(data_fim;data_início) | Nº de dias entre duas datas | =DIAS(F2;E2) |
| DATEDIF(início;fim;unidade) | Diferença em D, M, Y, MD, YM, YD | =DATEDIF(E2;F2;"M") → meses |
| DIAS.ÚTEIS(início;fim;[feriados]) | Nº de dias úteis (excl. fins de semana) | =DIAS.ÚTEIS(E2;F2) |
| DIAS.ÚTEIS.INTL(...) | Como DIAS.ÚTEIS mas permite definir dias de descanso | =DIAS.ÚTEIS.INTL(E2;F2;1) |
| DIA.ÚTIL(data_início;dias;[feriados]) | Devolve data após N dias úteis | =DIA.ÚTIL(HOJE();10) |
| FIMMÊS(data;meses) | Último dia do mês, N meses depois | =FIMMÊS(HOJE();0) → fim do mês atual |
| DIA.SEMANA(data;tipo) | Nº do dia da semana (2 = Seg=1 a Dom=7) | =DIA.SEMANA(HOJE();2) |
| NÚMSEMANA(data;tipo) | Nº da semana do ano | =NÚMSEMANA(HOJE();21) |
Exemplos práticos — controlo de prazos em obra
▾=SE(HOJE()>F2; HOJE()-F2; 0)
F2 = data fim prevista; se já passou → dias de atraso; senão → 0
Apenas dias úteis em atraso
=SE(HOJE()>F2; DIAS.ÚTEIS(F2; HOJE()); 0)
=DIAS.ÚTEIS(HOJE(); F2)
F2 = data fim prevista; resultado negativo = já passou
=SEERRO(DATEDIF(E2; G2; "D")/7; "")
E2 = início; G2 = fim real; divide por 7 para semanas
=DIA.ÚTIL(HOJE(); B2)
B2 = nº de dias úteis a acrescentar; devolve a data correspondente
Com tabela de feriados nacionais
=DIA.ÚTIL(HOJE(); B2; Feriados!$A:$A)
=TEXTO(A2; "AAAA-MM")
Transforma a data em "2025-04" — facilita agrupamento
Semana do ano
="S"&TEXTO(NÚMSEMANA(A2;21);"00")&"-"&ANO(A2)
→ "S14-2025" (semana ISO)
🔀 Fórmulas Mistas
Combinações reais das funções anteriores — os cenários mais úteis no dia a dia de obra.
=SE(
(SOMASES(Custos!E:E;Custos!B:B;A2)
/ SEERRO(PROCV(A2;Obras!$A:$G;7;0);1)) > 0.9;
"🔴 Alerta";
"✅ OK")=SEERRO(
PROCV(A2;Tarefas!$A:$C;3;0)
&" | "
&SE(E(Tarefas!G2="";Tarefas!F2<HOJE());
"⚠️ Atraso: "&DIAS.ÚTEIS(Tarefas!F2;HOJE())&"du";
SE(Tarefas!G2<>"";"✅ Concluída";"▶ Em curso"));
"—")