Having now rained on your parade, here are some thoughts that MIGHT help.
1. When you want to see "previous record" data, there MUST be a way for Access to find what you consider to be the "previous record." Therefore, if you have not allowed for this situation, it is a design flaw. (Based on you not realizing the implications of SET theory, which is eminently forgivable for new Access users, so don't take it too hard.) This is based on the "Old Programmer's Rule" that says "Access can't tell you anything you didn't tell it first." Which means - in practical terms - that if order means something to you, you must give Access the data required to remember and later impose that order. If you have no variable to identify proper order with respect to your data set, you cannot impose the desired order later.
Very simple issue, black and white. Want order? Need ordering variable! No ordering variable? No order!
2. You can SOMETIMES do something like a DLookup in a query where you look for the record that would precede the current one based on some order identifier.
e.g. if you were ordering by date/time fields and meant "previous" to imply the record with the next earlier time than the record in focus, you would choose the record with the maximum date less than the date in focus. Look at the DMax function. Also notice I said "record in focus" not "current record." This is a fine point, but "Current" also implies ordering by connotation. ("Previous" and "Next" imply order by denotation, a stronger definition.)
Anyway, contemplate this little jewel:
DLookup( "[myvalue]", "mytable", "[mytable]![mydate] = #" & CStr( DMax( "[mydate]", "mytable", "[mytable]![mydate] < #" & CStr( [mydate] ) & "# )" ) & "#" )
I don't guarantee that the parentheses are balanced for the functions and I don't guarantee that the syntax is exactly right. Use Access Help on DLookup, DMax, Cstr, and on strings (in functions) in order to get the exact syntax. The idea is to use a query (implied by DMax) to find the largest date less than the date in focus in order to feed a query (implied by DLookup) to find the value for the record having that date. And the CStr converts the date/time variable to a string so you can use the "#" signs as date-string brackets.
IF you are dealing with different dates for records with different qualifiers, you will also have to include the rest of the qualifies in BOTH the DMax and DLookup functions. That syntax gets awfully nasty awfully fast. Which is why folks take up VBA in the first place.
3. Neither DLookup nor DMax will impose locks since they can't change anything... but YOU might impose a lock that could block the DLookup and DMax if YOU are going to modify something. So... the DLookup/DMax approach works best in SELECT queries. Any UPDATE, INSERT, or DELETE query has a chance to self-block if it contains the DLookup/DMax construct. The self-block is not that DMax or DLookup blocks the action query, but that the action query blocks the DMax or DLookup. Which is why when you try this for an action query, the query MUST be set for optimistic locking if at all possible. And if that is a new term for you, look it up in Access Help under query properties.
4. When you get frustrated enough with the messy syntax of trying to "fake" SQL into knowing which record is "previous" - come back and ask the VBA questions you are sure to have. Perhaps I'm being pessimistic, but for a person not really familiar with Access, the VBA path will be simpler and cleaner in the LONG RUN. No telling about short run issues though.