そして応用として詳細なエラーを出したい場合は
foo()の中をこのように書く。
(手抜き。真面目にやる場合もう少し工夫が必要)

Private Sub foo()
 On Error Resume Next

 hoge()
 If Err.Number Then
   ' ここで新しいnumberとかsourceとかdescriptを生成する
   Err.Raise number, source, description
 End If

 hage()
 If Err.Number Then
   ' 同じくここで新しいnumberとかsourceとかdescriptを生成する
   Err.Raise number, source, description
 End If

End Sub

On Error Resume NextではなくOn Error Gotoを使用してもいいが
On Error Gotoを使う意図しない場所でエラーが発生しても、
同じ場所でトラップしてしまうため、Resume Nextの方がやりやすい。

くれぐれも言っておくが、原則として関数の中でエラーをトラップして
戻り値でエラーを返してはいけない。
特に理由がない限り、エラーをトラップして、また実行時エラーにして
呼び出し元に返す。

この原則を守っていれば、基本のコードから、応用のコードに
スムーズに発展させていくことができる。