The difficult I do immediately, the impossible takes a little bit longer.

Function LogChange(lngField As Long, strForm As String, strNotes As String)
'From http://www.access-diva.com/

     Dim strSQL As String

     strSQL = "INSERT INTO tblLog ( lID, lLogDate, lUserID, lNotes, lSystemForm )" & _
               " SELECT " & lngField & " AS ID, Now(), GetUserID(), '" & strNotes & "', '" & strForm & "'"
     CurrentDb.Execute strSQL, dbFailOnError


End Function

Log Field Changes...
VBA
Call LogChange(Me. txtID , " YourFormName ", " New recorded appended to tblYourTable for: " & Me.txtYourField )
Private Sub cboYourField _Enter()
     strOld = Nz(Me. cboYourField .Column(1), "")
End Sub

Private Sub cboYourField _Exit(Cancel As Integer)
     strNew = Nz(Me. cboYourField .Column(1), "")
     Call RecordChange(" Your Field OR a name descriptive of the field ")
End Sub
Private Sub RecordChange(strField As String)
'From http://www.access-diva.com/
     'This first *If Statement* only needs to be added if the field you are using to identify the record is NOT the Primary Key and can be NULL.  If it is NULL
     'no change will be logged.
     If Len( Me.txtID ) = 0 Or Me. txtID = Null Then
      Exit Sub
   End If

     If strOld = strNew Then
       Exit Sub
     Else
       Call LogChange( Me.txtID , " frmYourFormName ", strField & " changed from " & strOld & " to " & strNew)
     End If

       strOld = ""
       strNew = ""
     End Sub
Private Sub txtYourField _Enter()
     strOld = Nz(Me. txtYourField , "")
End Sub

Private Sub txtYourField _Exit(Cancel As Integer)
     strNew = Nz(Me. txtYourField , "")
     Call RecordChange(" Your Field OR a name descriptive of the field ")
End Sub
While I tend to use Allen Browne's Audit Trail for most databases, sometimes I come across a situation where I need something a little different.  This is for those situations...
2.  Copy the below into a Module, remember not to name the Module the same as the Function, and save.  I keep it in my modUtilities Module which is placed in my Model Database.
3.  Go the Forms VB Editor that contains the fields you want to log and copy/paste the below into the VB Editor.  (Pay attention to the * BLUE * fields as those are to be changed to reflect the names of fields on your form!)
4.  In the On_Enter and On_Exit Event Procedures of your fields place...
For a TEXT BOX...
For a COMBO BOX that has the Bound Column set to 0 (zero)...
DoCmd.RunCommand acCmdUndo
Call LogChange(Me. cboID .Column(1), " frmYourForm ", " Changes were UNDONE by user ")
If Not rstMatched.EOF And Not rstMatched.BOF Then
     rstMatched.MoveFirst
     Do Until rstMatched.EOF
       Call LogChange(rstMatched![ ID ], " frmYourForm ", " Your Message Goes Here ")
     rstMatched.MoveNext
Loop
End If
You can also use this on the GotFocus and LostFocus of your field(s)!
Other ways in which you can use LogChange()...

a.  Records UNDONE by User...

b. A record that has been newly appended to a table...
c.  A group of records newly appeneded to a table...
Public Function GetUserID() As String
     GetUserID = Environ("Username")
End Function
1.  Create tblLog...

Can be either TEXT or NUMERIC depending on the Data Type of the ID's you want to store.

aaaaaaaaaaaaiii