Whatever the reason, I'll assume WhiteEvents (as you posted) is really WithEvents since you say the code works if you open the form directly. Perhaps all you need now is the syntax for referring to subform controls and events
referencing CONTROLS on subform:
Code:
[Forms]![Main form name]![subform control name].[Form]![control name on subform]
e.g.
[Forms]![frmNP]![subNPfrm].[Form]![txtNPno]
frmNP is main form name
subNPfrm is name of subform control on frmNP
txtNPno is the textbox control name
referencing subform PROPERTY (e.g. recordset property such as Recordcount):
Code:
Forms("MainFormName").Controls("subformControlName").Form.Recordset.Recordcount
e.g. Forms("frmWhoUsesVendor").Controls("subWhoUsesVendor").Form.Recordsource
or perhaps
Code:
Forms!frmWhoUsesVendor")!subWhoUsesVendor.Form!Recordsource
I found that I had issues with the latter, so I used the long syntax and it worked. Perhaps Recordsource isn't a valid reference to the Form keyword/object.
NOTE: subformControlName DOES NOT REFER TO THE SUBFORM NAME ALTHOUGH IT MAY BE THE SAME.
The above does not apply when navigation form is used. You also have to understand that subforms load before a main form, which might actually be your problem.
EDIT - have to admit I've never taken your approach. Would have to research to see why, outside of maybe creating an error handling class. There must be better reasons than that? As for that example, one could simply write a public function and call it from anywhere in the project without having to make it a class, so that's why that example seems like a poor reason for creating the class. Or is it to make the class available to any code project?