0196-Dica VBA: Eliminando a necessidade de usar a propriedade Cells

Hoje veremos mais uma dica para simplificar códigos.

Já vimos que com o uso de Set podemos criar variáveis objeto para criar estruturas como esta aqui:


Sub TransferirInfoEntrePlanilhas()
'Declarar variáveis
Dim wsOrig As Worksheet
Dim wsDest As Worksheet
Dim i As Integer
Dim j As Integer

'Atribuir variáveis objeto
Set wsOrig = Worksheets("Copiar")
Set wsDest = Worksheets("Colar")

'Loop para linhas e colunas
For i = 1 To 10
For j = 1 To 5

'Transferir dados entre as planilhas
wsDest.Cells(i, j) = wsOrig.Cells(i, j)
Next j
Next i

End Sub

Mas podemos simplificar ainda mais, modificando um pouco a atribuição das variáveis. Ao invés de atribuirmos às variáveis objeto às planilhas, podemos atribuir à coleção de células da planilha.


Sub TransferirInfoEntrePlanilhas()
'Declarar variáveis
Dim wsOrig As Range
Dim wsDest As Range
Dim i As Integer
Dim j As Integer

'Atribuir variáveis objeto
Set wsOrig = Worksheets("Copiar").Cells
Set wsDest = Worksheets("Colar").Cells

'Loop para linhas e colunas
For i = 1 To 10
For j = 1 To 5

'Transferir dados entre as planilhas
wsDest(i, j) = wsOrig(i, j)
Next j
Next i

End Sub

Modificando a atribuição, eliminamos a necessidade de utilizarmos a propriedade Cells para definir as coordenadas de células. Podemos definir as coordenadas diretamente sobre a variável objeto criada.

Essa simplificação é ainda mais evidente quando precisamos definir um Range a partir de duas coordenadas.

Observem que na declaração das variáveis, teremos que agora definir as variáveis objeto como Range e não mais como Worksheet.

Nesta primeira versão, vamos utilizar a abordagem tradicional:


Sub ColorirIntervalos()
'Declarar variáveis
Dim ws As Worksheet
Dim ul As Long
Dim i As Long

'Atribuir variável objeto
Set ws = Sheets("Colorir")

With ws

'Determinar a última linha com valores da coluna A
ul = .Cells(Rows.Count, "A").End(xlUp).Row

'Loop ao longo das linhas da coluna A
For i = 1 To ul

'Testar se a célula da coluna A está vazia
'Se não estiver o conteúdo das colunas A:C é pintado de vermelho
If .Cells(i, 1) "" Then Range(.Cells(i, 1), .Cells(i, 3)).Interior.ColorIndex = 3
Next i
End With
End Sub

E agora, reescreveremos o código, modificando a atribuição:


Sub ColorirIntervalos()
'Declarar variáveis
Dim ws As Range
Dim ul As Long
Dim i As Long

'Atribuir variável objeto
Set ws = Sheets("Colorir").Cells

'Determinar a última linha com valores da coluna A
ul = ws(Rows.Count, "A").End(xlUp).Row

'Loop ao longo das linhas da coluna A
For i = 1 To ul

'Testar se a célula da coluna A está vazia
'Se não estiver o conteúdo das colunas A:C é pintado de vermelho
If ws(i, 1) "" Then Range(ws(i, 1), ws(i, 3)).Interior.ColorIndex = 3

Next i

End Sub

No exemplo acima eliminamos a necessidade do laço With… End With, e encurtamos a notação necessária para definição de todos os intervalos envolvidos.

Lembrando que, se dois códigos executam o mesmo conjunto de ações, a opção que possui menos comandos é a mais rápida. E todo ganho de performance é importante para agilizar nossas macros.

Anúncios

In Excel We Trust

Marcado com: , , ,
Publicado em Nível: Avançado

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

%d blogueiros gostam disto: