MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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


3 participantes

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

    avatar
    Anderson Catarino
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Anderson Catarino 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
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Noobezinho 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.





    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.
    CassioFabre
    CassioFabre
    Super Avançado
    Super Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  CassioFabre 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!
    avatar
    Anderson Catarino
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Anderson Catarino 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
    CassioFabre
    CassioFabre
    Super Avançado
    Super Avançado


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  CassioFabre 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
    Noobezinho
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

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

    Mensagem  Noobezinho 6/3/2018, 11:48

    Que ótimo!

    Valeu o retorno!

    Boa sorte!


    .................................................................................
    A pergunta que não quer calar:
    Por quê quando alguém vem pedir ajuda e conforme o caso pedimos
    para enviar parte do projeto, não temos mais continuidade do tópico?  
    Crê que temos bolas de cristal ou está com medo que "roubemos"  a
    idéia/projeto dele?  Twisted Evil
    Se é tão bom assim...


    Ajude a ser ajudado:
    Seja objetivo na dúvida, dê os detalhes do que precisa, sem rodeios.
    Quando anexar teu projeto, diga onde está o problema, ganhamos mais tempo
    sem precisar procurar o mesmo.

    Conteúdo patrocinado


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

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 22/11/2024, 14:21