Te propongo 3 métodos distintos, para que elijas el que más te guste. Ahora bien, los tres métodos suponen que el campo "Nº" es único y secuencial, es decir, que en los datos que pones de ejemplo, el valor del campo Nº del legajo 500 que lleva el orden 1 será siempre inferior al que llevará el orden 2.
Método 1:
Crea una consulta sobre la tabla controles, con los campos (como mínimo) Nº y Legajo, y añades una nueva columna con esta expresión:
NControl: DCont("*";"CONTROLES";"Legajo=" & [Legajo] & " AND Nº<" & [Nº])+1
Guardas la consulta, y al ejecutarla, ya tienes "ordenados" los legajos con su número de control (NControl)
Para pasarlo a la tabla, crea una nueva consulta, cambia a vista SQL y pega esta SQL:
UPDATE CONTROLES INNER JOIN Consultav2 ON CONTROLES.Nº = Consultav2.Nº SET CONTROLES.NumControl = [Consultav2].[NControl];
Cuando la guardes y la ejecutes, se te actualizará la tabla con los mismos valores que los que te mostraba la consulta.
Método 2:
Añades un módulo nuevo a tu BD, y en él pegas esta función:
Public Function fncOrdenaLegajos(miLegajo As Long, miNum As Integer) As Integer
Dim rst As Recordset
Dim miSQL As String
miSQL = "SELECT * FROM CONTROLES WHERE Legajo=" & miLegajo & " ORDER BY [Nº]"
Set rst = CurrentDb.OpenRecordset(miSQL)
rst.MoveLast
rst.FindFirst "[Nº]=" & miNum
fncOrdenaLegajos = rst.AbsolutePosition + 1
rst.Close
Set rst = Nothing
End Function
Crea una consulta sobre la tabla controles, con los campos (como mínimo) Nº y Legajo, y añades una nueva columna con esta expresión:
NControl: fncOrdenalegajos([Legajo];[Nº])
Guardas la consulta, y al ejecutarla, ya tienes "ordenados" los legajos con su número de control (NControl)
Para pasarlo a la tabla, crea una nueva consulta, cambia a vista SQL y pega esta SQL:
UPDATE CONTROLES SET CONTROLES.NumControl = fncOrdenaLegajos([Legajo],[Nº]);
Cuando la guardes y la ejecutes, se te actualizará la tabla con los mismos valores que los que te mostraba la consulta.
Método 3:
En un módulo independiente pones este código (requiere tener la función del método 2):
Public Sub Ordena()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CONTROLES")
Do Until rst.EOF
rst.Edit
rst("NumControl") = fncOrdenaLegajos(rst("Legajo"), rst("Nº"))
rst.Update
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub
Con el cursor en cualquier linea entre en Public Sub y el End Sub, pulsas F5 y "voilá": tabla actualizada
Una variación sería ponerlo como código asociado aun botón de un formulario, en cuyo caso en vez de ponerlo en un módulo, lo pones en el evento asociado al botón de esta forma:
Private Sub ..._Click()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CONTROLES")
Do Until rst.EOF
rst.Edit
rst("NumControl") = fncOrdenaLegajos(rst("Legajo"), rst("Nº"))
rst.Update
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub
Un saludo