If you do not want to use ghozy’s suggestion, or you want to trap the resulting message and write your own hander in the event of duplication, then try something like this
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Criteria As String
Dim NumOfRecords As Integer
Criteria = "Date = #" & Format(Val_date, "mm/dd/yy") & "# "
Criteria = Criteria & "AND [Training Course] = '" & Val_TrainingCourse & "' "
Criteria = Criteria & "AND [Training Venue] = '" & Val_TrainingVenue & "' "
Criteria = Criteria & "Trainer = '" & Val_Trainer & "'"
NumOfRecords = DCount("Course ID", "Tbl_courses", Criteria)
If NumOfRecords > 0 Then
MsgBox "Your Message records exist here"
Cancel = True 'this will cancel the update
In this example I have assumed you are using UK date format (needs changing to US format) and that all other fields are text (except the ID!)
Hope this give you some ideas.
One other thought.
I have also written a DB with a course table having, date, provider and venue fields.
All these options are stored in separate table for selection by the user from a combo control, otherwise, when you use code like the above, if it is left to the user to type this venue etc, and they miss type the name, the above will not work!