Use TryGet pattern for transient values

A number of objects may have extra properties or something where it might not exist for all instances. A good example might be finding Controlsource property on an Access.Control variable:

For Each ctl In Me.Controls
  Debug.Print ctl.ControlSource 'A potential error
Next

Not all controls have a ControlSource property and thus can fail to run. A common approach is to use OERN:

For Each ctl In Me.Controls
  On Error Resume Next
  Debug.Print ctl.ControlSource 'A potential error
  On Error GoTo 0
Next

This will work OK but this can significantly clutter the code, since we have to check whether there was an error. A more realistic example might look like this:

For Each ctl In Me.Controls
  Dim src as String
  On Error Resume Next
  src = ctl.ControlSource 'A potential error
  If Err.Number Then
    src = vbNullString
  End If
  On Error GoTo 0
  If Len(src) Then
    'Do something
  End If
Next

As you see, we’ve added a OERN block, and 2 If blocks just to handle the cases where controls might not have a ControlSource. We can do better by extracting this into a function:

Public Function TryGetControlSource( _
  Target As Access.Control, _
  OutControlSource As String _
) As Boolean
  On Error Resume Next
  OutControlSource = Target.ControlSource
  If Err.Number Then
    OutControlSource = vbNullString
    TryGetControlSource = False
  Else
    TryGetControlSource = True
  End If
  On Error GoTo 0
End Function

Your code then become:

For Each ctl In Me.Controls
  Dim src As String
  If TryGetControlSource(ctl, src) Then
    'Do something
  End If
Next

Which is much more readable and easier to understand. The access to the src is contained within the If TryGetControlSource(...) Then so it’s easy to understand it’s only meant to be used when it’s true.