Vamos por partes. Supongamos que tienes una tabla Compras con Id, Cantidad, Producto, Precio. Añádele un campo Cancelada tipo Sí/No y un campo Resto tipo Moneda. Haz un formulario con esa tabla. Y añádele, en el encabezado un cuadro de texto Entrega(donde vas a poner la cantidad que te entrega) y un botón de comando. En las propiedades de este botón en el evento Al hacer clic pon
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Form.Recordset.RecordCount
Resto = Entrega - DSum("precio", "compras", "id<=" & Me.Id & "")
If Resto >= 0 Then
Cancelada = True
End If
DoCmd.GoToRecord , , acNext
Next
Me explico, le digo que vaya al primer registro, que el campo resto es igual a lo que te ha entregado menos la suma de los precios de los registros anteriores, y que si resto es mayor que cero ponga la casilla Cancelada como true. Pongo una imagen del diseño
Al abrirlo, se ve
Entonces, le he puesto que me entrega 210 euros y pulso el botón
Me marca como "pagados" las camperas y el pantalón y hay un resto de 10 euros que como no llega a compensar el tercer registro te la deja en blanco y un resto de -40( que es lo que te debe)
Para que Precio y Resto, que es el de la derecha tomen algún calor, en vista diseño del formulario selecciona ambos campos y pulsas Formato-Formato Condicional-Nueva regla-La expresión es:
Resto>0
Y eliges el color de fondo, el tipo de letra, etc.
Para que todo te funcione mejor, lo que haría sería poner, en el evento Al abrir del formulario
form.recordsource="select * from compras where cancelada=0"
Así te abrira el formulario con aquellos registros que todavía no están pagados