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)

Mensagens Recentes



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