VBA - Artigo 004 - O Objeto Range e o derivado Cells

Progredindo em VBA no Microsoft Excel


O objeto Range e o derivado Cells


O objeto Range se refere a um intervalo de células, que pode ter apenas uma célula ou milhares delas. De longe, este é o objeto que é mais utilizado na programação em VBA do Excel. É um objeto complexo, com dezenas de propriedades e métodos. Para quem não compreende esses termos, propriedades são características do objeto, que normalmente podem ser alteradas, enquanto métodos são ações que podem ser executadas com o objeto. Vejamos o exemplo de código abaixo:

Range("A1:C1").Merge
Range("A1").Value = "Tabela"

Merge é um método que mescla células. No exemplo está mesclando as células A1 a C1. Value, por sua vez, é uma propriedade. No exemplo está recebendo o valor "Tabelas". Portanto, se há muitos métodos e propriedades, há muitas possibilidades do que fazer.

Voltando ao objeto Range, há muitas formas de utilizá-lo, tudo depende da necessidade do momento. Vejamos alguns exemplos:

Range("A1:D10").Select
Range("A1", "D10").Select
Range("Matriz").Select
Range(Intervalo).Select

Os dois primeiros exemplos selecionam o intervalo de A1 a D10, mas o primeiro é muito mais comum, é mais prático. Mas é importante saber que podemos colocar dois elementos distintos dentro dos parênteses, saber disso ajuda a entender como usar variáveis junto aos intervalos. O terceiro exemplo seleciona um intervalo nomeado, de nome Matriz, enquanto o quarto exemplo traz uma variável chamada Intervalo, que deve estar no formato string e trazer um texto como "A1:D10".

O objeto Cells é derivado do objeto Range. A principal diferença é que se refere a uma única célula, não sendo possível selecionar intervalos com ele. Com esta definição fica bem claro quando se deve usar um e quando se deve usar o outro. A referência para a célula também é diferente, é necessário colocar linha e coluna nos argumentos. Por exemplo:

Cells(5, 2).Formula = "=Today()"

Esse código coloca uma fórmula na célula que fica na quinta linha e na segunda coluna, ou seja, célula B5. Pode parecer menos intuitivo desta forma para quem está acostumado com a forma de notação do Excel, mas na programação esta forma é bem melhor – com a prática você comprovará isso.

Como foi visto acima, o objeto Range pode ter dois argumentos, se referindo a duas células distintas. Elas são o início e o fim do intervalo. É possível colocar objetos Cells como argumentos, observe:

Range(Cells(2, 2), Cells(8, 5)). Clear

Esse código limpará o conteúdo das células B2 a E8. Talvez seria mais simples digitar "B2:E8", mas imagine que no lugar dos números tenhamos variáveis:

Range(Cells(Linha1, Coluna1), Cells(Linha2, Coluna2)).Clear

Deste jeito fica mais fácil entender a utilidade desta forma de combinar Range e Cells. Na hora de codificar essa será uma das formas que você mais verá.

Há outra forma muito interessante: o objeto Range contém uma propriedade chamada Cells. Isso significa que você pode referenciar uma célula dentro de um intervalo especificado. Isso é particularmente útil ao usar junto com intervalos nomeados. Suponha que você tenha um intervalo nomeado chamado Matriz, indo de E5 a J10 e você quer selecionar a terceira linha da segunda coluna. Isso é possível desta forma:

Informacao = Range("Dados").Cells(3, 2).Value

Desta maneira você consegue acessar a célula F7, que é o endereço da célula solicitada. Não importa se acrescentar colunas antes desse intervalo, você não precisará editar o código, pois o intervalo nomeado permanece se referindo ao mesmo grupo de células.

Perceba que com este conhecimento você pode acessar praticamente qualquer célula da planilha sem precisar alterar a seleção da célula ativa. Usar o método Select ou Activate é muito comum no início, quando se está aprendendo a programar no Excel. Porém, o ideal é tentar codificar de maneira que possamos acessar o conteúdo das células sem precisar alterar a célula ativa no momento. Temos basicamente três motivos:

– Alterar a seleção da célula envolve processamento adicional. Em muitos casos pode ser alguns milissegundos de economia, mas quando se processa uma quantidade muito grande de dados o tempo gasto pode ser de alguns minutos;
– O bom senso pede para deixar a célula ativa no mesmo ponto em que o usuário deixou, exceto quando é realmente necessário ir para uma certa posição da planilha;
– Pode acontecer algum erro no código não tratado devidamente e o usuário alterar a posição da célula ativa sem querer, enquanto olha abismado para a tela do editor VBA com o código. Daí ele continua o processo quando encontrar o botão certo e sabe-se lá o que vai acontecer com o restante do processamento.

Portanto, o ideal é que seus códigos evitem ao máximo alterar a posição da célula ativa. Isso pode parecer difícil no começo, mas com prática e insistência chega-se lá. Veja esta função que escrevi um dia:

Function LocalizarReferencia(ByVal Intervalo As Range, ByVal Valor As String) As String

    Dim Horizontal  As Long
    Dim Vertical    As Long

    For Horizontal = Intervalo.Cells(1, 1).Column To _
        Intervalo.Cells(1, Intervalo.Columns.Count).Column
        For Vertical = Intervalo.Cells(1, 1).Row To _
            Intervalo.Cells(Intervalo.Rows.Count, 1).Row
            If Cells(Vertical, Horizontal).Value = Valor Then
                LocalizarReferencia = Cells(Vertical, Horizontal).Address
                Exit Function
            End If
        Next
    Next

    LocalizarReferencia = "#N/D"

End Function

Essa função procura o valor informado dentro do intervalo informado e retorna o endereço da primeira ocorrência (ignorando eventuais outras ocorrências, pois o intervalo onde usei esta função foi usado tinha valores únicos). Encontrando um valor sairá da função imediatamente (Exit Function). Caso não for encontrado o valor e chegar até o fim da função, será devolvido "#N/D" (simulando o mesmo valor da função NÃO.DISP).

Perceba que essa função não seleciona nenhuma célula e varre todo o intervalo em busca do valor. Gaste alguns minutos analisando o código, executando passo a passo (com a tecla F8) e entendendo o funcionamento das estruturas de repetição. Compreenda o uso do Range.Cells e do uso dos atributos Column, Row e Count. Aprendendo a trabalhar desta forma você dificilmente precisará selecionar alguma célula nos futuros códigos.

Se você gosta de usar uma estrutura do tipo Do While até encontrar célula vazia, você pode usar um código como o exemplo abaixo:

Dim Linha As Integer
Linha = 2 ' Primeira linha com dados

Do While Cells(Linha, 1) <> ""

    ... ' Código do processamento

    Linha = Linha + 1
Loop

Essa estrutura não altera a seleção da célula ativa e evita problemas com cliques acidentais enquanto estiver debugando o código. Perceba que usando Cells não há necessidade de usar a propriedade Offset, como é muito comum com o objeto ActiveCell.

Como foi dito no começo do texto, há muitas propriedades e muitos métodos. Use o Pesquisador de Objetos do Editor de VBA (tecla de atalho F2) e observe todas as possibilidades. Você pode descobrir propriedades e métodos que podem facilitar ainda mais sua vida.

Boa prática com esses novos conhecimentos!


Pedro Martins

Formado em Tecnologia em Eletrônica Digital, já trabalhou como artefinalista, eletrotécnico, programador de CLP (para máquinas industriais) e analista de sistemas em sistema bancário, programando em COBOL.
Mexe com computadores e programação desde a segunda metade dos anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da disseminação do conhecimento.







Catálogo de aulas (NOVIDADE)

Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.


Postagem Anterior Próxima Postagem