You can pass just about any valid variable or object to a function AFAIK. I have passed forms, controls, recordsets, worksheets, workbooks, etc.
For repetitive tasks, I try to write functions in standard modules that can be used anywhere in the project. If your validation is simply Null or "" then that's fairly simple. If you require quantifiable validation, then I'd try to pre-visualize what that will look like and create the function accordingly, or create as few as possible that will do all those tasks. This overly simplified example might look like
Code:
Function ValidateEntry (ctl as Control, var as Variant) As Boolean
If ctl >= var Then ValidateEntry = True
End Function
and the call might be (when the control contains 9)
Code:
If Not ValidateEntry(Me.txtQty,10) Then 'pass the control and test - assume the goal is to ensure the control value >= 10
Cancel= True (because the function returns false
End If
Some might wonder why I wrote a variant. Trying to illustrate that such a declaration could handle text, numbers, nulls or even objects, making the function fit a wide variation of supposedly identified validation tasks.
For me, the issue of validation can be quite complex or simple. The fact that (as I mentioned) you can pass so many things to a function makes it a very powerful tool. While I'm at it, your multi-use function might also make use of the Optional keyword. For example, if you find out that altogether you sometimes want to check 2 aspects and sometimes 3, you might make the occasional one optional and either pass it or don't.
If I understand this intent
is a clean way to pass references (pointers) of a form's fields to the function such that the function could manipulate them
I'd say pass the whole form and alter its controls, or pass a recordset, update it in the function and return the recordset.