Your code saves the record (.dirty = false) so there is nothing to update anymore. Which means you can't cancel either. Even if not written that way, moving the focus from a record to the button will save the record if the controls in the record are bound to a table or updatable query. So your canceling of the update event (which should be written for the form if the controls are bound) needs to have the code I wrote before. The code can be used in a button click event if the form controls are NOT bound (or if they are bound to a temporary table from which they are moved to the final table(s) assuming all is well).
HOWEVER there is a piece missing IF there is code afterwards to save a record, but in your case I think there is not (see red below).
Code:
Private Sub WhateverClickEvent() 'use your own sub name; e.g. button click event
Dim ctl As Control
Dim svList As String
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox And ctl.Tag = "Reqd" Then
If IsNullEmpty(ctl) Then
svList = svList & ctl.Controls(0).Caption & vbCrLf 'if Reqd and = "" (or is null) then add the label caption to a list)
End If
End If
Next
If svList <> "" Then
MsgBox "You must supply a value for " & vbCrLf & svList 'if list is not empty, message
EXIT SUB 'IF there is code afterwards that you use to save the records, like running sql statements or queries
End If
End Sub
You can still use this code in the BeforeUpdate event, but you would swap Cancel = True for EXIT SUB if your controls are bound, AND you cannot use the .dirty on button click and expect to cancel a record update. That's why you got the error message.
If you're still stuck after this and want to post a zipped copy of your db, I will take a look if I can open it with 2007 version.
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.