2014-01-15 224 views
1

我有一個通過一系列連接字符串生成的公式。這是更好地與爲例進行了說明:Excel - 將字符串轉換爲公式

打開一個新的工作簿

A1 = 5 

C1 = 5 & "+A1" [A1 is seen as text. C1 will contain "5+A1" ] 

我想E1含有C1的評價爲一個公式的結果在本例中,所以基本上10.

我試圖使用INDIRECT(C1),但它沒有奏效。

更新:它必須使用自定義單元格名稱。因此,如果例如我分配名稱 「了myCell」 至A1,那麼字段C1將包含 「5 +了myCell」

更新2:我的真實數據:

片1,小區Y20包含此:

-0,0000014369849267*Drehzahl^2 + 0,0401449351560780*Drehzahl - 32,5068828005099000 

片2,小區J7包含此:

= 'Sheet 1'!Y20 

片2,小區J8包含此:

= eval(J7) 

片2,小區C7被重命名爲Drezahl

更新3:未爲我工作的公式:

它需要4分定製重命名的單元: 「Drezahl」(值= 3550)Kondtemp( 45)Saugtemp(-45)Schlitten(100)的計算結果必須是約91,17

((((-0,0000014369849267*Drehzahl^2 + 0,0401449351560780*Drehzahl - 32,5068828005099000) + ((8,95609756097562+(18,1/2050)*Drehzahl))*(1/25)*(45-Kondtemp))*((0,0000262088992942*Saugtemp^3 + 0,0050210402289170*Saugtemp^2 + 0,3711985619535020*Saugtemp + 9,9227907759641600)*((0,361075074412964)*(3550/Drehzahl)-0,361075074412964+1))*((((100-50)/(91,4-46,3))*((0,014285714285714*Schlitten^2 - 1,262285714285720*Schlitten + 74,214285714286400)-46,3)+50)-50))/50)+((0,0000063790283394*Drehzahl^2 - 0,0103039106823734*Drehzahl + 2,6771661029208000)*(-0,0002159827213823*Kondtemp^2 - 0,0034865782165998*Kondtemp + 1,5954952175254600))*(((0,000000003885345*Saugtemp^6 + 0,000000666998414*Saugtemp^5 + 0,000042907134551*Saugtemp^4 + 0,001268740583850*Saugtemp^3 + 0,020179866978636*Saugtemp^2 + 0,418860651690801*Saugtemp + 9,465861006018070)*((((7,68293017999336)/(-2050)*(Drehzahl-3550)+1)-1)/(45)*(Saugtemp+45)+1)))*(1/-50*((((100-50)/(91,4-46,3))*((0,014285714285714*Schlitten^2 - 1,262285714285720*Schlitten + 74,214285714286400)-46,3)+50)-100))` 
+0

你有什麼理由爲什麼你要在C1中存儲'5 + A1'作爲TEXT?第一個'5'從哪裏來?它有可能在B'col嗎? – 2014-01-15 09:49:47

+0

是的,這只是一個例子。在我的文件中,文本是從各種來源生成的,並以文本形式輸入。前5只是一個隨機數.. – sharkyenergy

回答

3

你可以非常簡單的用戶定義的函數添加到您的工作簿:

Function eval(str As String) 
    Application.Volatile 
    eval = Evaluate(Evaluate(Replace(str, ",", "."))) 
End Function 

,並調用它在E1這樣的:=eval(C1)

注:

1)我用雙Evaluate的情況下,當不=登錄C1商店,如文本數據:5 & "A1"。如果存儲與=標誌數據:=5 & "A1",你可以使用eval = Evaluate(str)或離開eval = Evaluate(Evaluate(str)) - 它doesen't梅特

2)由於VBA需要.作爲分隔符,我用Replace功能

新的更新:

但是,Evaluate只能操作字符串小於或等於255個字符。 在這種情況下,你可以使用以下UDF:

Public app As Excel.Application 
Public wb As Workbook 

Function getValue(formulaString As String) 
    Application.Volatile 
    Application.DisplayAlerts = False 

    'set default falue to #REF..if we'd get normal value - we'll change getValue to it' 
    getValue = CVErr(xlErrRef) 

    getValue = Evaluate(Evaluate(Replace(formulaString, ",", "."))) 
    If Not IsError(getValue) Then 
    Exit Function 
    End If 

    'if we appear here - second WB is closed...' 
    On Error GoTo ErrHandler 

    If app Is Nothing Then Set app = New Excel.Application 
    If wb Is Nothing Then Set wb = app.Workbooks.Open(ThisWorkbook.FullName) 
    With wb.Sheets(ThisWorkbook.ActiveSheet.Name) 
     With .Range(Application.ThisCell.Address) 
      .FormulaLocal = IIf(Left(formulaString, 1) <> "=", "=" & formulaString, formulaString) 
      .Calculate 
      getValue = .Value 
     End With 
    End With 

ErrHandler: 
    Application.DisplayAlerts = True 

End Function 

和最後一件事:添加以下代碼到ThisWorkbook模塊:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    If Not wb Is Nothing Then wb.Close False 
    If Not app Is Nothing Then app.Quit 
    Set app = Nothing 
    Set wb = Nothing 
End Sub 
+0

謝謝!測試,並將回報 – sharkyenergy

+0

部分工作..只要我在公式中寫入「A1」,工作正常,但如果我使用分配的單元名稱停止工作。更新我的帖子 – sharkyenergy

+0

hm ..它適用於我..我給了'A1'的'test'名稱,並在'C1'中寫下了以下公式:'= 5&「+ test」'。 –

0

我幾乎確切的問題,但我的沒有命名的單元格和少於255個字符。去試試 

Function eval(str As String) 
    Application.Volatile 
    eval = Evaluate(Evaluate(Replace(str, ",", "."))) 
End Function