Jorge, no es posible ordenar pasando como el parámetro el valor, por ejemplo, si tengo este script
SELECT tblproductos.idproducto, tblproductos.sinocodigo, tblproductos.codigobarras, tblproductos.numserie, tblproductos.producto
FROM tblproductos ORDER BY 5
Obtengo en Access los registros ordenados por la 5 columna, en este caso producto, la idea fuera pasar lugar el 5 un número aleatorio entre 1 y 5, algo como Int((5 * Rnd) + 1), pero al ejecutar la consulta siempre retorna el mismo valor (al menos en mis pruebas).
Veo que la única forma es crear una tabla temporal con los campos a incluir aleatoriamente y posteriormente llenar una tabla temporal con estos, Le dejo el código vba,
Sub OrdenarRegistrosAleatoriamente()
Dim db As DAO.Database
Dim rsFields As DAO.Recordset
Dim strSQL As String
Dim strRandomField As String
' Crear tabla temporal
strSQL = "CREATE TABLE TempOrden (FieldIndex INT, FieldName TEXT);"
CurrentDb.Execute strSQL
' Agregar los campos deseados a la tabla temporal
strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (1, 'idproducto');"
CurrentDb.Execute strSQL
strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (2, 'sinocodigo');"
CurrentDb.Execute strSQL
strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (3, 'codigobarras');"
CurrentDb.Execute strSQL
strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (4, 'numserie');"
CurrentDb.Execute strSQL
strSQL = "INSERT INTO TempOrden (FieldIndex, FieldName) VALUES (5, 'producto');"
CurrentDb.Execute strSQL
' Obtener un campo aleatorio de la tabla temporal
Set db = CurrentDb()
Set rsFields = db.OpenRecordset("TempOrden")
rsFields.MoveLast
rsFields.MoveFirst
rsFields.Move Int((rsFields.RecordCount - 1) * Rnd)
strRandomField = rsFields.Fields("FieldName").Value
rsFields.Close
Set rsFields = Nothing
Set db = Nothing
' Consulta para obtener los registros ordenados aleatoriamente
strSQL = "SELECT idproducto, sinocodigo, codigobarras, numserie, producto FROM tblproductos ORDER BY " & strRandomField & ";"
CurrentDb.Execute "DELETE FROM temconsulta"
' Ejecutar la consulta y procesar los resultados
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(strSQL)
Do Until rs.EOF()
CurrentDb.Execute "INSERT INTO temconsulta(idproducto,sinocodigo,numserie,producto) VALUES(" & rs!idProducto & "," & rs!sinocodigo & ",'" & rs!numserie & "','" & rs!producto & "')"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
' Eliminar la tabla temporal
strSQL = "DROP TABLE TempOrden;"
CurrentDb.Execute strSQL
End Sub
El resultado de la consulta lo guardo en la tabla temconsulta.
Esto es una idea seguramente hay mas alternativas