Notifications
Clear all

tem como fazer VBA formula MÁXIMOSES e MÍNIMOSES

24 Posts
2 Usuários
0 Reactions
6,129 Visualizações
(@walteilson)
Posts: 8
Active Member
Topic starter
 

TEM COMO FAZER UMA FORMULA EM "VBA"?
bom pessoal sou novo,no foro e deixo aqui um tema se alguem tiver uma posição do assunto
gostaria de ter uma formula no excel de MÁXIMOSES e MÍNIMOSES como as ja existente no banco de dados
do excel (" somases,cont.ses,médiases").
consigo fazer usando formulas existente e transformado ela e matriz( juntando "máximo" e a de lógica "se" ) so
que fica muito pesada no caso de ter muitas desta dentro da mesma planilha que no meu caso uso, ai fica lento para o proseçador ou ate
mesmo trava.
deixo aqui anexo uma planilha com dados de exemplo.

 
Postado : 18/03/2012 3:29 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Leia as regras do fórum, postar arquivo compactado.

Quanto a sua dúvida, se o problema for uma função matricial (com obrigação de Shift + Ctrl + Enter), então tente...

=SOMARPRODUTO(MÁXIMO((A2:A7=A9)*(B2:B7)))

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 3:50 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Essa, é uma das maneiras.

Sub MaximoMinimoTotalMedia()
Plan1.Range("G4") = Application.Evaluate("=MAX(IF(G2=A2:A11,IF(G3=D2:D11,IF(G1=B2:B11,C2:C11))))")
Plan1.Range("G5") = Application.Evaluate("=AVERAGEIFS(C2:C11,A2:A11,G2,D2:D11,G3,B2:B11,G1)")
Plan1.Range("G6") = Application.Evaluate("=SUMIFS(C2:C11,A2:A11,G2,D2:D11,G3,B2:B11,G1)")
Plan1.Range("G7") = Application.Evaluate("=AVERAGEIFS(C2:C11,A2:A11,G2,D2:D11,G3,B2:B11,G1)")
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 4:12 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!
Outras versões...

UDF....

Public Function MaxIF(criteriaRange As Range, searchValue As Variant, calcRange As Range) 
     
    AciveCell.Formula = "=SumProduct(Max((criteriaRange = searchValue) * (calcRange)))" 
     
End Function 

Option Explicit 
 
 'These functions have been developed by Alan Forster on 27th September 2004.
 'After years of desire he has actually written them!
 'The functions use the same evaluation methods as the CountIf and SumIf functions
 
Public Function MinIf(rngEvaluate As Range, _ 
    strCondition As String, _ 
    Optional rngValues As Range = Nothing) As Variant 
    Dim varValue            As Variant 
    Dim bolValueSet         As Boolean 
    Dim intRow              As Integer, _ 
    intCol              As Integer 
     
    If (rngValues Is Nothing) Then Set rngValues = rngEvaluate 
    bolValueSet = False 
    If Not RangesOK(rngEvaluate, rngValues) Then 
         'Return an error value
        varValue = "Error in range selection" 
    Else 
         'If the ranges are not identically sized can not get this far!
        For intRow = 1 To rngEvaluate.Rows.Count 
            For intCol = 1 To rngEvaluate.Columns.Count 
                If Application.CountIf(rngEvaluate(intRow, intCol), strCondition) = 1 Then 
                    If bolValueSet Then 
                        If varValue > rngValues(intRow, intCol) Then varValue = rngValues(intRow, intCol) 
                    Else 
                        bolValueSet = True 
                        varValue = rngValues(intRow, intCol) 
                    End If 
                End If 
            Next intCol 
        Next intRow 
    End If 
    MinIf = varValue 
End Function 
 
Public Function MaxIf(rngEvaluate As Range, _ 
    strCondition As String, _ 
    Optional rngValues As Range = Nothing) As Variant 
    Dim varValue            As Variant 
    Dim bolValueSet         As Boolean 
    Dim intRow              As Integer, _ 
    intCol              As Integer 
     
    If (rngValues Is Nothing) Then Set rngValues = rngEvaluate 
    bolValueSet = False 
    If Not RangesOK(rngEvaluate, rngValues) Then 
         'Return an error value
        varValue = "Error in range selection" 
    Else 
         'If the ranges are not identically sized can not get this far!
        For intRow = 1 To rngEvaluate.Rows.Count 
            For intCol = 1 To rngEvaluate.Columns.Count 
                If Application.CountIf(rngEvaluate(intRow, intCol), strCondition) = 1 Then 
                    If bolValueSet Then 
                        If varValue < rngValues(intRow, intCol) Then varValue = rngValues(intRow, intCol) 
                    Else 
                        bolValueSet = True 
                        varValue = rngValues(intRow, intCol) 
                    End If 
                End If 
            Next intCol 
        Next intRow 
    End If 
    MaxIf = varValue 
End Function 
 
Private Function RangesOK(rng1 As Range, rng2 As Range) As Boolean 
    Dim bolAreas    As Boolean, _ 
    bolSize     As Boolean 
    bolAreas = (rng1.Areas.Count = 1) Or (rng2.Areas.Count = 1) 
    bolSize = (rng1.Rows.Count = rng2.Rows.Count) And _ 
    (rng1.Columns.Count = rng2.Columns.Count) 
    RangesOK = bolAreas And bolSize 
End Function 

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 4:38 pm
(@walteilson)
Posts: 8
Active Member
Topic starter
 

ola, eu colei tudo dentro da macro aparece a formula MaxIf so que nao consegue caucluar completa a formula e aperece este erro " #VALOR!"
vc pode me da uma dica, euz o seguinte
apertei alt+f11 pareceu visual basic ai colei e fui na x na janela e fexei, estou fazendo correto?

 
Postado : 18/03/2012 5:27 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Tentou minha 1º postagem???

Como é uma Função Definida pelo Usuário, precisa colocar dentro de um módulo.

Vá ao excel, digite =e_o_nome_da_função.(No caso =MaxIf..)

Tente minha 1º postagem, seria simples!
Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 5:32 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom, se entendi bem acho que seria isso:

Option Base 1
Function maximose(intval1 As Range, intval2 As Range, cond As String)
Application.Volatile
Dim wf As WorksheetFunction
Set wf = WorksheetFunction

Dim Matrix() As Variant
On Error GoTo fim
ReDim Matrix(intval1.Count, 1)
    For Each valor1 In intval1
    num = num + 1
        If intval2(num) = cond Then
        Matrix(num, 1) = valor1
        Else
        Matrix(num, 1) = 0
        End If
    Next
maximose = wf.Max(Matrix)

fim:
Debug.Print Err.Number & " " & Err.Description
End Function

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 5:33 pm
(@walteilson)
Posts: 8
Active Member
Topic starter
 

ola esta funcionou, so que numeros inteiro, exemplo tiver formato moeda, data, etc nao funciona
teria como mudar?

 
Postado : 18/03/2012 5:54 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Teste essa que vai gostar!

Sub Max()
    Dim test
    
    test = Evaluate("=MAX(IF(A1:A7=A9,B1:B7))")
    
    MsgBox test
End Sub

Ou.....

Sub Max()
    Dim test
    
    test = Evaluate("=MAX(IF(A1:A7=A9,B1:B7))")
    
    [B9] = test
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 6:00 pm
(@walteilson)
Posts: 8
Active Member
Topic starter
 

alexandrevba
esta aqui:

        Public Function MaxIF(criteriaRange As Range, searchValue As Variant, calcRange As Range) 
     
    AciveCell.Formula = "=SumProduct(Max((criteriaRange = searchValue) * (calcRange)))" 
     
End Function 
-------------------------------------------------------------------------                                
 e esta 

----------------------------------------------------------------------------

     Option Explicit 

'These functions have been developed by Alan Forster on 27th September 2004.
'After years of desire he has actually written them!
'The functions use the same evaluation methods as the CountIf and SumIf functions

Public Function MinIf(rngEvaluate As Range, _ 
    strCondition As String, _ 
    Optional rngValues As Range = Nothing) As Variant 
    Dim varValue            As Variant 
    Dim bolValueSet         As Boolean 
    Dim intRow              As Integer, _ 
    intCol              As Integer 
     
    If (rngValues Is Nothing) Then Set rngValues = rngEvaluate 
    bolValueSet = False 
    If Not RangesOK(rngEvaluate, rngValues) Then 
         'Return an error value
        varValue = "Error in range selection" 
    Else 
         'If the ranges are not identically sized can not get this far!
        For intRow = 1 To rngEvaluate.Rows.Count 
            For intCol = 1 To rngEvaluate.Columns.Count 
                If Application.CountIf(rngEvaluate(intRow, intCol), strCondition) = 1 Then 
                    If bolValueSet Then 
                        If varValue > rngValues(intRow, intCol) Then varValue = rngValues(intRow, intCol) 
                    Else 
                        bolValueSet = True 
                        varValue = rngValues(intRow, intCol) 
                    End If 
                End If 
            Next intCol 
        Next intRow 
    End If 
    MinIf = varValue 
End Function 

Public Function MaxIf(rngEvaluate As Range, _ 
    strCondition As String, _ 
    Optional rngValues As Range = Nothing) As Variant 
    Dim varValue            As Variant 
    Dim bolValueSet         As Boolean 
    Dim intRow              As Integer, _ 
    intCol              As Integer 
     
    If (rngValues Is Nothing) Then Set rngValues = rngEvaluate 
    bolValueSet = False 
    If Not RangesOK(rngEvaluate, rngValues) Then 
         'Return an error value
        varValue = "Error in range selection" 
    Else 
         'If the ranges are not identically sized can not get this far!
        For intRow = 1 To rngEvaluate.Rows.Count 
            For intCol = 1 To rngEvaluate.Columns.Count 
                If Application.CountIf(rngEvaluate(intRow, intCol), strCondition) = 1 Then 
                    If bolValueSet Then 
                        If varValue < rngValues(intRow, intCol) Then varValue = rngValues(intRow, intCol) 
                    Else 
                        bolValueSet = True 
                        varValue = rngValues(intRow, intCol) 
                    End If 
                End If 
            Next intCol 
        Next intRow 
    End If 
    MaxIf = varValue 
End Function 

Private Function RangesOK(rng1 As Range, rng2 As Range) As Boolean 
    Dim bolAreas    As Boolean, _ 
    bolSize     As Boolean 
    bolAreas = (rng1.Areas.Count = 1) Or (rng2.Areas.Count = 1) 
    bolSize = (rng1.Rows.Count = rng2.Rows.Count) And _ 
    (rng1.Columns.Count = rng2.Columns.Count) 
    RangesOK = bolAreas And bolSize 
End Function 
____________________________________
tambem apareceu este erro
_____________#VALOR!_____________

o que poderia ser
estou colando dentro de um modulo inclusive novo sempre modulo1

 
Postado : 18/03/2012 6:12 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Minha postagem anterior resolve seu problema!!!

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 6:14 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

ola esta funcionou, so que numeros inteiro, exemplo tiver formato moeda, data, etc nao funciona
teria como mudar?

Walteison
Você se refere a função que criei ?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 6:39 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Dei uma enxugada no código e fiz uma adaptação para usar datas também:

Function maximose(intval1 As Range, intval2 As Range, cond As String)
Application.Volatile
Dim wf As WorksheetFunction
Set wf = WorksheetFunction

Dim Matrix() As Variant
On Error GoTo fim
ReDim Matrix(intval1.Count, 1)
    For num = 1 To intval1.Count
        If intval2(num) = cond Then
        Matrix(num, 1) = intval1(num) * 1
        Else
        Matrix(num, 1) = 0
        End If
    Next
maximose = wf.Max(Matrix)

fim:
Debug.Print Err.Number & " " & Err.Description
End Function

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 7:13 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Obrigado, pelo retorno!! Assim que poder marque seu tópico como resolvido!!

Precisando já sabe onde nos encontrar.

Abraços e at+++ ;)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 7:32 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Obrigado, pelo retorno!! Assim que poder marque seu tópico como resolvido!!

Alexandrevba

Acho que ele ainda não deu um retorno sobre a duvida dele.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 18/03/2012 7:41 pm
Página 1 / 2