0164-Dica VBA: Objeto Range

Uma das modalidades mais comuns de macros são aquelas em modificamos o conteúdo ou propriedades de células, linhas e colunas.

Para tanto, nos referimos a intervalos de células através do objeto Range.

Vamos fazer alguns comentários sobre como otimizar a utilização deste objeto nos nossos códigos.

1. Evite utilizar a instrução Select.

Não é preciso selecionar um Range para modificá-lo.

Se gravarmos uma macro para colocar na cor vermelha a fonte da célula A1 de uma planilha chamada Teste, vamos obter algo parecido com isto aqui:

Sub ColorirCélulaV01()
    Sheets("Teste").Select
    Range("A1").Select
    With Selection.Font
        .ColorIndex = 3
    End With
End Sub

Observem que foi necessário selecionar a planilha Teste, em seguida selecionar a célula A1 e, para esta seleção, foi modificada a cor da fonte.

A versão a seguir realiza a mesma ação, sem necessidade das etapas intermediárias:

Sub ColorirCélulaV02()
    Sheets("Teste").Range("A1").Font.ColorIndex = 3
End Sub

Em outras palavras, basta apontar o objeto Range, indicar a propriedade ou método que será alterado e indicar qual o novo valor.

E a diferença é perceptível visualmente: ao rodar um código como o ColorirCélulaV01, veremos o Excel saltando entre planilhas e dentro da planilha pequenos “pulos” à medida que intervalos vão sendo selecionados e alterados. Isso consome recursos de memória e retarda a execução do código.

Tenha isso em mente na próxima vez que for montar uma macro desse tipo.

2. Escolha a forma mais adequada de referenciar um objeto Range.

Há 3 formas básicas de se referenciar um objeto Range, as quais são exemplificadas a seguir.

Sub Ref_Range01()
Sheets("Teste").[A1:A20].Font.ColorIndex = 3
End Sub
Sub Ref_Range02()
Sheets("Teste").Range("A1:A20").Font.ColorIndex = 3
End Sub
Sub Ref_Range03()
With Sheets("Teste")
.Range(.Cells(1, 1), .Cells(20, 1)).Font.ColorIndex = 3
End With
End Sub

Todas as 3 formas funcionam e geram exatamente o mesmo resultado.
Então qual devo escolher na hora de programar?
A resposta mágica é que isso depende…

Quando crio meus códigos, penso em uma pergunta básica:
“O tamanho do intervalo precisará ser ajustado em função de algum parâmetro?”

Se a resposta for não, utilizo a sintaxe de Ref_Range01, pois é objetiva e fácil de ser identificada por mim ou qualquer pessoa que vier a ler o código.

Caso a resposta seja sim, parto para segunda pergunta:
“O intervalo irá variar apenas na quantidade de linhas?”

Se a resposta for sim, lanço mão da sintaxe de Ref_Range02, por que fica bem fácil de alterar nesse caso.
Imagine que você deseja alterar a cor da fonte de todas as células da coluna A, até a última célula preenchida desta coluna.
O código poderia ficar assim

Sub Ref_Range02()
With Sheets("Teste")
    Ult_Lin = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A1:A" & Ult_Lin).Font.ColorIndex = 3
End With

Neste código, primeiramente determinamos a última linha da coluna A na qual há valores inseridos (Ult_Lin) e em seguida utilizamos esta variável para ajustarmos o tamanho do intervalo. Este iniciará na célula A1 e se estenderá até Ult_Lin.

E finalmente, para os casos em que existe a necessidade de ajustes do número de linhas e de colunas do intervalo, a sintaxe de Ref_Range03 é mais indicada.

No exemplo a seguir serão coloridas na cor vermelha todas as células a partir de A1, até a última linha da coluna A e até a última coluna preenchida da linha 1.

Sub Ref_Range03()
With Sheets("Teste")
    Ult_Lin = .Cells(Rows.Count, 1).End(xlUp).Row
    Ult_Col = .Cells(1, Columns.Count).End(xlToLeft).Column
    .Range(.Cells(1, 1), .Cells(Ult_Lin, Ult_Col)).Font.ColorIndex = 3
End With
End Sub

Espero que as dicas tenham sido úteis.
Um abraço e até a próxima

Anúncios

In Excel We Trust

Marcado com: , , , , , ,
Publicado em Nível: Avançado
2 comentários em “0164-Dica VBA: Objeto Range
  1. Olá

    Tenho o seguinte código, referente a um cadastro de requisição que montei. Até até ai beleza…mas cada requisição contém vários itens limitados até 8.

    Minha necessidade é que quando criar uma nova requisição, precisaria de um código que pudesse fazer a célula REQUISIÇÃO saltar 8 (oito) linhas abaixo, para que fique alinhada com a quantidade de itens:

    Private Sub INCLUIR_Click()

    ‘Ativar a primeira planilha
    ThisWorkbook.Worksheets(“Dados Requisição”).Activate
    ‘Selecionar a célula A3
    Range(“A3”).Select
    ‘Procurar a primeira célula vazia
    Do
    If Not (IsEmpty(ActiveCell)) Then
    ActiveCell.Offset(1, 0).Select
    End If
    Loop Until IsEmpty(ActiveCell) = True

    ‘Carregar os dados digitados nas caixas de texto para a planilha
    ActiveCell.Value = REQUISIÇÃO.Value
    ActiveCell.Offset(0, 1).Value = EMISSÃO.Value
    ActiveCell.Offset(0, 2).Value = CLIENTE.Value
    ActiveCell.Offset(0, 3).Value = REPRESENTANTE.Value
    ActiveCell.Offset(0, 4).Value = CNPJCPF.Value
    ActiveCell.Offset(0, 5).Value = ORDEM1.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM2.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM3.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM4.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM5.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM6.Value
    Lin = 1
    Col = 6
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ORDEM7.Value
    ActiveCell.Offset(0, 6).Value = PEÇA1.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA2.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA3.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA4.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA5.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA6.Value
    Lin = 1
    Col = 7
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = PEÇA7.Value
    ActiveCell.Offset(0, 7).Value = METROS1.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS2.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS3.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS4.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS5.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS6.Value
    Lin = 1
    Col = 8
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = METROS7.Value
    ActiveCell.Offset(0, 8).Value = DESENHO1.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO2.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO3.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO4.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO5.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO6.Value
    Lin = 1
    Col = 9
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = DESENHO7.Value
    ActiveCell.Offset(0, 9).Value = COR1.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR2.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR3.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR4.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR5.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR6.Value
    Lin = 1
    Col = 10
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = COR7.Value
    ActiveCell.Offset(0, 10).Value = QUALIDADE1.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE2.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE3.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE4.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE5.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE6.Value
    Lin = 1
    Col = 11
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = QUALIDADE7.Value
    ActiveCell.Offset(0, 11).Value = ACABAMENTO1.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO2.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO3.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO4.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO5.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO6.Value
    Lin = 1
    Col = 12
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ACABAMENTO7.Value
    ActiveCell.Offset(0, 12).Value = CARTELAEBOOKS1.Value
    Lin = 1
    Col = 13
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = CARTELAEBOOKS2.Value
    ActiveCell.Offset(0, 13).Value = OBSERVAÇÃO.Value
    ActiveCell.Offset(0, 14).Value = SOLICITANTE.Value
    ActiveCell.Offset(0, 15).Value = ITEM1.Value
    Lin = 1
    Col = 16
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ITEM2.Value
    Lin = 1
    Col = 16
    While Sheets(1).Cells(Lin, Col) “”
    Lin = Lin + 1
    Wend
    Sheets(1).Cells(Lin, Col) = ITEM3.Value
    ActiveCell.Offset(0, 16).Value = ENVIO.Value

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Visitas dos usuários
  • 2,069,536

Clique para assinar este blog e receber notificações de novos artigos por email.

Junte-se a 1.534 outros seguidores

Aumente sua interação

Siga-nos do twitter (@usuariosdoexcel).

Acesse o nosso fórum e compartilhe as suas dúvidas.

Curta nossa página no Facebook.

Junte-se ao grupo do LinkedIn.

Visite-nos utilizando o seu smartphone ou tablet.

Recomende este Blog
Visualizar notícias
Site monitorado:
Real Time Web Analytics

Clicky

%d blogueiros gostam disto: