Uso no válido de Null. Error '94' en tiempo de ejecución

Tengo un problema con una BBDD sobre pacientes de un hospital en el que me aparece este error.

Hay dos campos PESO y ALTURA que me dan el valor IMC mediante una fórmula. Este es el módulo que encontré en internet y he creado para poder usarla en diferentes campos:

Public Function fntCalculaIMC(dblPeso As Double, intAltura As Integer) As Double
                   fntCalculaIMC = dblPeso / ((intAltura / 100) ^ 2)
End Function

En el campo correspondiente (y también en el form_current para actualizarse solo) he puesto únicamente:

Private Sub IMC_AfterUpdate()
                   Me.IMC.Value = fntCalculaIMC(Me.PESO.Value, Me.ALTURA.Value)
End Sub

En un primer momento ejecuta bien, pero en los cambios de registro ya me salta el error 94 con el consecuente 'Uso no válido de Null'.

Seguramente haya algo básico que se me esté escapando o que no declare bien las variables, o básicamente tenga que añadir algo.

Lo que he ido viendo y que igual os sirvan de ayuda para descartar errores:

-Las variables PESO y ALTURA las entré como 'Simple' antes de encontrar esa fórmula ( y no se si puede ser motivo de error)

-No he declarado como Null en ningún momento la variable (tampoco sé si es relevante)

-¿Necesito poner algún condicional para que me devuelva bien los valores..?

Gracias de antemano y disculpas por el desconocimiento en el lenguaje VB!

Jordi

2 Respuestas

Respuesta
1

Puedes hacer otra cosa: validar si estás o no en un registro nuevo para hacer el cálculo.

Por ejemplo:

Private Sub Form_Current()

                   If Me.NewRecord Then Exit Sub
                   Me.IMC.Value = fntCalculaIMC(Me.PESO.Value, Me.ALTURA.Value)
End Sub

Así, si te mueves a un registro nuevo, no se intenta hacer el cálculo.

Un saludo.


No me termina de funcionar porque no es un registro nuevo en sí, sino un registro incompleto por falta de datos. 

Así, si tengo un paciente registrado pero carece de los datos de PESO y ALTURA es cuando me salta de nuevo el error del NULL

Yo haría lo siguiente:

1º/ Modificar la función:

Public Function fntCalculaIMC(dblPeso As Double, intAltura As Integer) As Double
   If dblPeso=0 Or intAltura=0 then
      fntCalculaIMC = 0
   Else
      fntCalculaIMC = dblPeso / ((intAltura / 100) ^ 2)
   End If
End Function

Así, si alguno de los parámetros es 0, el IMC será 0 (y evitas error al dividir por 0)

2º/ Al llamar a la función, usar Nz para convertir los nulos a 0:

Private Sub PESO_AfterUpdate()
   Me.IMC= fntCalculaIMC(Nz(Me.PESO,0), Nz(Me.ALTURA,0))
End Sub
Private Sub ALTURA_AfterUpdate()
   Me.IMC= fntCalculaIMC(Nz(Me.PESO,0), Nz(Me.ALTURA,0))
End Sub
Private Sub Form_Current()
   Me.IMC= fntCalculaIMC(Nz(Me.PESO,0), Nz(Me.ALTURA,0))
End Sub

Y eliminaría el código que tienes para IMC_AfterUpdate, que no tiene mucho sentido hacer ahí el cálculo.

Un saludo.


¡Gracias! Lo he probado tal y como dices y me desaparece el error completamente. Miraré de ir rellenando los datos y si tuviera cualquier duda derivada de esta consulta lo preguntaré.

Muchas gracias!

Respuesta
3

El error te surge si intentas aplicar la fórmula a un campo que todavía "está vacío", o sea es nulo. Tienes que usar la función Nz que transforma los nulos en ceros. De todas formas, es una opinión mía, no tiene porque ser válida, no necesitas para nada esa función. Si por narices tienes que escribir como último la altura, siempre puedes poner en su evento después de actualizar la formula. Por ejemplo, sin entrar en más detalles

IMC=Peso/(altura/100)^2

O si quieres, pero no lo veo necesario

IMC=nz([peso])/((nz([altura])/100)^2

Entiendo que la función Nz va dentro del código de la Public Function..no?

Lo pruebo y a priori veo que sigue funcionando como antes aunque no me salta siempre el error. Pero me he fijado que si que salta cuando los campos de las variables PESO y ALTURA están vacíos. ¿Debería de marcar allí también la función Nz para las dos variables o marcarlas antes como null?

Como te decía el Excel no es lo mío, pero, por similitud, en Access, en vb, supongamos que tengo un campo Subtotal que lo quiero multiplicar por otro llamado IVA. Vamos a suponer que en un principio ambos están vacíos. Si quiero hacer el producto Subtotal*Iva me va a dar error, porque sus valores son nulos, que es lo que te pasa a tí. Sin embargo, si pongo

Loquesea=nz([subtotal])*nz([iva])

Aunque ambos, o uno sólo sea nulo en loquesea me aparecerá como 0

Loquesea=0*0

En el caso de variables, da exactamente igual, por ejemplo

Dim i as integer

i=Dcount("Nombrecliente","clientes","pelo=""Rubio""") vamos a suponer que no hay ningún cliente que cumpla esa condición, por tanto i sería nulo

Si pongo

loquesea=" & nz(i) & "*[descuento]7Loquesea me saldrá 0.

De todas formas si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Jordi Rabadan, ya que si no sé quien me escribe ni los abro

Entiendo lo que quieres decirme, aunque me cuesta descifrar el como trasladarlo a mi caso.

Aprovecho para mandar el mensaje, gracias!

Te lo mando por email

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas