Função com infinito...
 
Notifications
Clear all

Função com infinitos parametros

8 Posts
3 Usuários
0 Reactions
1,197 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde

Andei procurando isto em vários fóruns e nao encontrei, peço desculpas caso isso ja tenha sido falado aqui.

Preciso montar uma Função no VBA que contenham infinitos "parametros duplos"

por exemplo:
=minhafunção([intervalo_critério1; critério1]; [intervalo_criterio2; criterio2]; [intervalo_criterio3; criterio3]...)

a unica coisa que consigo fazer é:
=minhafunção([intervalo_critério1]; [intervalo_criterio2]; [intervalo_criterio3]...)

uma formula que usa isso por exemplo é o conta.ses

Obrigado pela ajuda!

 
Postado : 07/01/2015 1:55 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Tipo isso:

Function teste_array(ParamArray num_array() As Variant) As Double

Dim i As Long

For i = 0 To UBound(num_array)
teste_array = teste_array + num_array(i)
Next i

End Function

Use a instrução ParamArray

 
Postado : 07/01/2015 2:29 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

eu ia falar exatamento do paramarray...

Mas o GTsalikis já falou !

 
Postado : 07/01/2015 8:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Obrigado pela resposta GTsalikis e Fernando.

Usar o paramarray eu conheço. Minha duvida é como fazer dois parâmetros serem infinitos, e não apenas um.. vou dar um exemplo (que sei que está errado) para tentar ilustrar em cima da sua resposta

Function teste_array(ParamArray num_array() As Variant, ParamArray critério_array() As Variant) As Double

Dim i As Long

For i = 0 To UBound(num_array)
if critério_array = "Verdadeiro" then teste_array = teste_array + num_array(i)
Next i

End Function

na função somases por exemplo é feito isso
=somases(intervalo soma; intervalo1; criterio1; intervalo2; criterio2; intervalo3; criterio3;...4;...4;...5;...5;...)
eu só estou conseguindo fazer igual ao que voce me informou que é (intervalo soma;interlavo1;intervalo2;intervalo3;intervalo4;...5;...6;...7;...)

Obrigado mais uma vez pela ajuda

 
Postado : 08/01/2015 7:34 am
(@edcronos)
Posts: 1006
Noble Member
 

não entendi oq vc quer, mas vc pode usar o mesmo array para as duas coisas

For i = 0 To UBound(num_array) step 2
if critério_array(i) = "Verdadeiro" then teste_array(i) = teste_array(i) + teste_array(i+1)
Next

como o loop (i) vai ser 1,3,5,7,9,...
o (i+1) vai ser a condição, 2,4,6,8,10

pode subdividir em mais partes,
mas não vai poder misturar,
tipo (crit,cond1, cond2,crit,cond1,crit) assim não iria funcionar
a não ser que se crie um identificador para saber quando se termina as condições

mais ou menos assim, acho que enrolei um pouco

 
Postado : 08/01/2015 1:38 pm
(@edcronos)
Posts: 1006
Noble Member
 

ola.
Desculpe, eu enrolei tudo antes

--------------------------------------------------------------------------------------------
Function teste_array(ParamArray Num_E_Critério_array() As Variant) As Double

For i = 0 To UBound(num_array) step 2

if Num_E_Critério_array( i ) = "true" then

teste_array = teste_array + Num_E_Critério_array( i+1 )

end if
Next
End Function
------------------------------------------
no caso o (i) vai ser o num e o (i+1) vai ser o Critério

será que deu para entender?

caso esses nume criterios fiquem na planilha tbm dá para fazer usando range

Function teste_array( byval Num_E_Critério As range) As Double
dim arrayvalue()

arrayvalue=Num_E_Critério.value2

For i = 1 To UBound(arrayvalue,1)

if arrayvalue(i,1) = true then

teste_array = teste_array + arrayvalue( i,2 )

end if
Next
End Function
nesse caso a 1ª coluna da range seria o NUM e a 2ª seria o criterio
poderia determinar o numero de criterios pela quantidade de colunas

existem varias possibilidades

 
Postado : 08/01/2015 3:55 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Esta função está testada e funciona.

Function Somarse_GT(Soma As Range, ParamArray Criterios() As Variant) As Double

Dim qtd As Long
Dim i   As Long
Dim j   As Long
Dim t   As Boolean

qtd = UBound(Criterios)

For j = 1 To Soma.Cells.Count
    t = False
    For i = 0 To qtd Step 2
        If Application.WorksheetFunction.Index(Range(Criterios(i).Address), j) = Criterios(i + 1) Then
            t = True
        Else
            t = False
            Exit For
        End If
    Next i
    If t = True Then
        Somarse_GT = Somarse_GT + Application.WorksheetFunction.Index(Soma, j)
    End If
Next j

End Function

Eu poderia suprimir o primeiro argumento da UDF, mas preferi deixar separado apenas para facilitar a tua visualização, de como tratei a questão de usar uma array para conter ranges e critérios alternados.

Segue no anexo, a planilha com o teste de uso.

Abs

 
Postado : 08/01/2015 4:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Perfeito!!! Muito obrigado!

 
Postado : 09/01/2015 5:51 am