Oscar: Ignoro si lo podrás hacer en una Consulta aunque creo que no.
Yo lo haría con un Recordset "Directo" sobre la Tabla, tal como como te escribo a Continuación.
He respetado tus Nombres de Campo, pero a la Tabla le he llamado TblDatos y ha de tener un Campo que sea autonumérico o similar para poder ordenar de modo ASCENDENTE.
Function TablaTblDatos() 'Confecciona Tabla TblDatos
Dim QryDatos As String
Dim RstDatos As DAO.Recordset
Dim NumAnterior As Double, NumActual As Double
Dim RegistroActual As Integer, RegDatos As Integer, FilaNumero As Integer
'Campos Numeracion >> Resta
On Error GoTo TablaTblDatos_TratamientoErrores
'Pongo las Variables a cero
QryDatos = ""
NumAnterior = 0
NumActual = 0
RegistroActual = 0
RegDatos = 0
FilaNumero = 0
'En modo Dynaset el de Escritura
QryDatos = "SELECT * FROM TblDatos ORDER BY NumFila ASC"
Set RstDatos = CurrentDb.OpenRecordset(QryDatos, dbOpenDynaset)
RstDatos.MoveLast
RstDatos.MoveFirst
RegDatos = RstDatos.RecordCount
If Not (RstDatos.EOF And RstDatos.BOF) Then
Do While Not RstDatos.EOF
RegistroActual = RstDatos.AbsolutePosition + 1
'Si el Registro Actual es el Primero no podrá moverse al anterior y dará Error "No hay ningún Registro activo"
If RegistroActual = 1 Then
With RstDatos
.Edit
!Resta = 0
.Update
End With
Else 'Si el registro Actual no es el Primero
RstDatos.MovePrevious
'Tomo el valor del Campo Numeración Anerior
NumAnterior = RstDatos!Numeracion
RstDatos.MoveNext
NumActual = RstDatos!Numeracion
With RstDatos
.Edit
!Resta = NumActual - NumAnterior
.Update
End With
End If
RstDatos.MoveNext
'Si con el MoveNext he llegado al Ultimo Registro salgo: OJO HE DE GRABAR DATOS EN TDatos
RegistroActual = RstDatos.AbsolutePosition + 1
'Llegando al Final del Recordset no podrá mover a la próxima Fila y dará Error.
If RstDatos.AbsolutePosition + 1 = RegDatos Then
With RstDatos
.Edit
!Resta = RstDatos!Numeracion - NumActual
.Update
End With
Exit Do
Else
End If
Loop
Else
MsgBox "Parece extraño pero la Tabla TblDatos está vacía", vbCritical, "RECORDSET VACIO"
End If
'Si está abierto el Recordset RstDatos lo cierro
If Not RstDatos Is Nothing Then
RstDatos.Close
Set RstDatos = Nothing
End If
MsgBox "Se han Efectuado las Restas en la Tabla Indicada", vbInformation, "CALCULOS EFECTUADOS"
TablaTblDatos_Salir:
On Error GoTo 0
Exit Function
TablaTblDatos_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Funcion.: TablaTblDatos de Documento VBA: XxxxYyyyZzzz (" & Err.Description & ")"
Resume TablaTblDatos_Salir
End Function 'TablaTblDatos
Esta Función puede estar en el Modulo asociado al Formulario o en un Modulo standard.
La has de llamar desde donde y cuando quieras, pero para hacer las Pruebas pones un Botón que se llame >> BtnTblDatos y éste Código
Private Sub BtnTblDatos_Click()
Call TablaTblDatos
End Sub
Debes Obtener algo así:
Mis saludos >> Jacinto