função máximo com v...
 
Notifications
Clear all

função máximo com variantes (Macro)

9 Posts
2 Usuários
0 Reactions
1,661 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

estou tentando fazer uma função máximo com variantes

Public Function MaxY(ByRef nomeArrayt As Range, Optional Valor_max_de_Referencia As Long) As Long
Dim nomeArray()
    Dim Maxi As Long, mv As Long
nomeArray = nomeArrayt.Value2
    For L = 1 To UBound(nomeArray, 1)
        For c = 1 To UBound(nomeArray, 2)
            mv = nomeArray(L, c)

            If Valor_max_de_Referencia = 0 Then
                If mv > 0 Then
                    If Maxi < mv Then Maxi = mv
                End If
            Else
                If mv < Valor_max_de_Referencia Then
                    If mv > 0 Then
                        If Maxi < mv Then Maxi = mv
                    End If
                End If
            End If
        Next
    Next
    MaxY = Maxi
End Function

não vou usar em ranges diretamente , mas coloquei para fazer teste de funcionamento

só acho que o teste em cima da variante "Valor_max_de_Referencia" poderia ser melhorada
tentei chavear ela antes de entrar no loop, mas não consegui achar uma logicar apropriada

será que tem uma maneira melhor de fazer isso ?
é que vou usar mais opções no teste

 
Postado : 29/05/2015 11:50 am
(@gtsalikis)
Posts: 2373
Noble Member
 

VC criou uma variável "Maxi" à toa.

Simplesmente esqueça ela. Use o Valor_max_de_Referência e ponto. Se ele for 0 (não informado), atribua a ele o primeiro valor encontrado no loop e siga.

Resumindo: Maxi e Valor_max_de_Referência devem ser apenas Valor_max_de_Referência

Abs

 
Postado : 29/05/2015 1:56 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

desculpe, estou com o raciocinio meio lento

Valor_max_de_Referência seria para informar o maior valor que pode retornar,
"tem que ser menor que o valor de referencia"

claro que eu poderia fazer uma com
If mv < Valor_max_de_Referencia Then

mas como eu saberia se é o maior da lista e menor que o valor de referencia ?

e eu ainda vou transformar em uma função maior com opções e adicionar outras opções de filtragem do valor

 
Postado : 29/05/2015 2:17 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Dando uma segunda olhada, acho que vc queria isso:

Public Function MaxY(ByRef nomeArrayt As Range, Optional Valor_max_de_Referencia As Long) As Long

Dim nomeArray()
Dim maxi As Long

nomeArray = nomeArrayt.Value2
    
maxi = Application.WorksheetFunction.Max(nomeArrayt)
    
If maxi > Valor_max_de_Referencia Then
    MaxY = Valor_max_de_Referencia
Else
    MaxY = maxi
End If

End Function
 
Postado : 29/05/2015 2:18 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Ou isso, na verdade:

Public Function MaxY(ByRef nomeArrayt As Range, Optional Valor_max_de_Referencia As Long) As Long

Dim nomeArray()
Dim maxi As Long

nomeArray = nomeArrayt.Value2
    
maxi = Application.WorksheetFunction.Max(nomeArrayt)
    
If Valor_max_de_Referencia = 0 Then
    MaxY = maxi
    If maxi > Valor_max_de_Referencia Then
        MaxY = Valor_max_de_Referencia
    Else
        MaxY = maxi
    End If
End If

End Function
 
Postado : 29/05/2015 2:25 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

deu muito certo não
considerando
=MaxY(AH25:AN25;15)
e os valores
1 2 10 20 30 14 16
teria que retornar 14
e a sua retorna 15, mesmo não tendo na lista

e eu tbm não queria usar aplicação do excel
em um teste que fiz para oq eu vou fazer é muito mais lento

 
Postado : 29/05/2015 2:29 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

acho que não fui bem explicativo
eu estou fazendo uma função que retorna o maior valor de uma lista
mas esse valor tem que estar abaixo de um valor de referencia

a macro que eu postei funciona perfeitamente,
mas eu estou achando que coloquei comparações desnecessárias no meio do loop
e como tenho que adicionar mais opções iguais na macros acho que dá para reduzir "é só uma intuição"
eu vou fazer ela correr um extenso array dividido em blocos por isso não posso usar aplicação de planilha

 
Postado : 29/05/2015 2:37 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

olhando mais uma vez
fiz uma modificação na minha macro
já que estou procurando um valor maior
não preciso testar se mv é maior que 0


Public Function MaxY(ByRef nomeArrayt As Range, Optional Valor_max_de_Referencia As Long) As Long
Dim nomeArray()
    Dim maxi As Long, mv As Long
nomeArray = nomeArrayt.Value2
    For L = 1 To UBound(nomeArray, 1)
        For c = 1 To UBound(nomeArray, 2)
            mv = nomeArray(L, c)
            If Valor_max_de_Referencia = 0 Then
                    If maxi < mv Then maxi = mv
            Else
                If mv < Valor_max_de_Referencia Then
                        If maxi < mv Then maxi = mv
                End If
            End If
        Next
    Next
    MaxY = maxi
End Function

mas algo me diz que ainda posso reduzir um if desse Valor_max_de_Referencia

 
Postado : 29/05/2015 2:49 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

reduzir eu até reduzi
mas acho qeu em termo de performance deu na mesma
mas como ficou mais simples acho que facilita fazer modificações

Public Function MaxY(ByRef nomeArrayt As Range, Optional Valor_max_de_Referencia As Long) As Long
    Dim nomeArray()
    Dim maxi As Long, mv As Long
    nomeArray = nomeArrayt.Value2
    For L = 1 To UBound(nomeArray, 1)
        For c = 1 To UBound(nomeArray, 2)
            mv = nomeArray(L, c)
            If Valor_max_de_Referencia = 0 Or mv < Valor_max_de_Referencia Then
                If maxi < mv Then maxi = mv
            End If
        Next
    Next
    MaxY = maxi
End Function

desculpa aí gtsalikis, é que as vezes a intuição fala uma coisa mas o raciocínio não ajuda

 
Postado : 29/05/2015 3:26 pm