Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Trabalhando com Intervalos | Trabalhando com Dados do Excel
VBA do Excel para Automação Empresarial

Trabalhando com Intervalos

Deslize para mostrar o menu

Seleção de Intervalos

Utilizado durante a exploração; em código de produção, evite .Select e prefira referenciar intervalos diretamente:

ws.Range("A1:I1").Select        ' fine for exploring
ws.Range("A1:I1").Font.Bold = True    ' better — skips Select entirely

Offset

Move uma referência relativa a si mesma — leia como (linhas para baixo, colunas para a direita), com números negativos movendo para cima ou para a esquerda:

Dim orderCell As Range
Set orderCell = ws.Range("A2")             ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value    ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value    ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value   ' one row up → the header, "Order ID"
Figura 3.3

Redimensionar

Altera quantas linhas ou colunas um intervalo cobre, mantendo fixa a sua célula superior esquerda:

Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9)    ' now covers A1:I1, the full header

Combine Offset e Resize para capturar "tudo abaixo do cabeçalho" sem saber a quantidade de linhas com antecedência:

Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header

Intervalos Nomeados

Atribua um nome em inglês simples a um intervalo para referenciá-lo em vez de usar o endereço:

ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count

Tarefa

  1. Começando em Range("A2") (ORD1001), utilize Offset para exibir o Produto e o Total do pedido duas linhas abaixo (ORD1003) — sem digitar "A4", "D4" ou "H4".
  2. Use CurrentRegion, Offset e Resize juntos para selecionar apenas as linhas de dados (sem o cabeçalho) e exibir quantas linhas esse intervalo contém.
  3. Crie um intervalo nomeado chamado OrdersData cobrindo o mesmo intervalo apenas de dados e confirme que é possível referenciá-lo pelo nome na Janela Imediata.
Dica
expand arrow

1. Usando Offset de A2 para alcançar ORD1003

  • Definir uma variável Range para A2 — esta é a célula âncora, exatamente como no exemplo trabalhado do capítulo.
  • "Duas linhas abaixo" e "mesma coluna" significa que o primeiro argumento de Offset (linhas) é 2 e o segundo (colunas) é 0 — para a coluna Product.
  • Total está em uma coluna diferente, mas na mesma linha — então apenas o número do deslocamento de coluna muda entre suas duas chamadas de Offset, não o de linha.
  • Conte as colunas a partir da posição de A2: Product está 3 colunas à direita de Order ID; Total está 7 colunas à direita.

2. Combinando CurrentRegion, Offset e Resize

  • CurrentRegion em A1 retorna toda a tabela, incluindo o cabeçalho.
  • Offset(1, 0) desloca todo esse bloco uma linha para baixo — suficiente para remover o cabeçalho do topo.
  • Resize precisa reduzir a contagem de linhas exatamente pela mesma quantidade que você deslocou, ou a borda inferior ultrapassará uma linha além dos dados reais.

3. Criando e testando um intervalo nomeado

  • Intervalos nomeados são adicionados através de ThisWorkbook.Names.Add, atribuindo um Name:= e um RefersTo:= — você pode reutilizar a mesma expressão de intervalo da dica 2 em vez de construí-la novamente do zero.
  • Para referenciá-lo depois, use Range("OrdersData") — o nome se torna uma string simples, não uma variável.
Solução
expand arrow
Sub NavigateWithoutHardcoding()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Offset from A2 to reach ORD1003 ---
    Dim orderCell As Range
    Set orderCell = ws.Range("A2")

    Debug.Print orderCell.Offset(2, 3).Value   ' Product
    Debug.Print orderCell.Offset(2, 7).Value   ' Total

    ' --- 2. CurrentRegion + Offset + Resize ---
    Dim dataRange As Range
    Set dataRange = ws.Range("A1").CurrentRegion
    Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)

    Debug.Print "Data rows: " & dataRange.Rows.Count

    ' --- 3. Named range ---
    ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub

Execute o Sub (F5) e, em seguida, na Janela Imediata (Ctrl+G) digite:

?Range("OrdersData").Rows.Count
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 3. Capítulo 3
some-alt