I prefer duplicating the layout of the live tables and placing the archived tables in a separate database. Note that the names of the archived tables are the same name as the live tables.
On the main edit screen and the report criteria screen, the user is allowed to press a button to view the archived data (I do it via the menubar). The button says "View Archived Data". Upon pressing it, the button label changes to "View Live Data" and all controls on the main edit form are locked and the words "Archive Data (Read Only)" are displayed on the form so the user knows what set of data they are looking at. In addition, the tables are relinked to the archived database. When the user selects "View Live Data", the controls are enabled, "Archive Data..." label becomes invisible, and the tables are relinked to the live database.
This concept works great, because you can use the same reports and forms to view the live data as well as the archived data.
There's one gotcha. When you open the forms (main edit form, report critera form, etc), you need to check to see which database you're linked to (live or archived). I prefer to assume that the tables are always linked to the live database. Therefore, upon closing the form, if it's linked to the archived database, I relink it to the live database. That way, any other forms that will be opened will be pointing to the live database. Note that you should still check, upon opening a form, as to which database the tables are linked to.
Here's the code:
Private Sub cmdViewArchive_Click()
Dim strDatabase As String
If (InStr(cmdViewArchive.Caption, "Archive"

) Then
strDatabase = "C:\NameOfArchiveDatabase.mdb"
cmdViewArchive.Caption = "View Live Data"
' DISABLE CONTROLS HERE
' MAKE VISIBLE "Archived Data (Read Only)"
Else
strDatabase = "c:\NameofLiveDatabase.mdb"
cmdViewArchive.Caption = "View Archived Database"
' ENABLE CONTROLS HERE
' MAKE INVISIBLE "Archived Data (Read Only)"
End If
Call LinkTable(strDatabase, "All"
End Sub
This is the function that relinks. You pass it the path and name of the database you want to link to and the names of the tables you want to relink (separated by commas). If you want to link all of the tables, simply pass the string "All".
Function LinkTable(strLinkToDBname As String, _
ParamArray varTblName() As Variant)
'********************************
'* Declaration Specifications *
'********************************
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim i As Integer
Set dbs = CurrentDb
'***********************
'* Relink the tables *
'***********************
If (varTblName(0) = "All"

Then
For Each tdf In dbs.TableDefs
If (Left$(tdf.Name, 4) <> "MSys"

And (Left$(tdf.Name, 4) <> "USys"

And (Left$(tdf.Name, 1) <> "~"

Then
tdf.Connect = ";DATABASE=" & strLinkToDBname
tdf.RefreshLink
End If
Next
Else
For i = 0 To UBound(varTblName)
Set tdf = dbs.TableDefs(CStr(varTblName(i)))
tdf.Connect = ";DATABASE=" & strLinkToDBname
tdf.RefreshLink
Next i
End If
'********************
'* Exit Procedure *
'********************
ExitProcedure:
Exit Function
'****************************
'* Error Recovery Section *
'****************************
ErrHandler:
MsgBox Err.Description, vbExclamation
Resume ExitProcedure
End Function