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 - ParamArray

Quando criamos funções ou procedimentos, necessitamos muitas das vezes de indicar um ou mais argumentos. Isto é uma situação muito normal, especialmente em funções, mas o problema coloca-se quando não sabemos o total de argumentos que necessitamos de indicar. Por exemplo, se queremos contar um determinado número de valores mas não sabemos quantos valores iremos indicar o que podemos fazer? Durante este pequeno artigo iremos ver algumas soluções para diferentes casos.

Se for um número fixo de argumentos, podemos indicar vários na função, como por exemplo:

Function mySum(va1 As Double, val2 As Double) As Double
' ...
End Function

Isto é, como já foi referido, uma situação normal, mas se necessitarmos de um número indefinido de valores?

Quando a função é para ser usada no código, a solução é simples e pode-se usar um array e indicar n valores. Um exemplo simples para ilustrar esta utilização será a criação de uma função para somar os diversos valores:

Function mySum(values() As Double) As Double
Dim v As Variant
Dim contador As Double

' Ciclo nos valores do array
For Each v In values

' Soma os valores
contador = contador + CDbl(v)

Next
mySum = contador
End Function

Depois, criando o array que será usado como argumento e chamando a função:

Sub DoWork()

' Criação de um Array
Dim doubleArray(2) As Double
doubleArray(0) = 12.5
doubleArray(1) = 5
doubleArray(2) = 30.2

' Execução da função indicando o array criado com argumento

Dim result As Double
result = mySum(doubleArray)

MsgBox "O resultado é " & CStr(result)

End Sub

Até aqui tudo simples e certamente do conhecimento da maioria, mas se queremos usar a função numa célula, ou seja, se quisermos criar uma User-Defined Functions (UDF) onde possamos indicar n argumentos? Aqui é um bom exemplo para a utilização de um ParamArray!

Um ParamArray é uma das opções que estão disponíveis quando indicamos argumentos (assim como o Optional, ByVal e ByRef) e pode/deve ser utilizado quando não sabemos o número de dados que iremos indicar. De um modo geral:

  • É um array de valores do tipo Variant (uma vez que podem ser indicados diversos tipos);
  • Podemos utilizar apenas um por função/procedimento;
  • Não podemos usar argumentos opcionais (keyword Optional) na função ou procedimento quando usamos um ParamArray;
  • Tem de ser sempre definido no final dos argumentos, ou seja, tem de ser o último argumento a ser indicado.

Este é um exemplo da sua utilização:

Function funcao(nome As String, ParamArray valores() As Variant) As String
' ...
End Function


Indicamos primeiro os argumentos que queremos (caso necessário) e no final, iniciando a keyword ParamArray, o array do tipo Variant.

Por exemplo na função SUM(), como em muitas outras, quando estamos a digitar na célula aparece-nos a indicação de que podemos indicar vários argumentos (sem especificar quantos). Veja a seguinte imagem:

clip_image001

É esta a aplicação do ParamArray e desta forma podemos, por exemplo, criar uma função que receba diversos ranges e somar esses valores.

Function mySum(ParamArray values() As Variant) As Double
Dim total As Double
Dim rng As Variant

' Ciclo nos diferentes parâmetros indicados
For Each rng In values

' Verifica se foi indicado um Range
If TypeOf rng Is Range Then
Dim r As Range
Set r = rng

' Novo ciclo nas células do Range
Dim cell As Range
For Each cell In r

' Verifica se é um número para incrementar a variável
If IsNumeric(cell) Then
total = total + cell.Value
End If
Next
End If

Next

' Atribui o resultado à função
mySum = total

End Function

Depois, na célula, podemos usar das seguintes formas:

           Somando o valor de uma célula apenas:
           =mySum(A1)

          Somando um intervalo da célula A1 à A10:
         =mySum(A1:A10)

          Somando múltiplos intervalos:
          =mySum(A1:A10;B1:B10;C1:C10)

NOTA: Para que a função possa ser usada na célula (UDF) é necessário que seja criada num módulo.

Neste caso estamos a criar uma função muito semelhante ao SUM() mas que serve para ilustrar a utilização do ParamArray e de que forma pode ajudar na criação de UDF’s.

Certamente terão ideias de onde e como aplicar!

0 comentários:

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