First, split the database and put the back end on the network and give each user a copy of the front end.
You can use Access security, but you will not get row level security from it. Perhaps you can split the data into 5 or so tables and give each user access just to their table. Then compile the 5 or so tables for reports?
Alternatively, you can create the front end so that the users are not connected to the back end, and when they open their front end based on their credentials (you maintain them in a user table) they get only their data pulled.
The way you maintain "their data" is to put a column in the table called WhoCreated. Then put this in a module:
sUser = (Environ$("Username"))
Then on the Before Insert event of the data entry form, put this code:
Me.WhoCreated = sUser()
This will mark each record as belonging to a particular user. If someone else is entering data, and the users are updating it, then you can create a table that associates the username with the geographic region and pull records based on that association.
If you use sUser(), the users will not even have to log in. Just check this info on the On Load event of the main form, and then pull disconnected data based on the value and association.
When the user updates a record, just pass it programatically to the back end tables.
Also, create a reporting front end that has a live connection to the back end for compiling data.
All sorts of ways to do this. Need more?