MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Compartilhe

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 68
    Registrado : 28/08/2017

    [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  Anderson Catarino em 6/3/2018, 10:24

    Boa dia.
    Preciso de uma ajuda, tenho um formulário onde faço o registo diário dos testes, nesse formulário posso fazer até 8 registos e tenho um campo onde faz a media desde registo.

    ************************
    Exemplo do que deveria fazer:
    ************************
    FRot 1 = 7.5
    FRot 2 = 5.5
    FRot 3 = 2.9
    FRot 4 = 3.9
    FRot 5 = Null
    FRot 6 = Null
    FRot 7 = Null
    FRot 8 = Null

    Média= (7.5+5.5+2.9+3.9)/4 = 19.8/4 = 4.95

    **********************
    Código do que está a fazer
    **********************

    Private Sub C1_Click()
    Dim I As Double
    Dim f As Double
    Dim Y

    On Error Resume Next

    I = Val(Nz(Me.FRot1, 0)) + Val(Nz(Me.FRot2, 0)) + Val(Nz(Me.FRot3, 0)) + Val(Nz(Me.FRot4, 0)) + Val(Nz(Me.FRot5, 0)) + Val(Nz(Me.FRot6, 0)) + Val(Nz(Me.FRot7, 0)) + Val(Nz(Me.FRot8, 0))
    f = 0

    Dim ctl As Control
    For Each ctl In Me.Controls
    If ctl.ControlType = acTextBox And ctl.Name <> "C1" _
    And ctl.Name = "FRot1" _
    Or ctl.Name = "FRot2" _
    Or ctl.Name = "FRot3" _
    Or ctl.Name = "FRot4" _
    Or ctl.Name = "FRot5" _
    Or ctl.Name = "FRot6" _
    Or ctl.Name = "FRot7" _
    Or ctl.Name = "FRot8" Then
    If Not IsNull(ctl.Value) And ctl.Value > 0 Then
    f = f + 1
    End If
    End If
    Next ctl
    Y = (I / f)
    Me.C1.Value = Round(Y, 1)
    End Sub

    o que esse código esta a fazer:

    FRot 1 = 7.5
    FRot 2 = 5.5
    FRot 3 = 2.9
    FRot 4 = 3.9
    FRot 5 = Null
    FRot 6 = Null
    FRot 7 = Null
    FRot 8 = Null

    Média= (7+5+2+3)/4 = 17/4 = 4.25, ou seja só está a pegar a parte inteira do número.

    Alguma sugestão?

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3632
    Registrado : 29/06/2012

    Re: [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  Noobezinho em 6/3/2018, 11:00

    Anderson

    Somente o código, não dá para ajudar muito, pois veja:

    No código tem essa linha:

    Me.C1.Value = Round(Y, 1)

    Como disse, não tenho ideia do que seria C1

    Mas tenho a impressão que seja o resultado final, mas com aquele arredondamento (Round())?

    Não seria ai o problema?

    Eu digitei isso na Janela imediata do VBA:

    ? (7.5+5.5+2.9+3.9)/4
    4,95

    Veja que retornou o resultado corretamente.



    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 728
    Registrado : 18/01/2013

    Re: [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  CassioFabre em 6/3/2018, 11:01

    Bom dia,

    No trecho:
    I = Val(Nz(Me.FRot1, 0)) + Val(Nz(Me.FRot2, 0)) + Val(Nz(Me.FRot3, 0)) + Val(Nz(Me.FRot4, 0)) + Val(Nz(Me.FRot5, 0)) + Val(Nz(Me.FRot6, 0)) + Val(Nz(Me.FRot7, 0)) + Val(Nz(Me.FRot8, 0))

    Em vez de usar Val(), use apenas o Nz(). Justamente a função Val() está arredondando os valores dos campos para o inteiro mais próximo. Ficando:

    I = Nz(Me.FRot1, 0) + Nz(Me.FRot2, 0) + Nz(Me.FRot3, 0) + Nz(Me.FRot4, 0) + Nz(Me.FRot5, 0) + Nz(Me.FRot6, 0) + Nz(Me.FRot7, 0) + Nz(Me.FRot8, 0)

    --------------------
    Edit:

    Também uma ideia aqui do ponto de vista da praticidade do código, você pode reescrever da seguinte forma:
    Código:
    Private Sub C1_Click()
        Dim soma As Double
        Dim qnt As Integer
        Dim c As Control
        
        soma = 0
        qnt = 0
        
        For Each c In Me.Controls
            If TypeOf c Is TextBox Then
                If Left(c.Name, 4) = "FRot" Then
                    soma = soma + Nz(c, 0)
                    
                    If Nz(c, 0) > 0 Then qnt = qnt + 1
                End If
            End If
        Next
        
        MsgBox "A média dos valores informados é: " & soma / qnt, vbInformation, "Média"
    End Sub

    ---
    Noobezinho, acredito que o problema não esteja no Round() pois o que está acontecendo é erro de cálculo, e não de arredondamento. O problema deve ser na função Val() mesmo. O que o amigo acha?

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

    Abraço.


    Última edição por CassioFabre em 6/3/2018, 11:45, editado 2 vez(es)


    .................................................................................
    Só não tem código pra morte!

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 68
    Registrado : 28/08/2017

    Re: [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  Anderson Catarino em 6/3/2018, 11:26

    Obrigado CassioFabre funcionou direitinho.
    Obrigado pela disponibilidade Noobezinho, o C1 é a caixa de texto onde mostra o resultado final, e o Round era para arredondar o numero final com uma casa decimal, se (7.5+5.5+2.9+3.9)/4 = 4.95, nesse caso ele até me arredonda para 5, mas testei com 2 casas decimais e está a funcionar direitinho com a sugestão do CassioFabre.

    Abraço
    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 728
    Registrado : 18/01/2013

    Re: [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  CassioFabre em 6/3/2018, 11:46

    Bom dia,

    Agradecemos o retorno, verifique a edição que fiz no post anterior.

    Abraço.


    .................................................................................
    Só não tem código pra morte!

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3632
    Registrado : 29/06/2012

    Re: [Resolvido]Média por vba (codígo só "pega" a parte inteira do numero)

    Mensagem  Noobezinho em 6/3/2018, 11:48

    Que ótimo!

    Valeu o retorno!

    Boa sorte!

      Data/hora atual: 20/10/2018, 00:04