Duda sobre error en Macro Access 2003

Tengo una Macro en Access 2003 que al abrir un subformulario que trabaja sobre una tabla relacionada a la principal, se mueve al registro anterior, va a un determinado campo, toma su valor y regresa al último registro para asignar el valor tomado a otro campo. El problema se me presenta cuando en la tabla que trabaja con ese subformulario está vacía, no hay registros. Por ende Access me da un mensaje de error, y tras ello sale una ventana ofreciendo datos del N° de error y la opción de detener la Macro. Estimo que, luego de mandar a posicionarse en el registro anterior, agregando una condición "SI" podría configurar que si da error detenga automáticamente la Macro; no debe ser muy complicado, pero no se cómo hacerlo. Podrían orientarme

1 respuesta

Respuesta
1

En el evento en el que ejecutas la macro, puedes crear un procedimiento de evento y poner, por ejemplo

If IsNull(DLast("novale", "dos")) Then
MsgBox "No hay registros anteriores"
Else
DoCmd.RunMacro "macro2"
End If

Siendo Novale el campo de la tabla origen del subformulario y la tabla se llama Dos.

Le estás diciendo, que si el último registro es nulo, que te aparezca el mensaje advirtiéndote, y en caso contrario que ejecute la macro2

Desde ya muchas gracias por tu respuesta Icue! Probé el código que mencionaste, pero el depurador me da error. Primero señalaba en color amarilla la línea del If. Los nombres de la Tabla y del campo en DLast van entre comillas o entre corchetes? Los ubiqué entre comillas como lo indiscaste y luego el depurador posiciona la línea de error amarilla en DoCmd.RunMacro "macro2". Probé poner el nombre de la macro entre paréntesis sin comillas y luego con comillas, pero el error persiste. 

Me sorprende porque antes de escribir lo pruebo y a mí me funcionaba perfectamente. Si te perece, mándame un mensaje a [email protected] y te mando un ejemplo. Si lo haces, en el Asunto del mensaje pon tu Alias Víctor Canosa, ya que si no lo pone no abro los mensajes.

¡Gracias! 

Implementé primero la opción que me indicaste, pero surgía un problema: el código abría la Tabla CargasdeCombustible, iba al último registro, leía el valor del campo KMActual y lo pegaba en el nuevo registro en el campo KManterior. Pero como la tabla principal tiene muchos vehículos, necesitaba una solución que identificara el kilometraje anterior de cada  vehículo en particular. Entonces miré el link y adapté una solución publicada por Neckkito y anda perfecto, desaparecieron los mensajes de error. Como no soy nada avezado en los códigos (sólo me limito a seguir la lógica) me gustaría -si tienes tiempo y ganas- que revises el código para ver si es correcto (creo que hay una opción o sentencia que está demás)

Private Sub FECHA_AfterUpdate()
   Dim regAnterior As Variant 

'Si no se ha escrito ninguna fecha salimos sin hacer nada
If IsNull(Me.FECHA.Value) Then
MsgBox "Debe indicar una FECHA", vbInformation, "SIN DATOS"
Exit Sub
End If
'Si no hay PATENTE avisamos y salimos
If IsNull(Me.PATENTE.Value) Then
MsgBox "Debe indicar una Patente", vbInformation, "SIN DATOS"
Exit Sub
End If

'Buscamos el valor del campo KMactual del registro anterior; esto es, del registro
'que tiene el Id más alto excluyendo el del registro en el que estamos
'Aquí incluimos el efecto de la patente, en la parte del filtro
regAnterior = Nz(DMax("KMActual", "CargasdeCombustible", "PATENTE='" & Me.PATENTE.Value & "' AND Id<" & Me.id.Value), 0)

'Si es el primer registro de esa patente la función Nz() hace que regAnterior tome el
'valor 0. Eso significa que estamos en el primer registro

If regAnterior = 0 Then
'Escribimos el valor en el campo [KManterior]
Me.KManterior.Value = regAnterior
Else 'En caso contrario controlamos que todo sea correcto
If Me.KManterior.Value < regAnterior Then 'El Kilometraje introducido es menor que el del registro anterior
MsgBox "El Kilometraje no es correcto, dado que es inferior al último registrado" _
, vbExclamation, "INCORRECTO"
Me.KManterior.Value = Null
Exit Sub
Else
Me.KManterior.Value = regAnterior
End If
End If
End Sub

La parte que me parece que está demás es:

Else 'En caso contrario controlamos que todo sea correcto
If Me.KManterior.Value < regAnterior Then 'El Kilometraje introducido es menor que el del registro anterior

Ya que difícilmente el kilometraje actual leído del registro anterior y ahora copiado en el registro actual sea menor.

Pero bueno, lo que importa es que funciona.

Mil gracias nuevamente!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas