Prueba esto:
1º/ Inserta un módulo en tu base de datos y pega esta función:
Public Function fncSubOrden(elProyecto As String, elLote As Integer) As Integer
Dim rst As Recordset
Dim miSQL As String
Dim cuenta As Integer
miSQL = "SELECT Proyecto, Lote " & _
"FROM [TProyectos] " & _
"GROUP BY Proyecto, Lote " & _
"HAVING (((Proyecto)='" & elProyecto & "')) " & _
"ORDER BY Proyecto, Lote"
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
rst.FindFirst "[Lote]=" & elLote
fncSubOrden = rst.AbsolutePosition + 1
End Function
He supuesto que la tabla se llama TProyectos, el campo Proyecto es de texto y los campos Lote y SubOrden son numéricos.
2º/ Ahora, para añadir el SubOrden a la tabla, tienes dos opciones:
a) Usar una consulta de datos anexados, que tendría esta SQL:
UPDATE [TProyectos] SET SubOrden = fncSubOrden([Proyecto],[Lote]);
b) En el formulario en el que introduces los datos, programas estos dos códigos en los eventos "Después de actualizar" de los campos Proyecto y Lote:
Private Sub Lote_AfterUpdate()
If Nz(Me.Lote, -1) = -1 Or Nz(Me.Proyecto, "") = "" Then Exit Sub
DoCmd.RunCommand acCmdSaveRecord
Me.SubOrden = fncSubOrden(Me.Proyecto, Me.Lote)
End Sub
Private Sub Proyecto_AfterUpdate()
If Nz(Me.Lote, -1) = -1 Or Nz(Me.Proyecto, "") = "" Then Exit Sub
DoCmd.RunCommand acCmdSaveRecord
Me.SubOrden = fncSubOrden(Me.Proyecto, Me.Lote)
End Sub
3º/ Tendrías otra opción, que sería no guardar en la tabla el campo SubOrden, y obtenerlo en una consulta cada vez que te haga falta. En este caso, la SQL de esta consulta sería así:
SELECT Proyecto, Lote, fncSubOrden([Proyecto],[Lote]) AS SubOrden
FROM [TProyectos];