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!
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.
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.