Sacar promedio de notas desde una tabla o consulta

Tengo una tabla con 5 columnas para notas, necesito sacar el promedio de las mismas pero que deje de computar cualquier columna en la cual no se halla escrito valor alguno o sea que este vacío por ejemplo se tengo N1, N2 y N3 con valores pero no tengo ni N4 ni N5, que solo me promedie de las 3, si tuviera obligatoriamente las 5 notas el asunto sería fácil porque sumo las 5 y divido para esa cantidad pero cuando no tengo algunas, ahí se forma el problema.

1 Respuesta

Respuesta
2

Puedes hacerlo de varias formas, por ejemplo te comento 2:

1º/ La primera sería creando una expresión en una consulta, o en un cuadro de texto de tu formulario o por código VBA como ésta:

A) En una consulta:

NMedia: (Nz([N1];0)+Nz([N2];0)+Nz([N3];0)+Nz([N4];0)+Nz([N5];0))/(SiInm(EsNulo([N1]);0;1)+SiInm(EsNulo([N2]);0;1)+SiInm(EsNulo([N3]);0;1)+SiInm(EsNulo([N4]);0;1)+SiInm(EsNulo([N5]);0;1))

En un cuadro de texto de un formulario, en su origen de control:

=(Nz([N1];0)+Nz([N2];0)+Nz([N3];0)+Nz([N4];0)+Nz([N5];0))/(SiInm(EsNulo([N1]);0;1)+SiInm(EsNulo([N2]);0;1)+SiInm(EsNulo([N3]);0;1)+SiInm(EsNulo([N4]);0;1)+SiInm(EsNulo([N5]);0;1))

Por código:

Me.Media=(Nz([N1],0)+Nz([N2],0)+Nz([N3],0)+Nz([N4],0)+Nz([N5],0))/(IIF(IsNull([N1]),0,1)+IIF(IsNull([N2]),0,1)+IIF(IsNull([N3]),0,1)+IIF(IsNull([N4]),0,1)+IIF(IsNull([N5]),0,1))

2º/ La segunda (más "profesional") sería crear una función en un módulo VBA y usarla como cualquier función nativa de Access.

Por ejemplo, la función sería:

'---------------------------------------------------------------------------------------
' Procedimiento: fncMedia
' Autor        : Sveinbjorn El Rojo
' Fecha        : 13/02/2019
' Propósito    : Devuelve la media de una matriz de valores pasada como parámetro
'                En función de las necesidades, habrá que cambiar el tipo de datos de
'                entrada y salida
'---------------------------------------------------------------------------------------
Public Function fncMedia(ParamArray Valores()) As Double
    Dim i As Long
    Dim numerador As Double
    Dim divisor As Long
    For i = 0 To UBound(Valores)
         numerador = numerador + Nz(Valores(i))
         divisor = divisor + IIf(IsNull(Valores(i)), 0, 1)
    Next i
    If divisor = 0 Then Exit Function
    fncMedia = numerador / divisor
End Function

Y en una consulta la usarías:

NMedia: fncMedia([N1];[N2];[N3];[N4];[N5])

En el origen de control de un cuadro de texto:

=fncMedia([N1];[N2];[N3];[N4];[N5])

O por código:

Me.Media=fncMedia([N1],[N2],[N3],[N4],[N5])

Te dejo un ejemplo con ambas opciones: http://www.filebig.net/files/4BjkfuANWj 

En la consulta con la expresión, te puse también el campo "Divisor" para que veas que realmente divide por los campos que tienen nota

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas