2016-02-25 44 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