Análise de dados

ARRAY_CONSTRAIN + ARRAYFORMULA no Google Sheets

ModelMonkey11 de julho de 20267 min de leitura

Sintaxe: =ARRAY_CONSTRAIN(array_ou_intervalo, num_linhas, num_colunas)

É tudo que a função faz. O poder vem do que você coloca dentro dela.

Por que uma ARRAYFORMULA sem limite é um risco para o modelo

ARRAYFORMULA retorna tantas linhas quanto os dados de origem têm. Quando a origem é uma aba de lançamentos brutos com 4.200 linhas neste trimestre e 3.800 no anterior, o tamanho da saída oscila. Qualquer fórmula que referencie um intervalo fixo logo abaixo, por exemplo =SUM(Resumo!B2:B9) ou um intervalo nomeado ancorado em 8 linhas, quebra no momento em que o array transborda o limite esperado.

Em um modelo de três demonstrativos, isso importa. Sua aba de FCFF referencia o bloco de despesas operacionais da DRE. Se esse bloco for uma ARRAYFORMULA que cresce sem controle cada vez que os dados de origem atualizam, o fluxo de caixa fecha em um mês e silenciosamente deixa de fechar no seguinte.

ARRAY_CONSTRAIN é o limitador. Envolva o array com ela e a saída permanece exatamente do tamanho que você especificou, independente do que os dados subjacentes façam.

Uso básico: limitando o resultado de um FILTER

Suponha que você esteja montando um resumo para o pacote do conselho que mostra os 5 centros de custo com maior gasto no 2T26, extraídos de uma aba de DRE bruta:

=ARRAY_CONSTRAIN(
  SORT(
    FILTER('DRE'!B:D, 'DRE'!A:A="2T26"),
    3, FALSE
  ),
  5, 3
)

A fórmula filtra as linhas do 2T26, ordena de forma decrescente pela terceira coluna (valor de gasto) e entrega o resultado para ARRAY_CONSTRAIN, que retorna exatamente 5 linhas e 3 colunas. Se o 2T26 tiver 47 centros de custo, você recebe 5. Se por algum motivo tiver apenas 3 (cisão societária no meio do ano, por exemplo), você recebe 3. ARRAY_CONSTRAIN nunca preenche com zeros nem lança erro quando a origem é menor do que o limite especificado. Ela simplesmente retorna o que existe.

Esse comportamento vale a pena conhecer. INDEX com um número de linha fora do intervalo retorna #REF!. ARRAY_CONSTRAIN com num_linhas maior do que o array simplesmente retorna o array inteiro. Muito mais seguro para entradas dinâmicas.

Combinando com ARRAYFORMULA para colunas calculadas

O padrão mais comum em modelos financeiros é usar ARRAYFORMULA para derivar uma coluna calculada e depois limitar a saída ao número exato de linhas que o modelo espera.

Veja um cálculo de margem de contribuição por SKU, restrito a 12 linhas para um bloco de resumo fixo:

=ARRAY_CONSTRAIN(
  ARRAYFORMULA(
    SUMIFS('Receita'!D:D, 'Receita'!B:B, 'Cadastro SKU'!A2:A, 'Receita'!C:C, Premissas!$B$3)
    - SUMIFS('CMV'!D:D, 'CMV'!B:B, 'Cadastro SKU'!A2:A, 'CMV'!C:C, Premissas!$B$3)
  ),
  12, 1
)

A fórmula calcula a margem de contribuição por SKU para o período em Premissas!$B$3 (digamos, "2T26") e limita a saída a 12 linhas. Se o cadastro de SKUs tiver 18 produtos ativos, você ainda recebe 12, que é exatamente o bloco referenciado pela aba de Análise de Devoluções. Os outros 6 SKUs existem na origem, mas não afetam o bloco do modelo.

Sem ARRAY_CONSTRAIN, incluir 2 novos SKUs no cadastro no meio do trimestre empurraria a saída do array para a linha 14, direto sobre o que estiver abaixo.

A questão de desempenho

ARRAY_CONSTRAIN em si é computacionalmente barata. Ela é um recorte pós-processamento sobre um array já calculado, não uma passagem adicional de cálculo. Segundo a documentação do Google Sheets (julho de 2026), ela é classificada como função não volátil, ou seja, não recalcula a cada alteração na planilha como NOW() ou DESLOC() fazem. A parte cara é o que você coloca dentro dela.

Dito isso, envolver uma ARRAYFORMULA grande que chama SUMIFS em 50.000 linhas com ARRAY_CONSTRAIN não torna o SUMIFS mais rápido. Apenas limita quanto do resultado é renderizado. Se o tempo de recálculo for o seu gargalo, a solução está na fórmula interna, não no limitador.

Para volumes típicos de FP&A, entre 5.000 e 15.000 linhas de lançamentos e de 8 a 15 abas vinculadas, a combinação recalcula em menos de 3 segundos nos testes realizados. Modelos com mais de 200.000 linhas começam a apresentar tempos de recálculo de 8 a 12 segundos independentemente de ARRAY_CONSTRAIN estar envolvida.

ARRAY_CONSTRAIN vs. INDEX para recortar arrays

Ambas podem limitar as linhas de um array. A diferença está no comportamento na fronteira.

CenárioARRAY_CONSTRAININDEX
Origem tem mais linhas que o limiteRetorna as primeiras N linhasRetorna as primeiras N linhas
Origem tem menos linhas que o limiteRetorna todas as linhas (sem erro)Retorna #REF!
Origem está vaziaRetorna vazioRetorna #REF!
Complexidade de sintaxeMenorMaior

Para origens dinâmicas em que a contagem de linhas pode cair abaixo do limite esperado, como modelos de runway em que os headcounts mudam ou catálogos de SKUs com produtos descontinuados, ARRAY_CONSTRAIN é mais segura. INDEX é mais indicada quando você precisa especificamente garantir que N linhas existam, porque um #REF! vai expor a lacuna nos dados em vez de escondê-la silenciosamente.

Equivalente no Excel

ARRAY_CONSTRAIN não existe no Excel. O equivalente desde a atualização de arrays dinâmicos do Microsoft 365 em 2022 é TAKE():

=TAKE(SORT(FILTER(Receita[Valor], Receita[Período]="2T26"), 1, -1), 5)

TAKE aceita valores negativos para puxar do final de um array, o que ARRAY_CONSTRAIN não faz sem um SORT prévio. Se o seu modelo precisa funcionar tanto no Sheets quanto no Excel, esse é um dos pontos de atenção mais importantes a registrar. As funções são parecidas, mas não intercambiáveis, e a versão do Sheets existe há alguns anos a mais do que a do Excel.

Onde isso aparece de verdade nos modelos

Os casos de uso de maior valor que tenho visto:

Resumos para o conselho. Um bloco fixo de 10 linhas com "Top 10 Clientes por Receita" que sempre permanece com 10 linhas mesmo quando os dados do CRM têm 340 clientes. O bloco é referenciado pelo template da apresentação e não pode mudar de tamanho.

Tabelas de sensibilidade. Uma ARRAYFORMULA calculando TIR em 8 cenários de alavancagem, limitada a 8x1. Os rótulos dos cenários estão fixos na coluna A e o bloco da fórmula precisa corresponder exatamente.

Exibições de períodos contínuos. Um fluxo de caixa de 13 semanas que sempre mostra exatamente 13 colunas, independente de quantas semanas de realizado existem na aba de origem.

Em cada caso, ARRAY_CONSTRAIN faz exatamente uma coisa: garante que uma fórmula dinâmica produza uma saída de tamanho previsível. Essa previsibilidade é o que permite ao restante do modelo referenciá-la com segurança.

Perguntas frequentes

ARRAY_CONSTRAIN funciona com qualquer tipo de array? Sim. Ela aceita intervalos de células, resultados de funções como FILTER, SORT e UNIQUE, e arrays gerados por ARRAYFORMULA. O único requisito é que a entrada seja um array bidimensional ou unidimensional, não um valor escalar.

O que acontece se eu especificar mais linhas do que o array tem? ARRAY_CONSTRAIN retorna todas as linhas disponíveis sem lançar erro. Esse comportamento diferencia ela de INDEX, que retorna #REF! na mesma situação.

Posso usar ARRAY_CONSTRAIN para limitar colunas também? Sim. O terceiro argumento controla o número de colunas. =ARRAY_CONSTRAIN(A1:Z100, 10, 3) retorna as primeiras 10 linhas e as primeiras 3 colunas do intervalo.

ARRAY_CONSTRAIN é volátil? Não. Ela não recalcula a cada mudança na planilha. O recálculo ocorre apenas quando os dados de origem mudam, o que a torna adequada para modelos com muitas abas vinculadas.

Existe uma versão dessa função no Excel? Não diretamente. O equivalente mais próximo no Microsoft 365 é TAKE(), disponível desde a atualização de arrays dinâmicos de 2022. As duas funções têm comportamentos ligeiramente diferentes, especialmente em relação a arrays menores que o limite especificado.

Escolha um plano do ModelMonkey - escreve e atualiza fórmulas como ARRAY_CONSTRAIN e ARRAYFORMULA diretamente dentro do Google Sheets, sem edição manual de fórmulas aninhadas.