■
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が参照先を返さないことによるようです。
まあでも、ここからさらにシート間の参照とか、範囲セルをどうするか、置換の順序による不具合と問題は山積みなんで実用性はまったくないですが。