Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Dicas de VBA - WorksheetFunction

Em artigos anteriores iniciei algumas dicas sobre programação em Visual Basic for Applications (VBA), aplicado ao Microsoft Excel, de forma a clarificar e a mostrar algumas das melhores práticas.

· Excel: Dicas de VBA - Eventos – O que são e como utilizar eventos no Microsoft Excel
· Excel: Dicas de VBA - Performance – Como melhorar a performance de execução do código com métodos simples e fáceis de utilizar.
· Excel: Dicas de VBA - Ciclos – Como efectuar ciclos da forma correcta

Irei em próximos artigos explorar mais algumas funcionalidades e mostrar algumas dicas que julgo importantes, mas para já o objecto WorksheetFunction.

O objecto WorksheetFunction permite utilizar fórmulas que já utilizamos directamente nas células, através de métodos, que estão disponíveis no Microsoft Excel. Tem ainda algumas propriedades (Application, Creator e Parent), embora menos utilizadas.

Esta possibilidade de utilizar fórmulas no código simplifica bastante inúmeras operações e é sem dúvida um objecto muito importante. Podem ser utilizadas formulas simples como o Sum(), Min(), Max(), Count(), etc, até formulas mais complexas, como o SumProduct(), Index(), VLookup(), DCount(), etc. E se em alguns casos simplifica apenas a leitura do código, em outros, a sua utilização resolve-nos alguns problemas mais complexos.

Quando colocamos o ponto (.) a seguir ao objecto WorksheetFunction, é mostrada a lista dos métodos e propriedades disponíveis e podemos aqui encontrar uma lista muito extensa.

NOTA: De referir que as formulas que podemos usar (e apresentadas na lista) são apenas as que estão disponíveis na versão utilizada, ou seja, a versão do Excel 2003 tem menos funções disponíveis do que o Excel 2007 ou 2010. Isto é importante também por questões de compatibilidade.

Por exemplo, quando queremos gerar um número aleatório entre dois valores, podemos fazer da forma tradicional:

Dim resultado As Integer
Randomize
resultado = Int((10 * rnd) + 1)
MsgBox resultado


Neste caso é chamada a função Randomize e depois é gerado um número entre 1 e 10. Mas vejamos como fazer utilizando a função RandBetween(), disponível na versão 2007 ou superior, através do objecto WorksheetFunction:

Dim resultado As Double
resultado = WorksheetFunction.RandBetween(1, 10)
MsgBox resultado


Além de ser utilizada menos uma linha, que é pouco importante obviamente, o código é mais simples de analisar.

Mas existem casos mais complexos em que se não utilizarmos o objecto WorksheetFunction, o código é mais extenso. Por exemplo, para somar os valores do seguinte range (como mostra a figura seguinte) da célula A1 à célula A10, teríamos de fazer um ciclo e somar o valor de cada célula para uma variável.

Utilizando o objecto WorksheetFunction podemos fazer da seguinte forma:

Dim rng As Range
Set rng = Range("a1:a10")
MsgBox WorksheetFunction.Sum(rng)


Neste simples código, onde o resultado será 55, define-se um range que depois será indicado como argumento da função. O range poderia ser indicado directamente, mas desta forma é mais simples ler o código. Pode-se utilizar mais argumentos (agora indicado directamente os ranges):

MsgBox WorksheetFunction.Sum(Range("a1:a10"), Range("b1:b10"))


Outro exemplo, utilizando a mesma tabela, poderá ser o de contar quantas linhas têm o valor maior ou igual a 8. Neste caso, sem utilizar este objecto, teríamos de fazer um ciclo, verificar o valor e contando apenas os que estivessem de acordo com o critério definido. Com o objecto WorksheetFunction podemos fazer muito facilmente utilizando a formula CountIf():

Dim rng As Range
Set rng = Range("a1:a10")
MsgBox WorksheetFunction.CountIf(rng, ">=8")


Estes são alguns exemplos simples de como o objecto WorksheetFunction simplifica e muito o código e certamente existem muito mais aplicações práticas onde o podemos utilizar.

Uma das “desvantagens” deste objecto é de utilizar sempre as funções em Inglês, o que não será problema para quem já conhece e utiliza as formulas não traduzidas.

3 comentários:

Antônio Celso Thomazelli disse...

Exemplo bom para quem, como eu, precisa fazer cadastro de produtos com códigos compostos (3 dígitos alfabéticos e 4 dígitos numéricos).
Exemplo:
abc0001, abc0002, bcd0001, bcd0002, etc.
Separam-se os 3 primeiros dígitos do código e depois aplica-se o objeto MsgBox WorksheetFunction.CountIf(rng, "=abc"). virão todos os códigos que começam com abc

Anónimo disse...

David, bom dia!

Paulino, bom dia!

Achei muito bom seu código abaixo, então eu desejo que o valor da contagem seja movido para uma determinada célula e não na caixa de texto, você pode me ajudar?

Dim rng As Range
Set rng = Range(“a1:a10″)
MsgBox WorksheetFunction.CountIf(rng, “>=8″)


Abraço,

Dorival

dorival@gruposubito.com.br

Anónimo disse...

Como posso fazer para posicionar um cursor com range?
quero ir para uma celula especifica que esta gravada na celula F2(G17)



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico