set db = currentdb is a dao call. Make sure you have your dao object library referenced. It's default in A97, but not in A2K. Check your references with a module open under tools|references
As long as the record hasn't been saved already by some other action, you can use the Undo command (me!undo) before closing the form. This restores the 'oldvalues' to the controls.
Me.undo
docmd.close
Chances are one of your fields in the me!...= statements after the BOF check are returning a null. If so, you cannot perform calculations with a null. Do some testing to see. Then perhaps use the Nz function to protect against nulls.
Check your record lock option under Tools | Options | Advanced. You may have All Records selected. If so, try Edited Record. However, if your form is 'dirty' then that record will be locked. If that's the case, try saving the record first.
Close the database then look to see if the record locking file (databasename.ldb) exists in the same directory as your database. If it does, delete it. Sometimes if you crash out of Access it leaves the ldb hanging and can lock you out. It is supposed to delete automatically when no users...
For Access 2000 users, you must have Borlands BDE or use the MS DAO 3.6 Object Library to access dBase files. A97 uses DAO. By default, A2K uses ADO and does not reference DAO. The ADO library requires the BDE. There are several MS aticles in KB about this. Search under Access 2000 for dBase.