2013-12-12 44 views
1

我正在使用公式在另一个单元格中显示单元格公式。显示单元格的公式,但是数值不是引用

我想在此公式中显示每个引用的值,而不是引用。

例:

= $ R $ 16 + R19 *($ T $ 15- $ R $ 16)

希望它是

= 3 + 2 *(4-2)

功能我现在使用的显示公式,因为它是

Function GetFormula(Cell As Range) As String 
    GetFormula = Cell.Formula 
End Function 
+0

不知道如何做到这一点,但只是想澄清一下,你将如何处理诸如1个单元或volatile函数的范围问题? – gtwebb

+0

该公式是否仅包含来自同一工作表的单个单元格引用? –

+0

是的,范围可能会让它很难,但说它只是单细胞参考。 –

回答

2

这里是一个可以处理情况下,像

=B1+C1-D1/E1 
=$B$1+C1*($B$1-$D$1) 
=B1+C1-(D1/E1) 
=B1+C1-(D1/E1) 
=$B$1*C1*($B$1/$D$1) 

假设一个很简单的例子:

  1. 比方说,以上公式在单元格A1到A5中
  2. 所有单元格都在同一个工作表中
  3. 没有SUM,Vlookup等工作表函数
  4. 没有错误处理完成。假设你会照顾它

示例工作

enter image description here

代码

Sub Sample() 
    Dim i As Long 
    For i = 1 To 5 
     Debug.Print ConvertToValues(Range("A" & i)) 
    Next i 
End Sub 

Function ConvertToValues(rng As Range) 
    Dim sTmp As String, sOpr As String, sOrig As String 
    Dim s As String, v As String 
    Dim MyAr 
    Dim i As Long 

    sOpr = "+,/,-,*,&,(,),{,},[,]" 

    MyAr = Split(sOpr, ",") 

    sTmp = Replace(rng.Formula, "$", "") 
    sOrig = sTmp 

    For i = LBound(MyAr) To UBound(MyAr) 
     sTmp = Replace(sTmp, MyAr(i), "SIDROUT") 
    Next i 

    MyAr = Split(sTmp, "SIDROUT") 

    For i = LBound(MyAr) To UBound(MyAr) 
     s = MyAr(i) 

     If Len(Trim(s)) <> 0 Then 
      v = Range(s).Value 
      sOrig = Replace(sOrig, s, v) 
     End If 
    Next i 

    If sOrig <> "" Then _ 
    ConvertToValues = "=" & sOrig 
End Function 

输出

enter image description here

注意

让我知道,如果上面的代码在特定的情况下失败,我会更新的代码。

+0

不错!在RL中,“SIDROUT”将是我的代码中的一个变量或常量。 – Juliusz

+0

'SIDROUT'在这里是一个分隔符。 –

+0

我知道。这就是为什么我会有一个名为“tempDelimiter”的变种。两个原因:不言自明的代码,不太容易出现错字错误。 – Juliusz

相关问题