That is not correct. Refresh is to do with the underlying data, not captions. It also happens automatically - typically 60 seconds as the default set in Options>client settings and is really only relevant in a multi user environment as it reflects changes in the current recordset made by other users.
Refresh differs from requery in that it looks at changes to the current records whereas requery will reapply any criteria and may add or remove records accordingly.
What I meant was that if you did a "for each ctl in forms.controls" type of loop, you would know which control was associated with a label because the .Parent of a label is the control that owns it, whereas the .Parent of some other control is usually the form itself. I can't be certain, but I think most cases of controls are such that they have either a caption or a value but not both. The option group & option button get a bit complex about this, but most other controls do follow that general rule of having one or the other but not both. Controls also exist that have neither a .Value nor a .Caption - e.g. rectangles or lines. So that "for each" loop would do best to verify the control type of the control it was seeing at the moment anyway.