http://q.hatena.ne.jp/1282264337


この質問のコメントで書いた再帰を使った方法を考えてみる。

Sub test()
    Debug.Print myEval(Range("A2"), Range("B2"), Range("C2"), Worksheets("Sheet2").Range("B1"))
End Sub


Function myEval(rA As Range, rB As Range, rC As Range, r As Range) As String
    Dim r1 As Range
    Dim r2 As Range
    Dim str As String
    
    str = r.Formula
    If str <> "" Then
        If Left(str, 1) = "=" Then
            str = Mid(str, 2)
        End If
    End If
    
    On Error Resume Next
    Set r2 = r.DirectPrecedents
    On Error GoTo 0
    
    If Not r2 Is Nothing Then
        For Each r1 In r2
            Select Case r1.Address
                Case Range("A1").Address
                    str = Replace(str, Replace(r1.Address, "$", ""), rA.Value)
                Case Range("A2").Address
                    str = Replace(str, Replace(r1.Address, "$", ""), rB.Value)
                Case Range("A3").Address
                    str = Replace(str, Replace(r1.Address, "$", ""), rC.Value)
                Case Else
                     str = Replace(str, Replace(r1.Address, "$", ""), myEval(rA, rB, rC, r1))
            End Select
        Next r1
    End If
    
    myEval = Evaluate(str)
End Function


結果から言うとこの方法では良い線まで行ったができない。
Test関数からは動作するのだが、ワークシートからmyEvalを呼びだすとうまく動作しない。
それは、ワークシートから呼びだすとDirectPrecedentsが参照先を返さないことによるようです。
 
まあでも、ここからさらにシート間の参照とか、範囲セルをどうするか、置換の順序による不具合と問題は山積みなんで実用性はまったくないですが。