En primer lugar tendrás que crearte una función personalizada que te haga ese cálculo, y en segundo lugar, hacer el cálculo en una consulta. Te explico paso a paso:
1º/ Inserta un módulo nuevo en tu BD, y le pegas esta función:
Public Function fncCalculo(elDato As String, laFecha As Date) As String
Dim rst As Recordset
Dim miSQL As String
Dim valor As Double, valorPrev As Double
fncCalculo = ""
miSQL = "SELECT Dato, Fecha, Valor " _
& "FROM [T-Isatis] " _
& "WHERE Dato='" & elDato & "' AND Fecha<=#" & CDate(laFecha) & "# " _
& "ORDER BY Fecha"
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
'Si no devuelve valores
If rst.RecordCount = 0 Then GoTo Salida
'Si es el primer registro
rst.MoveLast
If rst.AbsolutePosition = 0 Then GoTo Salida
'Si no
valor = rst("Valor")
rst.MovePrevious
valorPrev = rst("Valor")
'Realizas el cálculo
fncCalculo = Log(valorPrev / valor)
Salida:
rst.Close
Set rst = Nothing
End Function
2º/ Creas una consulta sobre tu tabla (campos Datos,Fecha y Valor), ordenando los registros por el campo Dato y el campo Fecha, para que te queden por orden.
3º/ Añades un nuevo campo calculado a tu consulta, Resultado, con esta expresión:
Resultado: fncCalculo([Dato];[Fecha])
Comentarios:
1º/ La función devuelve un valor de tipo texto (Public Function fncCalculo...) As String) para que los registros que no tengan fecha anterior te queden en blanco. Si prefieres que te devuelva un valor numérico, cambia "As String" por "As Double", y elimina la linea fncCalculo=""
2º/ En la función tendrás que cambiar los nombres de la tabla y los campos, tanto en la SQL como en rst("nombrecampo")
Te subo un mini-ejemplo para que la veas en funcionamiento.