but it seems the class of a sub form is not directly accessible
Of course it is not accessible this way. No properties or methods can be referenced by the name of the class . You can never reference any object by its class name (Access magic that makes it look like you can, because it instantiates a form or report behind the scenes)(you can in vb.net where you have shared methods).
It seems that the concept you are unfamiliar with is Scope.
Also this has nothing to do with scope. It has to do with referencing instantiated objects, and not referencing by class name. Also some magic peculiar to Access form objects when referencing by class name.
Think about it. Imagine you built a form and put three of the same subforms on it. If you could reference by name, which one would be returned? That is why the only way to get a reference to it is through the control that contains it.
When a form is instantiated a pointer to that form is added to the forms collection. No reference is ever added for forms instantiated as subforms. So you cannot get it out of the forms collection either. Again think about. What if you had the form loaded three times as a subform? What name would you give each one?
Another thing is you need to remember is that in the project explorer
Form_YourFormName
Is the name of the form's class. That is not the name of an instantiated object. So what if you had a custom class "MyCustomClass". You would never be able to reference a property or method by the class name
MyCustomClass.oFileWatcher
You would have to instantiate an instance of my custom class
Same here with a form class
Now here is the magic, of why this even kind of sort of seems like it works. With access form's and reports when you reference a method or property by the class name, it actually instantiates an instance and loads this instance with the property visible set to false. This is why you can actually return property values from what appears to be a closed form. In truth it is open and invisible.
You can test this simply
If I did not make it visible it would have gone out of scope once the procedure ended.
So even if Form_Drop_Email was a form and not a subform, and you did this
form_Drop_Email.ofilewatcher
If Drop_Email was not already loaded this would cause instantiate and instance of form Drop_Email to load hidden, and then return a reference to that ofilewathcer.
If Drop_Email is already loaded then it will not load another instance and refer to the loaded instance and return oFileWatcher.
If you have form_Drop_Email instantiated as a subform and you do
form_Drop_Email.ofilewatcher
It does not know that there is a instance instantiated because it is a subform. Again this makes sense. So it opens a new instance of Form_Drop_Email hidden and returns a reference to that forms ofilewathcer. Not the one you thought.