2016-02-25 18 views
0

我正在尝试构建一个收费来进行数据分析。我想编写一个文本框,它将显示组合我选择的每个单元格的结果的值。例如:单元格A1包含值“2”,单元格B1包含值“3”,单元格C1为= A1 * B1,所以“6”。我想添加一个文本框,当我选择单元格C1时,将显示文本“2 * 3”而不是“A1 * B1”,如同在公式栏中所示。有谁知道如何去做?在文本框中打印方程组件 - excel vba

+1

如何将复杂的公式是什么?你到目前为止尝试过什么? –

+0

该公式不会那么复杂,几乎都是百分比,数据都在同一张工作表中,我创建了一个宏来显示百分比并隐藏值,因为基数非常混乱。其实,我有很多问题,我想过使用“评估公式”函数和打印值,但是我不知道如何将它用在编程语言中。 –

回答

1

您将要面临的挑战是:there is no such thing as a "formula" object in the Excel object model,因为公式是一串基本上是任意长度和构造的字符串,任意级别的嵌套和单元格引用/先例,每个嵌套和单元格可能包含一个公式需要一些递归)或常量等。没有“一般”的方法来解析这些东西,但正如链接的答案所指出的,有一些工具可以做类似的事情。

如果您有特定的个案,您可能会破解某些适用于这些案例的功能,但不会适用于其他公式。使用范围对象的.DirectPrecendents,可以跟踪公式中引用的单元格,并且可以使用一些字符串函数将公式逆向设计为常量表达式,并与操作符重新组合。但是,我自己的测试显示这是充满了问题,因为这些公式将返回DirectPrecedents相同的列表:

=$A1*$B1 

=$A$1*$B$1 

=$A$1*B1 

=A1*B1 

在这种情况下(及其他),先例将成为该范围A1和B1,但这些变体中的每一个都要求您可以在运行时识别每个先例中的行和/或列是否为“绝对”,否则,任何使用字符串函数(如Mid,LeftInstr)的尝试都可能失败或返回误报。

如果你的公式是非常简单,你知道你一直在处理中的引用,每一个都包含常量表达式(而不是其他配方refernces),例如:

= $ A $ 1 * B $ 1 “如果A1包含一个常数,所以不B1

你可以这样做:

Function parseFormula(cl as Range, operator as String) 
Dim arr, i As Long 
Dim ret As String 
ret = "=" 
arr = Split(Mid(cl.Formula, 2), operator) 
' yields an array like {$A$1, $B1} 

For i = 0 To UBound(arr) 
    If (i = 0) Then 
     ret = ret & Range(arr(i)).Value 
    Else 
     ret = ret & operator & Range(arr(i)).Value 
    End If 
Next 

parseFormula = ret 
End Function 

当然,这不会对式混合运营商如工作:

=A1+B1/C1 

也不会对式混合其中常量和引用类似工作:

=65+B2/C1